【发布时间】:2013-07-28 19:44:00
【问题描述】:
我正在尝试在一个循环中合并动物园类,每次迭代将动物园系列累积为新的“列”。我在运行循环之前初始化了一个空的zoo()。在我的代码完成后,当我调用 str() 时,我会得到“没有观察的动物园系列”。然而,当我尝试初始化一个空动物园,然后将其与自身和另一个实例与数据合并时,它工作正常。下面有问题的动物园是第二个循环中的“monthlyReturns”。顺便说一句,我知道使用 apply 系列会更好地为我服务。那将是下一个。我做错了什么?
library(tseries)
library(zoo)
symbs = c('XLF', 'XLE', 'XLU', 'SPY')
importData = vector('list', length(symbs))
cumInvestmentReturns = zoo()
monthlyReturns = zoo()
#Get monthly pricing data.
for (sIdx in 1:length(symbs)){
#Import the data for each symbol into the list.
importData[sIdx] = get.hist.quote(instrument= symbs[sIdx], start="2000-01-01", end="2013-07-15",
quote="AdjClose", provider="yahoo", origin="1970-01-01", compression="m", retclass="zoo")
names(importData[sIdx]) = symbs[sIdx]
}
#Loop over length of lookback months (1-12) to check for performance of best etf in past period.
for (numbOfMonths in 1:12){
#Calculate performances on each symbol, using the lookback length of variable numbOfMonths.
monthlyPctChgs = lapply(importData, function(x) diff(x, lag =numbOfMonths) / lag(x, k=-numbOfMonths))
names(monthlyPctChgs) = symbs
#combine all ticker time series into one time series.
tsPctChgs = merge(monthlyPctChgs[[1]], monthlyPctChgs[[2]], monthlyPctChgs[[3]], monthlyPctChgs[[4]],
monthlyPctChgs[[5]], monthlyPctChgs[[6]], monthlyPctChgs[[7]], monthlyPctChgs[[8]],
monthlyPctChgs[[9]], monthlyPctChgs[[10]], monthlyPctChgs[[11]], monthlyPctChgs[[12]])
names(tsPctChgs) = symbs
curBestLagPerfs <- rollapplyr(tsPctChgs, 2, function(x) x[2,which.max(x[1,])], by.column=FALSE)
monthlyReturns = merge(monthlyReturns, curBestLagPerfs)
#finalSet = finalSet[2:length(finalSet$SPY),] #Remove first value, since there is an na.
lookbackReturns = cumprod(1+curBestLag) * 10000
cumInvestmentReturns = merge(cumInvestmentReturns, lookbackReturns)
#names(investmentsPaired) = c('SPY', 'ETFRotation')
}
【问题讨论】:
-
您在这里问了几个问题,以了解我们需要一个可复制的示例来帮助您。例如,将代码简化到足以重现行为并提供代码以通过
tseries::get.hist.quote获取数据并提供symbs对象将是完美的。 -
我不确定我是否理解代码中发生的所有事情,但我认为您可能希望在第一个循环的两个位置都使用
importData[[sIdx]]。 (即[[而不是[)您可能还想知道第二个循环中的巨型合并可以替换为do.call(merge, monthlyPctChgs)。但是,我不确定它是否按照您的想法进行。看起来您的代码假设NROW(symbs) == 12. -
我只是提供了 symbs,我知道的更好......谢谢。
标签: r time-series zoo