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.