2012-01-04 11 views
52

Ho un frame di dati con i seguenti dati:Converti con la data della colonna per timeseries

>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 
... 

Come si può vedere la mia colonna DATA rappresenta una data (AAAAMMGG) e la mia colonna CLOSE rappresenta prezzi.

Ora devo calcolare CalmarRatio, dal pacchetto PerformanceAnalytics.

Sono nuovo di R, quindi non riesco a capire tutto, ma da quello che ho cercato su Google al momento vedo che il parametro R per quella funzione deve essere un oggetto simile a una serie temporale.

Esiste un modo per convertire il mio array in un oggetto di serie storica dato che potrebbero non esserci dati per ogni data in un periodo (solo per quelli specificati)?

risposta

46

La colonna DATE può rappresentare una data, ma in realtà è un carattere, un fattore, un numero intero o un vettore numerico.

Innanzitutto, è necessario convertire la colonna DATE in un oggetto Date. Quindi puoi creare un oggetto xts dalle colonne CLOSE e DATE del tuo PRICE data.frame. Infine, puoi usare l'oggetto xts per calcolare i ritorni e il rapporto 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

per il principiante completo: utilizzando 'xts' richiede di caricare la sua libreria di prima, con' require ('XTS') ' – Jealie

+0

@Jealie: while true, l'OP chiedeva di creare un oggetto da utilizzare con una funzione PerformanceAnalytics. PerformanceAnalytics dipende da xts, quindi xts probabilmente sarebbe già stato caricato. –

13

La maggior parte delle persone ritiene che lavorare con la classe delle serie temporali sia un grande problema. Dovresti prendere in considerazione l'utilizzo della classe zoo dal pacchetto zoo. Non si lamenterà dei tempi mancanti, solo dei duplicati. Le funzioni di PerformanceAnalytics quasi sicuramente si aspettano lo 'zoo' o la sua classe discendente '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

Si noti inoltre che 'read.zoo' può impostare l'indice. Questa variante funziona: 'read.zoo (PRICE, format ="% Y% m% d ")' partendo dal presupposto che 'PREZZO' sia un frame di dati (piuttosto che un array o una matrice) con due colonne numeriche e anche questo: 'read.zoo (text =" ... same.as.above ... ", header = TRUE, format ="% Y% m% d ")' –

+0

È molto bello che tu e Achim abbiate aggiunto il come. coercizione di carattere prima di data. Le prime volte che stavo ottenendo NA perché as.Date (20070103, format = "% Y% m% d") non esegue la coercizione necessaria. Ancora un altro esempio delle molte cose che sono in debito con te. –

+0

Sì, è corretto. Hai bisogno di una versione sufficientemente recente di zoo per farlo funzionare. La versione su CRAN dovrebbe essere ok. –

2

Una soluzione alternativa è quella di utilizzare il pacchetto tidyquant, che consente la funzionalità dei pacchetti finanziari, compresa la funzionalità serie temporali, per essere utilizzato con trame di dati. I seguenti esempi mostrano come è possibile ottenere il rapporto di Calmar per più risorse. Lo tidyquant vignettes entra in ulteriori dettagli su come utilizzare il pacchetto.


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 
Problemi correlati