月營收切換策略:每月10日前採用上月數據,10日後切換至最新營收

  •   379 
  • 最後發表   師哥  2025 二月 03
師哥 發文於   2025/01/22

各位先進,小弟再回測時用內建的月營收年增>0作為篩選條件之一,但是發現實際情況不相符,往往遇到每個月十號前後,都遇到月營收彼此不相符的狀況。所以小弟試著寫出,如果每個月十號後用最新的月營收數據,十號前用上個月的月營收數據,可是雖然編譯成功,但是無法跑出資料,不知道哪裡出現bug。請各位先進指點迷津,謝謝。


SettotalBar(100);

input: ratio(5,"月營收年增率門檻");

 

var: selected_value(0);

 

// 獲取月營收數據

value1 = GetField("月營收年增率");        // 最新的月營收數據

value2 = GetField("月營收年增率")[1]; // 上個月的月營收數據

 

 

// 判斷日期是否為 10 號或之後

if DAYOfMonth(Date) > 10 AND value1 > ratio then begin

    value88 = value1;

end;

if DAYOfMonth(Date) <= 10 AND value1 > ratio then begin

    value87 = value2;

end;

 

// 輸出結果

outputfield(1, value1, 0, "最新月營收數據");

outputfield(2, value2, 0, "上個月的月營收數據");

outputfield(3, selected_value, 0, "選定的月營收數據");

 

排序方式: 標準 | 最新
虎科大許教授 發文於   2025/01/22

由於你使用預設頻率跑選股腳本,營收預設的是月頻率,所以跑不出結果,另外,用outputfield若沒ret=1,也無法顯示結果。改成下列寫法看看。

setBarFreq("D");
SettotalBar(100);
input: ratio(5,"月營收年增率門檻");
var: selected_value(0);
if symbol="2330.TW" then 
    begin
        // 獲取月營收數據
        value1 = GetField("月營收年增率","M");        // 最新的月營收數據
        value2 = GetField("月營收年增率","M")[1]; // 上個月的月營收數據
        // 判斷日期是否為 10 號或之後
        if DAYOfMonth(Date) > 10 AND value1 > ratio then
            value88 = value1
        else
            if DAYOfMonth(Date) <= 10 AND value1 > ratio then
                value87 = value2;
        print(date,"最新月營收數據",value88,"上個月的月營收數據",value87);
        ret=1;
        outputfield(1, value1, 2, "最新月營收數據");
        outputfield(2, value2, 2, "上個月的月營收數據");
    end;

師哥 發文於   2025/01/22

謝謝許教授解惑!

另外請問要怎麼把symbol="2330.TW"
改成所有的普通股呢?

謝謝

虎科大許教授 發文於   2025/01/22

 

setBarFreq("D");
SettotalBar(100);
input: ratio(5,"月營收年增率門檻");
// 獲取月營收數據
value1 = GetField("月營收年增率","M");        // 最新的月營收數據
value2 = GetField("月營收年增率","M")[1]; // 上個月的月營收數據
// 判斷日期是否為 10 號或之後
if DAYOfMonth(Date) > 10 AND value1 > ratio then
    value88 = value1
else
    if DAYOfMonth(Date) <= 10 AND value1 > ratio then
        value87 = value2;
print(date,"最新月營收數據",value88,"上個月的月營收數據",value87);
ret=1;
outputfield(1, value1, 2, "最新月營收數據");
outputfield(2, value2, 2, "上個月的月營收數據");

師哥 發文於   2025/01/23

謝謝許教授!

再請問許教授,我看他跑出來一次都18xx檔,要加入什麼語法才可以把符合10號後用最新月營收,10號前用上個月營收,且value1 > ratio篩選出來呢? 

謝謝

虎科大許教授 發文於   2025/01/23

選股策略只能根據最新收盤數據選股,亦即你今天只能用封關日1/22日的數據判斷。

setBarFreq("D");
SettotalBar(100);
input: ratio(5,"月營收年增率門檻");
// 獲取月營收數據
value1 = GetField("月營收年增率","M");        // 最新的月營收數據
value2 = GetField("月營收年增率","M")[1]; // 上個月的月營收數據
// 判斷日期是否為 10 號或之後
if DAYOfMonth(Date) > 10 AND value1 > ratio or
    DAYOfMonth(Date) <= 10 AND value2 > ratio then
    begin
        ret=1;
        outputfield(1, value1, 2, "最新月營收數據");
        outputfield(2, value2, 2, "上個月的月營收數據");
    end;

  • 按讚來自於
  • sky911191
師哥 發文於   2025/01/25

謝謝許教授! 

XS小編 發文於   2025/02/03

Hello 師哥,

 

小編補充,您可以使用 GetFieldDate 來確認取得的資料對應日期。

就您的描述來看,10號前後是各家公司更新月營收的時間點,可能是各家公司更新的時間點不一致導致篩選結果不如預期。

發表回覆
Close