R 将包含日期列的数据帧转换为时间序列

R 将包含日期列的数据帧转换为时间序列,r,xts,R,Xts,我有一个包含以下数据的数据框: >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 ... 正如您所看到的,m

我有一个包含以下数据的数据框:

>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
...
正如您所看到的,my DATE列表示日期(yyyyMMdd),my CLOSE列表示价格

我现在要从PerformanceAnalytics软件包中计算CalmarRatio

我对R是新手,所以我不能完全理解,但从我在谷歌上搜索到的那一刻起,我看到该函数的R参数需要是一个类似于时间序列的对象


考虑到一个时段内可能没有每个日期的数据(仅针对我指定的日期),是否有任何方法可以将数组转换为时间序列对象?

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

首先,需要将
DATE
列转换为
DATE
对象。然后,您可以从
PRICE
data.frame的
CLOSE
DATE
列创建一个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

PRICE大多数人发现使用时间序列类是一件非常痛苦的事情。你应该考虑使用动物园动物园包装班。它不会抱怨错过的时间,只会抱怨重复的时间。PerformanceAnalytics函数几乎肯定会使用“zoo”或其子类“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 

pricez另一种解决方案是使用
tidyquant
软件包,该软件包允许金融软件包的功能(包括时间序列功能)与数据帧一起使用。以下示例显示了如何获得多个资产的Calmar比率。本文将详细介绍如何使用该软件包


库(tidyquant)
#获得价格
价格(待定)
tq_get(get=“stock.prices”,
from=“2010-01-01”,
至=“2016-12-31”)
价格
#>#A tibble:6449Ã-8
#>symbol日期开盘高位低位收盘音量调整
#>                       
#>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-2331.3732.5031.3632.00736000032.00
#>5 FB 2012-05-2432.9533.2131.7733.03502372033.03
#>6 FB 2012-05-2532.9032.9531.1131.9137149800 31.91
#>7 FB 2012-05-2931.4831.6928.6528.84780634028.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 418555027.72
#> # ... 还有6439行
#转换为期间收益
回报率(tbl%)
分组依据(符号)%>%
转变(ohlc\U fun=Ad,
mutate_fun=周期返回,
period=“每日”)
返回tbl
#>来源:本地数据帧[6449 x 3]
#>分组:符号[4]
#> 
#>symbol date日报表
#>                   
#>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.0253811
#>9 FB 2012-05-31 0.05001770
#>10 FB 2012-06-01-0.06351355
#> # ... 还有6439行
#计算性能
返回值\u tbl%>%
tq_绩效(Ra=每日收益,
表演(乐趣=平静)
#>来源:本地数据帧[4 x 2]
#>分组:符号[4]
#> 
#>象征平静
#>           
#>1 FB 0.50283172
#>2 AMZN 0.91504597
#>3 NFLX 0.14444744
#>4 GOOG 0.05068483

无论您想将数据帧(或任何时间序列)转换为xts或zoo对象(如上述答案所示),还是转换为任何其他时间序列(如
ts
对象),软件包都可以简化强制:

PRICE[time]:'DATE'[value]:'CLOSE'
#>加载所需命名空间:xts
#>已注册的S3方法被“xts”覆盖:
#>方法自
#>as.zoo.xts动物园
#>接近
#> 2007-01-03 54.70
#> 2007-01-04 54.77
#> 2007-01-05 55.12
#> 2007-01-08 54.87
#> 2007-01-09 54.86
#> 2007-01-10 54.27
#> 2007-01-11 54.77
#> 2007-01-12 55.36
#> 2007-01-15 55.76
(价格)
#>[时间]:“日期”[值]:“关闭”
#>时间序列:
#>开始=2007.00547581401
#>完=2007.0383306981
#>频率=365.2425
#>[1]54.7054.7755.12NA 54.8754.8654.2754.7755.36NA
#>[12]NA 55.76

此答案基于@Joshua_Ulrich的答案,从内置的
空气质量数据集创建一个时间序列,其中包含“1973年5月至9月纽约每日空气质量测量”

将月和日转换为类“日期”的向量

创建时间序列对象

ts_airquality <- xts(airquality, airqualitydate)
head(ts_airquality, 3)
           Ozone Solar.R Wind Temp Month Day
1973-05-01    41     190  7.4   67     5   1
1973-05-02    36     118  8.0   72     5   2
1973-05-03    12     149 12.6   74     5   3

注意,基本R
ts()
方法主要适用于季度或年度数据。 如前所述:

“时间序列对象无法很好地用于创建每日时间序列。我建议您使用动物园库。”


特别是
xts
包是
zoo

的扩展,还请注意
read.zoo
可以设置索引。此变量有效:
read.zoo(PRICE,format=“%Y%m%d”)
假设
PRICE
是一个包含两个数字列的数据帧(而不是数组或矩阵),此变量也有效:
read.zoo(text=“…相同.如上…”,header=TRUE,format=“%Y%m%d”)
很高兴您和Achim在as.Date之前添加了as.character强制。我最初几次得到NA是因为as.Date(20070103,format=“%Y%m%d”)没有执行所需的强制。还有一个例子,我欠你们很多东西。是的,这是正确的。您确实需要一个足够新的版本的zoo才能工作。CRAN上的版本应该可以
airqualitydate = as.Date(sprintf("1973%02.0f%02.0f", airquality$Month, airquality$Day), 
                         format="%Y%m%d")
ts_airquality <- xts(airquality, airqualitydate)
head(ts_airquality, 3)
           Ozone Solar.R Wind Temp Month Day
1973-05-01    41     190  7.4   67     5   1
1973-05-02    36     118  8.0   72     5   2
1973-05-03    12     149 12.6   74     5   3
plot(ts_airquality$Ozone, main="Ozone (ppb)")
lines(ts_airquality$Temp, on=NA, main="Temperature (degrees F)")