大盤濾網選股

  •   523 
  • 最後發表   joE0403  2025 四月 02
joE0403 發文於   2025/02/16

請問以下寫法哪裡有問題?
在大盤位於均線之下時還是有成功的選股

settotalBar(300);

// 宣告參數

input: _length(240, "240日均線期數");

 

// 宣告變數

var: _indexClose(0), _ma(0);

 

//// 獲取台灣加權指數的收盤價

_indexClose = GetSymbolField("TSE.tw", "收盤價", "D"); 

 

// 計算240日均線

_ma = Average(_indexClose, _length);

 

// 設定選股條件

if _indexClose > _ma then

    ret = 1; 

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

(1)不清楚你使用的頻率是否為日頻率且選股範圍是否為普通股全部。

(2)若(1)的答案是日頻率且選股範圍為普通股全部,若沒有其他選股條件,則應該所有普通股都會被選出來,因為目前大盤收盤價在240天均價之上。

joE0403 發文於   2025/02/16

許教授您好,答案是(1)日頻率且選股範圍為普通股全部
但是回測日期選擇到2022/04~12月還是有股票被選出來,所以不知道問題在哪裡

虎科大許教授 發文於   2025/02/16

除了_indexClose > _ma,沒有其他選股條件?

joE0403 發文於   2025/02/16

沒有,就是單純測試以上的程式碼,2022/04~12月大盤在240均線之下,所以應該一隻股票都選不出來才對

虎科大許教授 發文於   2025/02/16

(1)跨頻率或跨商品運算,最好不要透過變數處理。程式碼可更改如下:

// 宣告參數

input: _length(240, "240日均線期數");

// 設定選股條件

if GetSymbolField("TSE.tw", "收盤價", "D") > Average(GetSymbolField("TSE.tw", "收盤價", "D"), _length) 

then ret = 1;

(2)2022/4/6大盤的收盤價高於240日均價,所以2022/4/7會有訊號。至於有一些股票會在4/8(1418東華)、4/12(6574霈方)、4/13(4419皇家美食)等等,都是在4/6有成交量,但過後的成交量都是0(1418東華4/7成交量為0,所以4/8進場,6574霈方4/7、4/8、4/11成交量都是0,所以4/12進場,4419皇家美食4/7、4/8、4/11、4/12成交量都是0,所以4/13進場)。

 

joE0403 發文於   2025/02/16

謝謝教授,改為(1)的程式碼後,執行"選股"2022/4/7~2022/4/12只會選出8080泰霖,
如果執行選股"回測"的話就像您(2)上述所說的情況,請教為什麼執行選股,跟回測,會有不同狀況產生?
另外想請問如果跨頻率跨商品選股,建議寫在同一腳本,或是像圖片中可以分開寫,需要時再組合,哪種方式比較不會出錯,還是沒差?

虎科大許教授 發文於   2025/02/16

(1)8080泰霖在2022/4/6之後到2022/5/5之前是停止交易的,照理說,這段期間由於大盤收盤價低於240日均價,應該是沒有股票會被選出來;我不清楚為何沒交易的股票反而被選到。

(2)若跨頻率,最好三個選股策略的程式碼都寫在一個選股策略裡面。你圖片的做法,很容易有邏輯錯誤的問題。

joE0403 發文於   2025/02/17

謝謝許教授,我以為圖中的做法系統會分開執行,取交集
關於(1)選股問題希望小幫手可以幫忙解惑

XS小編 發文於   2025/02/19

Hello joE0403,

 

Average(_indexClose, _length) 這種寫法會因為 _indexClose 是否有值而改變,雖然您將資料讀取筆數設為300,但如果 "執行商品" 的歷史資料不夠長的話也無法計算300筆 (也就是變數有值的長度不夠長)。

因此計算出的大盤平均值會出錯,建議使用 Average(GetSymbolField("TSE.tw", "收盤價", "D"), _length) 的方式來計算。

您可以在腳本中加上print印出相關數值的話會比較容易理解。

由於選股預設會取得使用欄位的所有資料,故不需要那麼長的資料讀取筆數。

 

另外小編個人會建議將不同頻率的條件分開寫會較為單純 (所需的資料讀取筆數也可以分開設定),除非不同頻率的條件會用簡單的and或or以外的方式作組合。

不然分開寫的話每個腳本都是分開獨立運算判斷,最後才視策略組合(and / or)方式來決定篩選出來的商品。

小小的茶米 發文於   2025/03/30

我也遇過一樣的問題,我是用分k跑自動交易回測

value993 = GetSymbolField("TSE.TW","close","D");

condition995 = value993 >= value993[1];

正常來說是加權要高於前一日才會選出股票

結果回測數據在2024/12/19也是跑出好幾檔

但如果改成日k回測就沒這問題

顯示更多回應 發表回覆
Close