Преобразование фрейма данных со столбцом даты в таймсерии
У меня есть фрейм данных со следующими данными:
>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
...
Как вы можете видеть, мой столбец даты представляет собой дату (yyyyMMdd), а мой столбец закрытия представляет цены.
теперь мне нужно вычислить CalmarRatio из пакета PerformanceAnalytics.
Я новичок в R, поэтому я не могу понять все, но от того, что я погуглил до момента, когда я вижу, что параметр R для этой функции должен быть похожим на временной ряд объектом.
есть ли как я могу преобразовать свой массив в объект временного ряда, учитывая, что не может быть данных для каждой даты в периоде (только для тех, которые я указываю)?
3 ответа:
код
DATE
столбец может представлять дату, но на самом деле это либо символ, фактор, целое число или числовой вектор.во-первых, вам нужно преобразовать до
Date
"объект". Затем вы можете создать объект xts изCLOSE
иDATE
столбцыPRICE
данные.рамка. Наконец, вы можете использовать объект xts для вычисления возвратов и коэффициента 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
большинство людей считают работу с классом временных рядов большой болью. Вы должны рассмотреть возможность использования класса zoo из пакета zoo. Он не будет жаловаться на пропущенное время, только на дубликаты. Функции PerformanceAnalytics почти наверняка будут ожидать "зоопарк" или его потомок класса "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
альтернативным решением является использование
tidyquant
пакет, который позволяет использовать функциональные возможности финансовых пакетов, включая функциональные возможности временных рядов, с фреймами данных. В следующих примерах показано, как можно получить коэффициент Calmar для нескольких активов. Элемент tidyquant виньетки перейти к более подробной информации о том, как использовать пакет.
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