2012-01-04 19 views
52

Tengo una trama de datos con los siguientes datos:trama de datos de convertir con columna de fecha de series temporales

>PRICE 
     DATE CLOSE 
1 20070103 54.700 
2 20070104 54.770 
3 20070105 55.120 
4 20070108 54.870 
5 20070109 54.860 
6 20070110 54.270 
7 20070111 54.770 
8 20070112 55.360 
9 20070115 55.760 
... 

Como se puede ver mi columna FECHA representa una fecha (AAAAMMDD) y mi columna representa CERRAR precios.

Ahora tengo que calcular CalmarRatio, del paquete PerformanceAnalytics.

Soy nuevo en R, así que no puedo entender todo, pero de lo que he buscado en Google hasta el momento en que veo que el parámetro R para esa función necesita ser un objeto similar a una serie de tiempo.

¿Hay alguna manera de convertir mi matriz a un objeto de serie temporal dado que puede que no haya datos para cada fecha en un período (solo para los que especifico)?

Respuesta

46

Su columna DATE puede representar una fecha, pero en realidad es un carácter, un factor, un número entero o un vector numérico.

En primer lugar, debe convertir la columna DATE en un objeto Date. A continuación, puede crear un objeto xts a partir de las columnas CLOSE y DATE de su PRICE data.frame. Finalmente, puede usar el objeto xts para calcular devoluciones y la proporción de Calmar.

PRICE <- structure(list(
    DATE = c(20070103L, 20070104L, 20070105L, 20070108L, 20070109L, 
      20070110L, 20070111L, 20070112L, 20070115L), 
    CLOSE = c(54.7, 54.77, 55.12, 54.87, 54.86, 54.27, 54.77, 55.36, 55.76)), 
    .Names = c("DATE", "CLOSE"), class = "data.frame", 
    row.names = c("1", "2", "3", "4", "5", "6", "7", "8", "9")) 

library(PerformanceAnalytics) # loads/attaches xts 
# Convert DATE to Date class 
PRICE$DATE <- as.Date(as.character(PRICE$DATE),format="%Y%m%d") 
# create xts object 
x <- xts(PRICE$CLOSE,PRICE$DATE) 
CalmarRatio(Return.calculate(x)) 
#     [,1] 
# Calmar Ratio 52.82026 
+13

para el principiante: el uso de 'xts' requiere cargar su biblioteca en primer lugar, con' require ('') 'XTS – Jealie

+0

@Jealie: Aunque es verdad, el PO estaba preguntando por la creación de una objeto para usar con una función PerformanceAnalytics. PerformanceAnalytics depende de xts, por lo que es probable que xts ya se haya cargado. –

13

La mayoría de las personas consideran que trabajar con la clase de series temporales es un gran problema. Debes considerar usar la clase de zoo del paquete zoo. No se quejará de los tiempos perdidos, solo de los duplicados. Las funciones de PerformanceAnalytics casi seguramente van a esperar 'zoo' o su clase descendiente 'xts'.

