"同策略"每次回測結果都不一樣,這真的讓我驚呆了!!!!!!
你可以看到三張截圖: 回測執行的時間都是2022/04/05 13:08
因為程式碼很短,回測只要幾秒鐘,因而意外發現這種情況
搜尋XS討論區這幾年都有人發現這樣的問題,那不就代表他們反應後都沒有改進嗎???



這些問題的確是一直都存在, 有時真的用到很氣,
回測出來的東西跟本不能用, 因為每次重跑, 每次結果都不同!!!
你永遠不知哪次才是對的
例如:
我昨天用選股腳本+策略回測, 進場條件不設, 只設出場條件, 出場觸發隔天開盤賣出.
重跑了多次, 印 log 出來看後發現, log進出訊號一模一樣, 但總報酬不一致,
追下去就發現, 明明有觸發ret=1, 有時"正確在隔天開盤出場", 有時卻變成"後天開盤才出場",
所有條件和程式全部相同, 跑出來結果就是有問題!!!
結論:【明明觸發出場訊號,但不一定如預期出場】
連假這幾天在回測時也發現這個問題,還不是像樓上次數差個幾次,我的是差到上百次
我是用自動交易回測,商品來源為選股
結果本來在選股回測時可能交易次數只有個兩三百次,但是用自動交易回測變成上千次的奇怪現象
感覺上好像是選股的參數改動後,第一次用自動交易回測就會發生這事,第二次就沒問題了,但也不是每次都這樣
希望XQ這能找出原因,不然每次回測都要注意,很累
Hello 飛雪狐,
您提到的這幾年回測結果不同,就小幫手所知之前的應該是因為當時回測報告部分商品回測逾時失敗還是會回傳報告,可能因此導致每次回測結果不同。
這部分已經有作調整。
關於最近回測錯誤的部分,工程師已經找到問題原因出在選股策略串接交易腳本的部分並開始修復,預計會在近期的版本中更新。
請問這個問題什麼時候會改善呢?
Hello iker,
選股策略串接交易腳本的問題,已經在.08.03時修復。
如果您有發生回測不同的狀況,麻煩您提供 腳本、回測結果不同的報表 以及 XQ Log 來檢驗。
Log資料夾(預設路徑:C:\SysJust\XQLite\LOG)直接壓縮後提供即可。
您可以直接將檔案上傳,如果檔案過大的話也可以Mail至客服信箱 XQservice@XQ.com.tw 且務必附上 討論文章連結網址(小幫手才能盡早處理)。
感謝。
小幫手您好
最近實在遇到太多次同樣的問題,而且不同的選股條件都會發生類似問題。
我在每天換日時檢查持倉天數,一旦有部位且達到持倉天數上限,就強制出場:
input: MAXDAYS(20, "最大持有天數");
var: intraBarPersist lastDate(0);
var: intraBarPersist correctEntryDate(0);
var: intraBarPersist dayCount(0);
if date <> lastDate then begin
lastDate = date;
// 持有部位時,持倉天數累積+1
if filled > 0 then dayCount += 1;
// 未持有部位時,重設所有參數
if filled = 0 then begin
correctEntryDate = 0;
dayCount = 0;
end;
if correctEntryDate <> 0 and filled > 0 and dayCount = MAXDAYS then begin
// 回測並出場
OutputBackTestAndSetPosition(1, 0, DateToString(correctEntryDate), "達到持倉天數");
// Reset
correctEntryDate = 0;
dayCount = 0;
end;
end;
(這裡另外一個延伸問題是,如果我在回測時把 lastDate 換成 date[1],會導致所有部位都是持倉 1 天就出場,但改回 lastDate 後,99% 的交易都能在符合持倉天數的情況下出場,不理解為什麼會有這種差異?)
然後每次進場特地 Print 一下進場日期,發現有時候固定會有一筆或隨機幾筆進場日期錯亂:
// 進場條件
if filled = 0 and Position = 0 then begin
// 紀錄進場日期
correctEntryDate = date;
print(file("C:\SysJust\XQLite\XS\Print\CorrectEntryDate.txt"), Symbol(), SymbolName(), correctEntryDate);
// 進場天數初始化
dayCount += 1;
// 進場
SetPosition(Filled + perEntryPosition);
end;

回測產生的 log 與回測異常的報表已經 mail 到客服信箱,但 C:\SysJust\XQLite\LOG 資料夾快 2 GB 根本沒辦法傳送,只挑出今日相關的檔案壓縮寄出。
麻煩確認一下是什麼問題吧。不然目前無論是選股回測、雷達回測、選股搭配交易回測都不時遇到這樣的問題,很難讓人相信每次回測結果的正確性,也會讓使用者在調校策略上浪費大量心力再覆驗上...
1/00/01 2019/04/29 3548.TW 兆利 75.80 3 68.20 標準停損 -22800 負
1/00/01 2021/03/30 9924.TW 福興 44.05 5 46.70 標準停利 13250 勝
補充一下,同個策略還有 9924 也發生進場日期錯誤,但兩支股票都有多次觸發,其他次進場日期卻都是正常的
Hello iker,
由於您並沒有提供腳本,所以有部分是相關人員推測的。
1.回測時把 lastDate 換成 date[1],會導致所有部位都是持倉 1 天就出場
這是因為日頻率下自動交易是逐筆洗價,而您的daycount是intrabarpersist。
date <> date[1] 一定會成立 (日頻率),就每次都會進入這判斷式裡,所以同一天內daycoun會持續累加。
2.124天才出場。
由於 OutputBackTestAndSetPosition(1, 0, DateToString(correctEntryDate), "達到持倉天數"); 這個自訂函數小幫手不清楚是怎麼寫的,但可能您在撰寫setposition時並沒有使用市價單。
這邊會衍生出一個狀況: 如果該委託單當日沒有全部成交的話,系統會將其刪除。
此時就會變成庫存還在,但 correctEntryDate 被歸0的狀況,沒辦法出場。
至於最後會出場的原因,在您提供的部分腳本內無法找出原因,不知道是否有其他的出場方式?(ex. 停損停利)
3.固定會有一筆或隨機幾筆進場日期錯亂
小幫手不確定您是在哪裡print出相關資訊的,進場腳本內的
print(file("C:\SysJust\XQLite\XS\Print\CorrectEntryDate.txt"), Symbol(), SymbolName(), correctEntryDate);
和您附上有問題的貼圖描述不一樣,所以應該不是這部分的錯誤。
需要麻煩您提供完整的腳本 (包含函數),這樣小幫手才能確認。
另外,若log太大的話,您可以將其放到雲端然後提供連結給我們 (請記得開放權限)。
感謝。
8 評論