更改 xts 对象日期索引
Change xts object date indexing
我有两个股票数据文件 returns。我试图对两者应用相同的功能,但其中一个出现错误。我想找出导致错误的原因,所以我比较了两个 xts 对象的 str
的输出,唯一不同的是:
Indexed by objects of class: [POSIXct,POSIXt] TZ: # this object errors
Indexed by objects of class: [Date] TZ: GMT # this object works
有没有办法更改 xts 对象中日期的索引,以便 str
returns 的输出:Indexed by objects of class: [Date] TZ: GMT
?
我使用以下方法生成了日期:seq(as.Date("1963/07/01"), as.Date("2004/12/01"), by = "1 month",tzone="GMT")
。
一个可重现的例子:
library(xts)
library("PerformanceAnalytics")
load("https://dl.dropboxusercontent.com/u/22681355/data.Rdata")
data(edhec)
data2 <- as.xts(french1)
我要调用的函数是Return.portfolio()
,参数是rebalance_on="months"
Return.portfolio(edhec["1997",1:10],rebalance_on="months") #this works
Return.portfolio(data2["1976",1:10],rebalance_on="months") #this does not work
xts:::as.xts.data.frame
默认假定您的 data.frame 的行名应该被强制转换为 POSIXct
object/index。如果您想使用不同的 class,请通过 dateFormat=
参数指定给 as.xts
。
> data2 <- as.xts(french1, dateFormat="Date")
> str(data2)
An ‘xts’ object on 1963-06-30/2004-11-30 containing:
Data: num [1:498, 1:10] -0.47 4.87 -1.68 2.66 -1.13 2.83 0.79 1.85 3.08 -0.45 ...
- attr(*, "dimnames")=List of 2
..$ : NULL
..$ : chr [1:10] "NoDur" "Durbl" "Manuf" "Enrgy" ...
Indexed by objects of class: [Date] TZ: UTC
xts Attributes:
NULL
虽然我不相信这是你遇到的任何错误的原因,因为如果不指定 dateFormat="Date"
我就不会收到错误。
> data2 <- as.xts(french1)
> Return.portfolio(data2["1976",1:10],rebalance_on="months")
portfolio.returns
1976-01-31 0.3980000
1976-02-29 0.1017811
1976-03-31 1.3408273
1976-04-30 -11.7395151
1976-05-31 8.0197492
1976-06-30 -0.2550812
1976-07-31 2.5732207
1976-08-31 1.3784635
1976-09-30 -1.6859705
1976-10-31 -21.4958124
1976-11-30 5.6863828
1976-12-31 -7.8071966
Warning message:
In Return.portfolio(data2["1976", 1:10], rebalance_on = "months") :
weighting vector is null, calulating an equal weighted portfolio
我有两个股票数据文件 returns。我试图对两者应用相同的功能,但其中一个出现错误。我想找出导致错误的原因,所以我比较了两个 xts 对象的 str
的输出,唯一不同的是:
Indexed by objects of class: [POSIXct,POSIXt] TZ: # this object errors
Indexed by objects of class: [Date] TZ: GMT # this object works
有没有办法更改 xts 对象中日期的索引,以便 str
returns 的输出:Indexed by objects of class: [Date] TZ: GMT
?
我使用以下方法生成了日期:seq(as.Date("1963/07/01"), as.Date("2004/12/01"), by = "1 month",tzone="GMT")
。
一个可重现的例子:
library(xts)
library("PerformanceAnalytics")
load("https://dl.dropboxusercontent.com/u/22681355/data.Rdata")
data(edhec)
data2 <- as.xts(french1)
我要调用的函数是Return.portfolio()
,参数是rebalance_on="months"
Return.portfolio(edhec["1997",1:10],rebalance_on="months") #this works
Return.portfolio(data2["1976",1:10],rebalance_on="months") #this does not work
xts:::as.xts.data.frame
默认假定您的 data.frame 的行名应该被强制转换为 POSIXct
object/index。如果您想使用不同的 class,请通过 dateFormat=
参数指定给 as.xts
。
> data2 <- as.xts(french1, dateFormat="Date")
> str(data2)
An ‘xts’ object on 1963-06-30/2004-11-30 containing:
Data: num [1:498, 1:10] -0.47 4.87 -1.68 2.66 -1.13 2.83 0.79 1.85 3.08 -0.45 ...
- attr(*, "dimnames")=List of 2
..$ : NULL
..$ : chr [1:10] "NoDur" "Durbl" "Manuf" "Enrgy" ...
Indexed by objects of class: [Date] TZ: UTC
xts Attributes:
NULL
虽然我不相信这是你遇到的任何错误的原因,因为如果不指定 dateFormat="Date"
我就不会收到错误。
> data2 <- as.xts(french1)
> Return.portfolio(data2["1976",1:10],rebalance_on="months")
portfolio.returns
1976-01-31 0.3980000
1976-02-29 0.1017811
1976-03-31 1.3408273
1976-04-30 -11.7395151
1976-05-31 8.0197492
1976-06-30 -0.2550812
1976-07-31 2.5732207
1976-08-31 1.3784635
1976-09-30 -1.6859705
1976-10-31 -21.4958124
1976-11-30 5.6863828
1976-12-31 -7.8071966
Warning message:
In Return.portfolio(data2["1976", 1:10], rebalance_on = "months") :
weighting vector is null, calulating an equal weighted portfolio