人們,我剛剛開始學習如何在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循環相同的結果。 –