跨頻率回測問題

  •   254 
  • 最後發表   richardchien6  2023 十月 25
richardchien6 發文於   2023/10/13

最近寫了交易策略,回測使用警示回測,並選擇選股
進場腳本使用:季線以上
出場腳本使用:跌破20日低點

策略內容如腳本中,每個月篩選一次,篩選季線以上進場後,跌破20日低點出場

目前出場腳本有使用問題

策略腳本如下

{
1. 月營收 連續3個月成長
2. 毛利率 > 35%
3. 季線以上
}

settotalbar(70);

value1 = GetField("月營收", "M");

value2 = GetField("月營收", "M")[1];

value3 = GetField("月營收", "M")[2];

condition1 = value1 > value2 and value2 > value3;

value4 = GetField("營業毛利率", "Q");

condition2 = close > WMA(close,60);

if condition1 and condition2 and value1 >0 and value4 > 35 and close > 15 and average(volume,5) > 500 then ret = 1;

 

進場腳本:

value1 = WMA(GetField("收盤價", "D"),60);

if GetField("收盤價", "D") > value1 then ret = 1;

 

出場腳本

value1 = lowest(getField("最低價", "D")[1],20);

if GetField("收盤價", "D") < value1 then ret = 1;

print("=====up====");

print("date",date);

print("close",close);

print("收盤價",GetField("收盤價", "D"));

print("最低價",getField("最低價", "D"));

print("20日最低點",value1);

print("=====down===");

回測設定

根據上述跑出的回測數據有誤,不知道是哪個環節出現問題

看2023/10/2號的數據,收盤價並不是23.75,最低價沒有錯,但20日低點也不是17.95

然而2023/9/1的數據,最低價也不是print出來的結果,而是23.8

已附檔

請問程式碼中哪裡有問題呢,麻煩大神或小幫手解惑

附加文件

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

 Hello richardchien6,

 

您使用月頻率作回測,所以印出來的date數值會是月頻率的date (當月的第一日) 而非日頻率的date。

雖然print出來的date顯示是20231002,但其實對應到的日頻率日期應該為 20231013。

9月的部分則是 20230928,為當月的最後一日。

這是使用月頻率非逐筆時的資料對位關係,也就是當月結束時會對到當月的最後一天。

可以將腳本的 date 改為 getfield("Date", "D") 來確認印出的對應日期。

由於回測設定中的結束日期只到2023/10/12,這部分可能有問題,小幫手會請相關人員確認。

richardchien6 發文於   2023/10/18

小幫手您好,謝謝您的解答

回測設定結束日期只到2013/10/12 是因為我設定的時間只到2023/10/12

這裡我有幾個問題想釐清

1. 依照我出場腳本的寫法

value1 = lowest(getField("最低價", "D")[1],20);

if GetField("收盤價", "D") < value1 then ret = 1;

接著

print("收盤價",GetField("收盤價", "D"));

print("最低價",getField("最低價", "D"));

就會print出當月最後一天K棒的收盤價以及最低價

請問這樣的理解是否正確?

 

2. 那我今天想要呈現出的是:

進場後,跌破"近20日低點"出場,該怎麼呈現呢?

以這個回測資料,很明顯不是跌破20日低點出場的

3. 那在這個程式碼中我的value1 = lowest(getField("最低價", "D")[1],20); 究竟是抓到甚麼值呢?

 

感謝小幫手抽空回答

 

XQ小幫手 發文於   2023/10/25

Hello richardchien6,

 

1.是的,這是對位的邏輯,月頻率結束時運算該根Bar,故取得的就會是該月的最後一天。

您可以print或在月頻率上用指標畫出GetField("Date", "D")即可看到對應的日期。

 

2.建議您使用日頻率作回測。

在月頻率上,每次運算都間隔1個月。

跌破近20日低點這個條件本來就很難達成。(同時要滿足當天最後一天且跌破前20日的價格)

 

3.小幫手認為會抓到錯誤的資料,因為lowest本身是使用提高效能的撰寫方式,所以不支援跨頻率。

您可以用 simplowest 來取代,像是 value1 = simplelowest(getField("最低價", "D")[1],20);

這樣抓到的就會是當月最後一日往前20天的最低值。(不包含最後一日)

發表回覆
Close