各位,我刚刚开始学习如何正确构建R中交易策略的回溯测试代码。作为我的第一个例子,我正在测试一个非常简单的策略,当指数在第t天的收盘价大于50天移动平均线时,做多指数。当收盘价低于50天平均水平时,任何多头头寸都会被卖出。。。然而,这种策略从来不会彻底做空,只会做多或持平。
因此,为了正确地测试这一点,我用嵌套的if/else-if语句编写了一个庞大的for循环,如下所示。这不是很快,我想知道是否有任何通用的方法来提高速度。R应该是矢量化的。。。但我似乎无法像这样运行代码。
在中有一个数据帧,如下所示,称为"数据端口"。。。并希望在每天添加"信号"one_answers"位置"列。因此,我每天都使用时间索引I来进行循环,随着时间的推移,填充"信号"one_answers"位置"列。位置矢量只能取值0或1,并且信号只能取值-1,0,1。基本问题是,在任何一天,信号矢量值都取决于前一天的位置t-1……这使得无法对运算进行矢量化,或者我的想法不正确吗?
如果有任何建议,我将不胜感激。此外,我知道quantmod和quantstrat包包含一些回溯测试功能。。。我只是想自己构建它,因为最终我的信号会变得太复杂,这些包无法处理。非常感谢。
Date CO2 MA
2006-01-03 61.70 57.88
2006-01-04 62.02 57.95
2006-01-05 61.35 57.96
2006-01-06 62.91 58.03
2006-01-09 62.32 58.09
2006-01-10 62.30 58.14
for(i in 1:length(datasort$CO2)) {
if (i==1) {
if(datasort$CO2>=datasort$MA) {
datasort$signal[i]<-1
datasort$position[i]<-1}
else if (datasort$CO2[i]<datasort$MA[i]){
datasort$signal[i]<-0
datasort$position[i]<-0}}
else if (i>1){
if ((datasort$CO2[i]>=datasort$MA[i])&(datasort$position[i-1]==0))
{datasort$signal[i]<-1
datasort$position[i]<-1}
else if ((datasort$CO2[i]>=datasort$MA[i])&(datasort$position[i-1]==1))
{datasort$signal[i]<-0
datasort$position[i]<-datasort$position[i-1]}
else if ((datasort$CO2[i]<datasort$MA[i])&(datasort$position[i-1]==1))
{datasort$signal[i]<- -1
datasort$position[i]<-datasort$position[i-1]-1}
else if ((datasort$CO2[i]<datasort$MA[i])&(datasort$position[i-1]==0))
{datasort$signal[i]<-0
datasort$position[i]<-datasort$position[i-1]}
}}
您的代码似乎无法向量化。。。但它可以简化很多,所以请仔细检查。正如目前所提出的,它相当于这个简单的函数:
f <- function(x, y){
z <- x >= y
position <- signal <- as.numeric(z[1])
for(i in 2:length(z)){
signal[i] <- z[i] - position[i-1]
position[i] <- z[i] * position[i-1]
}
data.frame(signal=signal, position=position)
}
要测试它,请使用以下内容:
datasort <- read.table(header=TRUE,text="
Date CO2 MA
2006-01-03 61.70 57.88
2006-01-04 62.02 57.95
2006-01-05 61.35 57.96
2006-01-06 62.91 58.03
2006-01-09 62.32 58.09
2006-01-10 62.30 58.14
")
cbind(datasort, with(datasort, f(CO2, MA)))