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
注意,基本Rts()
方法主要适用于季度或年度数据。
如前所述:
“时间序列对象无法很好地用于创建每日时间序列。我建议您使用动物园库。”
特别是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)")