1 votos

Registro de los rendimientos diarios de múltiples valores para múltiples periodos de tiempo en R

Tengo un conjunto de datos que contiene los precios de cierre diarios de 5413 empresas desde 2000 hasta 2014. Quiero calcular los rendimientos diarios de las acciones según las fechas como log(Precio hoy/Precio ayer). Ilustro el conjunto de datos como sigue:

Date       A G L    ABA    ABB ABBEY 
2000-1-3    NA      NA      NA  NA
2000-1-4    79.5    325     NA  961  
2000-1-5    79.5    322.5   NA  945
2000-1-6    79.5    327.5   NA  952
2000-1-7    NA      327.5   NA  941  
2000-1-10   79.5    327.5   NA  946
2000-1-11   79.5    327.5   NA  888

Cómo se puede calcular la rentabilidad del registro diario y, además, abordar la NA. Mi período de muestra es de 2000 a 2014, por lo que hay algunas empresas que cotizan en el año 2001, por lo que, para todo el año 2000 tienen NA, ¿cómo debe manejarse esto. Su ayuda es muy apreciada.

3voto

kedar Puntos 138

Bueno, no fue fácil porque no mencionaste cómo están formateados tus datos. Yo creo mi propio data.frame() basándose en los datos que ha proporcionado. Puedes omitir esta parte si tu data.frame está listo. Aquí está el código que usé para crear un dataframe:

> #given dates
> dates=c("2000-1-3","2000-1-4","2000-1-5","2000-1-6","2000-1-7","2000-1-10","2000-1-11")
> #formating from string to dates
> newdates=as.Date(dates,"%Y-%m-%d")
> #given stock prices
> stock1prices=c("NA","79.5","79.5","79.5","NA","79.5", "79.5")
> stock2prices=c("NA", "325", "322.5", "327.5", "327.5", "327.5", "327.5")
> stock3prices=c("NA","NA","NA","NA","NA","NA","NA")
> stock4prices=c("NA","961","945","952","941","946","888")
> #NewStockPrces - converting from string to numbers
> nsp1=as.numeric(stock1prices)
> nsp2=as.numeric(stock2prices)
> nsp3=as.numeric(stock3prices)
> nsp4=as.numeric(stock4prices)
> #creating dataframe of prices
> prices=data.frame(newdates,nsp1,nsp2,nsp3,nsp4)
> prices
    newdates nsp1  nsp2 nsp3 nsp4
1 2000-01-03   NA    NA   NA   NA
2 2000-01-04 79.5 325.0   NA  961
3 2000-01-05 79.5 322.5   NA  945
4 2000-01-06 79.5 327.5   NA  952
5 2000-01-07   NA 327.5   NA  941
6 2000-01-10 79.5 327.5   NA  946
7 2000-01-11 79.5 327.5   NA  888

Sólo había 4 acciones, así que utilicé un método muy sencillo para crear mi marco de datos precios . Esto es lo más importante para ti.

logs=data.frame(
+   cbind.data.frame(
+     newdates[-1],
+     diff(as.matrix(log(prices[,-1])))
+     )
+   )
> logs
  newdates..1. nsp1         nsp2 nsp3         nsp4
1   2000-01-04   NA           NA   NA           NA
2   2000-01-05    0 -0.007722046   NA -0.016789481
3   2000-01-06    0  0.015384919   NA  0.007380107
4   2000-01-07   NA  0.000000000   NA -0.011621895
5   2000-01-10   NA  0.000000000   NA  0.005299429
6   2000-01-11    0  0.000000000   NA -0.063270826

Para aclarar lo que ocurre en este código, analicémoslo de dentro a fuera:

Paso 1: Cálculo de los rendimientos logarítmicos

  • Usted sabe que log(a/b) = log(a)-log(b) , por lo que podemos calcular diferencias de logaritmos. Función diff(x,lag=1) calcula diferencias con un retardo determinado. Aquí es lag=1 por lo que da las primeras diferencias.
  • Nuestro x son los precios en el marco de datos. Elija entre un data.frame todas las columnas sin la primera (hay fechas) utilizamos prices[,-1] .
  • Necesitamos logaritmos, así que log(prices[,-1])
  • Función diff() trabaja con vectores o matrices, por lo que debemos tratar los logaritmos calculados como una matriz, por lo tanto `as.matrix(log(precios[,-1]))
  • Ahora podemos utilizar diff() con lag=1 Así que diff(as.matrix(log(prices[,-1])))

Paso 2: Creación de un marco de datos de registros y fechas

  • No podemos usar sólo cbind() . En primer lugar, porque las longitudes son diferentes (las devoluciones son más cortas en 1 registro). Tenemos que eliminar la primera fecha, por lo que newdates[-1]

  • En segundo lugar, utilizando cbind() las fechas se transformarán en valores numéricos como 160027 u otros.
    Aquí tenemos que utilizar cbind.data.frame(x,y) como se ve arriba.

  • Ahora los datos están listos y podemos crear usar un data.frame() y nombrarlo como registros así logs=data.frame(...) como en el caso anterior.

Una vez más, no sé cómo es tu base de datos, así que no puedo darte una solución exacta. Lo más importante es utilizar diff(log(x)) para calcular fácilmente los rendimientos logarítmicos.

Finanhelp.com

FinanHelp es una comunidad para personas con conocimientos de economía y finanzas, o quiere aprender. Puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X