警示腳本回測股價新高問題

  •   3 
  • 最後發表   Hiyang  37 分鐘前
Hiyang 發文於   2026/09/14

 

 

您好,我使用 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 謝謝!

Hiyang 發文於   2026/09/14

附上TEST 0, TEST A, TEST B的REPORT檔案

附加文件

發表回覆
Close