您好,我使用 XS 警示腳本做歷史回測時,發現幾種我以為等價的寫法,最後卻得到不同的警示訊號數量,希望協助確認原因及官方建議寫法。
測試商品:3530 晶相光
回測期間:2020/01/01~2026/06/30
Test 0:直接使用 GetField
SetTotalBar(900);
condition1 = GetField("收盤價", "D") > Highest(GetField("收盤價", "D")[1], 720);
if condition1 then
ret = 1;
結果:6 筆訊號,2021/07/05~2021/07/16。
Test A:先存入變數
SetTotalBar(900);
Vars:
dClose(0);
dClose = GetField("收盤價", "D");
condition1 =
dClose > Highest(dClose[1], 720);
if condition1 then
ret = 1;
結果:8 筆訊號,2021/06/17~2021/07/16。
Test B:再加入不影響 ret 的資料欄位 GetField("外資持股比例", "D")[60]
SetTotalBar(900);
Vars:
dClose(0),
foreign60(0);
dClose = GetField("收盤價", "D");
foreign60 = GetField("外資持股比例", "D")[60];
condition1 =
dClose > Highest(dClose[1], 720);
if condition1 then begin
if foreign60 > 0 then
ret = 1
else
ret = 1;
end;
因為 foreign60 不論大於 0 與否都會 ret=1,理論上不應改變原本條件,但結果變成 19 筆訊號,多出 2020/01~2021/06/04 區間的訊號。
因此目前結果是:
直接 GetField → 6 筆
存成 dClose 變數 → 8 筆
再加入 foreign dependency → 19 筆
想請教:
1. 為什麼 Highest(GetField("收盤價","D")[1],720) 與先指定 dClose = GetField("收盤價","D") 再使用 Highest(dClose[1],720),會得到不同歷史結果?
2. 加入一個完全不影響 ret 邏輯的 GetField("外資持股比例","D")[60],為什麼又會使訊號由 8 筆變成 19 筆?是否與資料可用起始日、preload 或腳本實際開始運算的位置有關?
3. SetTotalBar(900) 是否能保證上述三種寫法的 720 日歷史窗口一致?如果不能,應如何設定?
4. 我的實際用途是在同一支警示腳本中,以固定 Mother condition (如範例的condition1)產生訊號,再計算數百個不同 Factor (如範例的GetField("外資持股比例", "D")[60]) 去print出來。請問官方建議應如何撰寫,才能保證新增 Factor時,不會改變原本 Mother 的訊號數量與結果?
請參考附件的Report檔案 如果有需要我補充的我會再提供log 謝謝!
1 評論