人们,我刚刚开始学习如何在R中正确地构建交易策略的回溯测试代码。作为我的第一个示例,我正在测试一个非常简单的策略,当它关闭时, t日价格大于50日均线。当收盘价低于50日均值时,任何多头头寸都会被卖出,但是这种策略永远不会短缺,只会持续多头或持平。R交易策略backtesting循环
因此,为了正确测试,我编写了一个庞大的for循环嵌套的if/else if语句,如下所示。这不会跑得很快,我想知道是否有任何提高速度的一般方法。 R应该是矢量化的......但我似乎无法像这样运行代码。
在下面有一个名为“datasort”的数据框...并且希望每天添加“signal”和“position”列。所以我for循环使用时间索引我每天填充列“信号”和“位置”,每一天过去。位置矢量只能取值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]}
}}
我试着对其中CO2下面去了,然后回到上方MA表功能(加一些条目到表的末尾),并没有得到与原始for循环相同的结果。 –