2

我正在尝试在 rbresearch 的名为“ Low Volatility with R ”的教程中运行代码,但是当尝试运行该cbind函数时,时间序列似乎完全错位了。

这是完美运行的数据准备部分:

require(quantmod)

symbols = c("XLY", "XLP", "XLE", "XLF", "XLV", "XLI", "XLK", "XLB", "XLU")
getSymbols(symbols, index.class=c("POSIXt","POSIXct"), from='2000-01-01')

for(symbol in symbols) {
  x<-get(symbol)
  x<-to.monthly(x,indexAt='lastof',drop.time=TRUE)
  indexFormat(x)<-'%Y-%m-%d'
  colnames(x)<-gsub("x",symbol,colnames(x))
  assign(symbol,x)
}

for(symbol in symbols) {
  x <- get(symbol)
  x1 <- ROC(Ad(x), n=1, type="continuous", na.pad=TRUE)
  colnames(x1) <- "ROC"
  colnames(x1) <- paste("x",colnames(x1), sep =".")
  #x2 is the 12 period standard deviation of the 1 month return
  x2 <- runSD(x1, n=12)
  colnames(x2) <- "RANK"
  colnames(x2) <- paste("x",colnames(x2), sep =".")
  x <- cbind(x,x2)
  colnames(x)<-gsub("x",symbol,colnames(x))
  assign(symbol,x)
}

rank.factors <- cbind(XLB$XLB.RANK, XLE$XLE.RANK, XLF$XLF.RANK, XLI$XLI.RANK,
  XLK$XLK.RANK, XLP$XLP.RANK, XLU$XLU.RANK, XLV$XLV.RANK, XLY$XLY.RANK)

r <- as.xts(t(apply(rank.factors, 1, rank)))

for (symbol in symbols){
  x <- get(symbol)
  x <- x[,1:6]
  assign(symbol,x)
}

为了说明 XLE ETF 数据数据与 XLE Ranked 数据一致:

> head(XLE)
            XLE.Open XLE.High XLE.Low XLE.Close XLE.Vodalume XLE.Adjusted
 2000-01-31    27.31    29.47   25.87     27.31    5903600        22.46
 2000-02-29    27.31    27.61   24.62     26.16    4213000        21.51
 2000-03-31    26.02    30.22   25.94     29.31    8607600        24.10
 2000-04-30    29.50    30.16   27.52     28.87    5818900        23.74
 2000-05-31    29.19    32.31   29.00     32.27    5148800        26.54
 2000-06-30    32.16    32.50   30.09     30.34    4563100        25.07
> nrow(XLE)
[1] 163
> head(r$XLE.RANK)
            XLE.RANK
 2000-01-31        2
 2000-02-29        2
 2000-03-31        2
 2000-04-30        2
 2000-05-31        2
 2000-06-30        2
nrow(r$XLE.RANK)
[1] 163

然而,在运行以下cbind函数后,xts 对象变得完全错位:

> XLE <- cbind(XLE, r$XLE.RANK)
> head(XLE)
           XLE.Open XLE.High XLE.Low XLE.Close XLE.Volume XLE.Adjusted XLE.RANK
2000-01-31    27.31    29.47   25.87     27.31    5903600        22.46       NA
2000-01-31       NA       NA      NA        NA         NA           NA        2
2000-02-29    27.31    27.61   24.62     26.16    4213000        21.51       NA
2000-02-29       NA       NA      NA        NA         NA           NA        2
2000-03-31    26.02    30.22   25.94     29.31    8607600        24.10       NA
2000-03-31       NA       NA      NA        NA         NA           NA        2
> nrow(XLE)
[1] 326

由于运行预先存在的代码很少对我有用,我怀疑我的 R 控制台有问题,所以这里是我的会话信息:

> sessionInfo()
R version 3.0.1 (2013-05-16)
Platform: x86_64-w64-mingw32/x64 (64-bit)

locale:
[1] LC_COLLATE=English_Canada.1252  LC_CTYPE=English_Canada.1252    LC_MONETARY=English_Canada.1252 LC_NUMERIC=C                   
[5] LC_TIME=English_Canada.1252    

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base     

other attached packages:
 [1] timeSeries_3010.97         timeDate_3010.98           quantstrat_0.7.8           foreach_1.4.1             
 [5] blotter_0.8.14             PerformanceAnalytics_1.1.0 FinancialInstrument_1.1.9  quantmod_0.4-0            
 [9] Defaults_1.1-1             TTR_0.22-0                 xts_0.9-5                  zoo_1.7-10                

loaded via a namespace (and not attached):
[1] codetools_0.2-8 grid_3.0.1      iterators_1.0.6 lattice_0.20-15 tools_3.0.1    

我完全不确定如何在没有 的情况下正确对齐 xts 对象,NA并且非常感谢任何帮助。

4

1 回答 1

1

我看不出有人无法复制您的问题。问题是这一行:

r <- as.xts(t(apply(rank.factors, 1, rank)))

第一个 for 循环将数据转换为每月数据并删除索引的时间部分,从而将索引转换为Date. 这意味着rank.factors有一个Date索引。但是默认as.xts创建一个POSIXct索引,所以r会有一个POSIXct索引。

cbind(XLE, r$XLE.RANK)正在将带有Date索引的 xts 对象与带有索引的 xts 对象合并POSIXct。如果您对时区设置不太小心,从POSIXctto的转换可能会出现问题。Date

如果您不需要时间组件,最好避免POSIXct使用Date. 因此,如果您dateFormat="Date"as.xts通话中设置,一切都应该正常工作。

R> r <- as.xts(t(apply(rank.factors, 1, rank)), dateFormat="Date")
R> XLE <- cbind(XLE, r$XLE.RANK)
R> head(XLE)
           XLE.Open XLE.High XLE.Low XLE.Close XLE.Volume XLE.Adjusted XLE.RANK
2000-01-31    27.31    29.47   25.87     27.31    5903600        22.46        2
2000-02-29    27.31    27.61   24.62     26.16    4213000        21.51        2
2000-03-31    26.02    30.22   25.94     29.31    8607600        24.10        2
2000-04-30    29.50    30.16   27.52     28.87    5818900        23.74        2
2000-05-31    29.19    32.31   29.00     32.27    5148800        26.54        2
2000-06-30    32.16    32.50   30.09     30.34    4563100        25.07        2
于 2013-07-07T13:19:03.227 回答