回測結果異常(腳本參數不變的情況下,無法回測足夠長的時間)

  •   535 
  • 最後發表   iker  2023 二月 08
iker 發文於   2023/01/07

我有一套腳本去回測  60分K 的小台近月期貨時,用了以下三個時間範圍回測,發現結果有點問題:

1. 2022/07/06 - 2023/01/06 (半年)
2. 2022/01/06 - 2022/07/06 (半年)
3. 2022/01/06 - 2023/01/06 (一年)

當我回測第 1、2 兩種時,都能看到有正常觸發交易的紀錄,但回測第 3 種時,跑出來的交易紀錄跟第 2 種完全一樣,沒有後面的交易紀錄...

回測是用相同交易腳本、完全不改變其他參數的情況下,只是選了不同回測範圍的結果。

想請問 60分K 要怎麼回測 1 年以上的資料?


另外第 1 種回測結果裡,我有使用以下方式寫期貨結算日平倉的條件,這段程式碼用在同樣策略的指標腳本裡,畫在指標上確實有按結算日出場。但交易回測並沒有正常出場,導致裡頭的編號 1、13 的交易持倉天數超過了期貨近月的天數。

if DayOfWeek(date) = 3 and DayOfMonth(date) > 14 and DayOfMonth(date) < 22 then
SetPosition(0, Market);

請問要怎麼改才能在交易回測時按結算日出場?

排序方式: 標準 | 最新
XQ小幫手 發文於   2023/01/11

Hello iker,

 

關於回測觸發有問題的部分,小幫手這邊簡單的測試沒有發生您的狀況。(參考附圖)

要麻煩您提供 交易腳本、回測設定 (截圖或回測報告皆可) 以及 XQ Log 來檢驗,才能確定問題原因。

Log資料夾(預設路徑:C:\SysJust\XQLite\LOG)直接壓縮後提供即可。

您可以直接將檔案上傳,如果檔案過大的話也可以Mail至客服信箱 XQservice@XQ.com.tw 且務必附上 討論文章連結網址(小幫手才能盡早處理)。

 

關於到期日出場的部分,小幫手推測可能是有複數的setposition同時成立的話,只會執行第一個交易指令所造成。

您可以參考自動交易語法介紹裡的說明,將進出場加上position 和 filled 控管,看能否解決問題。

但實際原因還是要看腳本才能確定。

 

附加文件

iker 發文於   2023/01/11

已經寄到信箱了,因LOG檔壓縮後還超過200M,無法傳送,只有附上交易腳本、回測紀錄   補充如果我回測 2021/01/01-2023/01/01,回測結果也只會有 2021 年的資料,2022年整年都沒有,你可以用那個腳本跑看看 FIMTXN*1

XQ小幫手 發文於   2023/01/13

Hello iker,

 

您的問題發生在於當天最後一根Bar觸發的交易不會送單,因為該根Bar結束運算時當天已經收盤。

所以空手在當天040000這根Bar觸發時,會發生 direction 被改變,而 hasPosition 卻還是 False 的狀況,導致後來不會繼續交易。

要解決這個問題,小幫手會建議在 hasPosition = direction <> 0 and position <> 0 and filled <> 0; 這行下面加上

if not hasPosition then direction = 0;

就可以避開 direction 不為0 但 hasPosition 卻是False (空手)的狀況。

 

另外,您的腳本中有用到指數移動平均,而該指標是需要前期運算值的。

小幫手會建議您將資料讀取筆數設長些 (指數移動平均長度 * 4) 才能夠計算出正確的數值。(ex. setTotalBar(120*4);)

 

若您的Log檔太大,小幫手會建議您將壓縮後的Log放到雲端空間,再將連結附在Mail中即可。

iker 發文於   2023/01/13

Hi 小幫手

感謝回覆,我再試試看。
(昨天有手動排除掉一些多餘的log,附上壓縮過Log檔連結寄到信箱了,也再麻煩你們確認一下是不是你說的這個問題。)

關於用到移動平均條件需要設 SetTotalBar 長度的問題有點不太懂:

1. 請問是因為斜率取了 4 期,所以需要取至少 4 倍才能算出正確數值嗎?
2. 如果 SetTotalBar 只設了 120,這樣斜率運算的前三期系統默認會是帶入什麼值去計算呢?直接把資料長度不夠的部分視為 0 嗎?
3. SetTotalBar 加長會很吃計算效率,加上我只需要當下運算的斜率,並不會參考前 n 期斜率,改成設 SetBarBack 設 120 * 4,SetTotalBar 設 1 能取代直接加長 SetTotalBar 嗎?

 

 

XQ小幫手 發文於   2023/01/13

Hello iker,

 

您的這個問題是出在腳本撰寫上,和系統運作比較沒有關係。

所以並不需要檢查 Log,小幫手和您要Log只是確保如果問題是和系統設定運作有關的話,不需要額外再跟您要求相關資訊,減少花費的時間。

只要在腳本下方加上 print(date, time,direction, hasPosition); 您就可以看到回測2022/01/06 - 2023/01/06時在 4/27 以後印出的 direction 跟 hasPosition 都會是 -1.000000 FALSE 。

這就會讓腳本不再進到交易判斷式裡面。

造成這個狀況的原因就如同小幫手上面回覆所說。

 

關於 SetTotalBar 的部分:

跟LinearRegAngle沒有關係,是EMA(close, 120)計算出來的值會出錯。

您可以實際把EMA(close, 120) print 出來和指標上面比對,就會發現兩者不同。

而這是因為EMA在運算時會取前期的值來做運算 (ex. EMA = EMA[1] + Factor * (thePrice - EMA[1]);)。

所以需要經過一定期數的運算,得到的值才會和技術線圖相同,這個所需期數大約為EMA長度的4倍。

如果您覺得消耗資源的話,或許可以改為計算移動平均 (average),這樣就不必設定那麼長的期數,因為average在運算時不會取用前期值。

iker 發文於   2023/01/13

感謝回覆

iker 發文於   2023/01/15

另一個警示腳本前兩天回測都正常,連續回測都能得到相同結果,但在昨晚稜凌晨2點開始, 一直到現在每次回測結果都不同。

一樣是參數不變、回測範圍不變,停損利也不變。

已經將LOG、腳本、回測報告寄到信箱,麻煩看看是什麼情況造成連續送出後、得到完全不同的回測結果

XQ小幫手 發文於   2023/01/18

Hello iker,

 

小幫手這邊會請相關人員確認看是否能找出原因。

感謝。

XQ小幫手 發文於   2023/02/02

Hello iker,

 

經相關人員確認,您的問題是因為有些內建腳本撰寫上出錯所導致。

目前伺服器的部分已經更新完畢,所以現在重新回測已經不會發生問題。(參考附圖)

本機端的部分則是預計在近一次改版中更新。

附加文件

iker 發文於   2023/02/03

Hi 小幫手

感謝協助排查

不過有點聽不懂您所指的內建腳本,想請問這是指server端收到請求時,處理回測必須運行的特定腳本嗎?

還是您的意思是我的腳本裡用到的特定系統內建函式會造成這個問題?如果是這個情況,方便告知是哪個函式會有問題的嗎?

顯示更多回應 發表回覆
Close