pricez <- read.zoo(text=" DATE CLOSE 
1 20070103 54.700 
2 20070104 54.770 
3 20070105 55.120 
4 20070108 54.870 
5 20070109 54.860 
6 20070110 54.270 
7 20070111 54.770 
8 20070112 55.360 
9 20070115 55.760 
") 
index(pricez) <- as.Date(as.character(index(pricez)), format="%Y%m%d") 
pricez 
2007-01-03 2007-01-04 2007-01-05 2007-01-08 2007-01-09 2007-01-10 2007-01-11 2007-01-12 2007-01-15 
    54.70  54.77  55.12  54.87  54.86  54.27  54.77  55.36  55.76 
+4

También tenga en cuenta que 'read.zoo' puede establecer el índice. Esta variante funciona: 'read.zoo (PRICE, format ="% Y% m% d ")' suponiendo que 'PRICE' es un marco de datos (en lugar de una matriz o matriz) con dos columnas numéricas y esta también funciona: 'read.zoo (text =" ... same.as.above ... ", header = TRUE, format ="% Y% m% d ")' –

+0

Es muy bueno que usted y Achim hayan agregado el as. coerción de carácter antes del día. Las primeras veces recibí NA porque as.Date (20070103, format = "% Y% m% d") no hace la coerción necesaria. Otra instancia más de las muchas cosas que estoy en deuda contigo. –

+0

Sí, eso es correcto. Necesitas una versión suficientemente reciente del zoo para que funcione. La versión en CRAN debería estar bien. –

2

Una solución alternativa es utilizar el paquete tidyquant, que permite la funcionalidad de los paquetes financieros, incluyendo la funcionalidad de series de tiempo, para ser utilizado con tramas de datos. Los siguientes ejemplos muestran cómo puede obtener la relación de Calmar para múltiples activos. El tidyquant vignettes entra en más detalles sobre cómo usar el paquete.


library(tidyquant) 
# Get prices 
price_tbl <- c("FB", "AMZN", "NFLX", "GOOG") %>% 
    tq_get(get = "stock.prices", 
      from = "2010-01-01", 
      to = "2016-12-31") 
price_tbl 
#> # A tibble: 6,449 × 8 
#> symbol  date open high low close volume adjusted 
#>  <chr>  <date> <dbl> <dbl> <dbl> <dbl>  <dbl> <dbl> 
#> 1  FB 2012-05-18 42.05 45.00 38.00 38.23 573576400 38.23 
#> 2  FB 2012-05-21 36.53 36.66 33.00 34.03 168192700 34.03 
#> 3  FB 2012-05-22 32.61 33.59 30.94 31.00 101786600 31.00 
#> 4  FB 2012-05-23 31.37 32.50 31.36 32.00 73600000 32.00 
#> 5  FB 2012-05-24 32.95 33.21 31.77 33.03 50237200 33.03 
#> 6  FB 2012-05-25 32.90 32.95 31.11 31.91 37149800 31.91 
#> 7  FB 2012-05-29 31.48 31.69 28.65 28.84 78063400 28.84 
#> 8  FB 2012-05-30 28.70 29.55 27.86 28.19 57267900 28.19 
#> 9  FB 2012-05-31 28.55 29.67 26.83 29.60 111639200 29.60 
#> 10  FB 2012-06-01 28.89 29.15 27.39 27.72 41855500 27.72 
#> # ... with 6,439 more rows 

# Convert to period returns 
return_tbl <- price_tbl %>% 
    group_by(symbol) %>% 
    tq_transmute(ohlc_fun = Ad, 
       mutate_fun = periodReturn, 
       period  = "daily") 
return_tbl 
#> Source: local data frame [6,449 x 3] 
#> Groups: symbol [4] 
#> 
#> symbol  date daily.returns 
#>  <chr>  <date>   <dbl> 
#> 1  FB 2012-05-18 0.00000000 
#> 2  FB 2012-05-21 -0.10986139 
#> 3  FB 2012-05-22 -0.08903906 
#> 4  FB 2012-05-23 0.03225806 
#> 5  FB 2012-05-24 0.03218747 
#> 6  FB 2012-05-25 -0.03390854 
#> 7  FB 2012-05-29 -0.09620809 
#> 8  FB 2012-05-30 -0.02253811 
#> 9  FB 2012-05-31 0.05001770 
#> 10  FB 2012-06-01 -0.06351355 
#> # ... with 6,439 more rows 

# Calculate performance 
return_tbl %>% 
    tq_performance(Ra = daily.returns, 
        performance_fun = CalmarRatio) 
#> Source: local data frame [4 x 2] 
#> Groups: symbol [4] 
#> 
#> symbol CalmarRatio 
#> <chr>  <dbl> 
#> 1  FB 0.50283172 
#> 2 AMZN 0.91504597 
#> 3 NFLX 0.14444744 
#> 4 GOOG 0.05068483 
Cuestiones relacionadas