将数据框与date列转换为时间序列

我有一个数据框与以下数据:

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

正如你所看到的,我的DATE列表示date(yyyyMMdd),我的CLOSE列表示价格。

我现在必须从PerformanceAnalytics包中计算CalmarRatio。

我是R新手,所以我不能理解所有的东西,但是从我search到的那一刻起,我发现R函数需要的是一个时间序列对象。

有没有什么办法,我可以将我的数组转换为时间序列对象,因为可能没有数据为每个date在一个时期(只为我指定的)?

您的DATE列可能表示一个date,但它实际上是一个字符,因子,整数或数字向量。

首先,您需要将DATE列转换为Date对象。 然后,您可以从您的PRICE data.frame的CLOSEDATE列中创build一个xts对象。 最后,您可以使用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中的动物园类。 它不会抱怨错过的时间,只是关于重复。 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 

另一种解决scheme是使用tidyquant软件包,该软件包允许财务软件包的function(包括时间序列function)与数据框一起使用。 以下示例显示了如何获取多个资产的Calmar比率。 整齐的小插曲详细介绍了如何使用这个软件包。

 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