交易回測問題(逐筆洗價 & 有觸發的商品未顯示在回測紀錄裡)

  •   244 
  • 最後發表   iker  2022 七月 15
iker 發文於   2022/07/02

我在回測一個交易策略的時候,遇到兩個問題:

問題 1:回測開了逐筆洗價就無法觸發結果(執行商品也沒有發生錯誤)

問題 2:沒開逐筆洗價的情況下,明明觸發了5個商品的進場條件(有print出進場行為),但實際上有2個商品沒有出現在回測紀錄的統計結果裡

這樣的落差變成無法確認回測結果是否可信,且回測時的價格明顯與實單不符,下方是回測與實單價格的對比:

不太了解為什麼會出現上述問題,能請小幫手說明一下嗎?

 


附件有附上實際執行的交易腳本,與另一組可以用模擬洗價回測的腳本

兩個腳本差異在:

發生錯誤的腳本是訊號觸發後打入1/3部位,後續滿足加碼訊號才陸續打滿部位(該腳本無法使用模擬洗價回測)

另個腳本是訊號觸發後一次把部位打滿(此腳本可以用模擬洗價回測)

 

附加文件

排序方式: 標準 | 最新
musashi 發文於   2022/07/06

計算有效K棒數count=count+1 在逐筆應該不是1分K棒的數量,因為逐筆的1根K棒會跑4次腳本,1分K棒編號從0~269可以用BarsLast(IsSessionFirstBar)計算。

另外建議找一個有問題的標的,除了包覆在if的條件外,也要把相關數據"逐筆"print出來,這樣會比較容易找出看不到的錯誤。

以上建議參考看看。

 

iker 發文於   2022/07/06

感謝 mussahi

學了一招「1分K棒編號從0~269可以用BarsLast(IsSessionFirstBar)計算

我回測跑那些沒有出現在結果的股票也是無法使用"逐筆",要取消勾選才能回測,但回測結果一樣是會print出來、卻統計結果裡卻顯示我的進出是 0 次,所以沒辦法用這個方式觀察是怎麼被觸發的 ...


 

musashi 發文於   2022/07/06

BarsLast(IsSessionFirstBar)是指當下頻率的K棒編號喔。

交易腳本比警示多了進出場,要print建議是拆開判斷條件個別測試。以下提供我print的基本語法

//■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
print   (   file("D:\SysJust\XQLite\XS\Print\"),
            "■-",       numtostr(date,          0),
            "■-",       numtostr(time,          0),
            "■-01",     condition1,     //布林判斷條件是否成立
            "■-02",     numtostr(round(average(getfield("volume","5")[0],5),0),     2),     //也可以放計算式
"");//■■■■

iker 發文於   2022/07/06

晚上寫了一個腳本跑逐筆回測,發現 BarsLast(IsSessionFirstBar) 還是會被逐筆模擬影響,一根K棒就會讓他的數字加 4 ...

請問該怎寫才能透過 BarsLast(IsSessionFirstBar) 來實現計算目前是今天第幾根 K 棒呢?

 

btw 我也有寫類似的 print:

print(file("[StrategyName]_[Symbol]_[StartTime].log"), DateToString(date), TimeToString(time), 
                    "【空單建倉】-------------------------------------------------  入場價:", NumToStr(close,2), 
                    "| 進場次數:", NumToStr(dayEntryTimes,0),
                    "  | 停利價:", NumToStr(addSpread(close, 2) * (1 - STOPPROFITPERCENT * 0.01),2), 
                    "| 停損價:", NumToStr(addSpread(close, 2) * (1 + STOPLOSSPERCENT * 0.01),2));

musashi 發文於   2022/07/07

在一分鐘頻率環境下,寫在腳本最上方,讓腳本一開始就先判斷第N期數的K棒值,Bar_Number_1min值就一直更新為目前K棒期數

    //目前第N期K棒
    var:Bar_Number_1min(0);
        Bar_Number_1min=BarsLast(IsSessionFirstBar);    //1分頻率中,目前的1分K的期數,第一根K棒期數=0,0~269

iker 發文於   2022/07/07

原來如此,感謝!

XQ小幫手 發文於   2022/07/12

Hello iker,

 

1.問題應該是發生在您的count計算錯誤。

小幫手建議您,如果要計算當日開盤到現在經過幾根Bar,只要將 count 的 intrabarpersist 給取消掉,就可以計算出正確數字,逐筆洗價也會進場。

因為1分鐘逐筆洗價下1根Bar會運算4次,所以如果用intrabarpersist的話1根Bar會上升4造成計算錯誤。

 

2.您可以一併把 perPosition 印出,即可知道問題原因。

4116 和 8069 的數值皆為0,所以不會交易。

 

在1分鐘逐筆洗價的時侯,會將1分鐘Bar拆成OHLC 4個tick來運算,所以1根Bar會運算4次。

其他頻率逐筆洗價的時候,會已1分鐘Bar來模擬,所以舉例來說5分鐘頻率的話,1根Bar會運算5次。

iker 發文於   2022/07/12

感謝小幫手!

第一點了解了。

第二點還是不太明白為什麼回測時的 perPositon 數值會是 0,因為自動交易跑實單的時候確實有下正確的張數,代表計算 perPositon 的公式沒有問題,但回測的時候卻是沒有發生交易。先前在其他策略回測+實單驗證時也有遇過相同的情況,實單都有正常被觸發,回測卻沒有。

XQ小幫手 發文於   2022/07/15

Hello iker,

 

如同小幫手所說,您可以自行print出來檢查。(參考附圖)

您的 value99 依據input計算出來是 20 * 1 = 20,maxPosition 計算出來不滿3,所以 value33 會小於1,而 floor 後就會等於0。

或許是因為兩者input的設定不同導致差別。

附加文件

iker 發文於   2022/07/15

OK 我在看看

感謝小幫手

發表回覆
Close