5 個步驟設定選股條件,股票爆發力更上一層樓!

策略公開,大部分都會無效化,唯有自己打造,永不失效

我們在新的選股平台中,分享了一堆策略,但是這些是公開的策略,大家都看得到,所以難保之後不會失效。所以唯有打造自己的策略,你才更有底氣,在股票市場中生存!

設計股票策略,對剛開始進入股市,或是剛使用選股系統的人來說,並不簡單。我有看過初學者,花很多精力,直接爆寫長達 100 行程式碼選股,用了超多條件,但效果還是不太好。所以決定分享一個 SOP,只要遵照以下幾個步驟,通常都可以找到不錯的策略,量化交易不難,而設計策略其實可以很單純。

1. 尋找因子

這邊說的因子,也不是什麼特別的東西,而是日常所使用的一些指標,可以是「股東權益報酬率」或是「RSI」指標,不論是技術面或是基本面,只要是可以量化的數值,都可以拿來當作因子。可以到我們的資料庫搜索看看,是否有你感興趣的資料。我們提供了大部分股票的資料,除了分點券商外(太貴還沒買),你想的到的因子都可以製作。目前(2021/11/21)完全免費,你可以趁這個時機全部下載下來試試看。

2. 判定效果

找到了想選股的資料,我們要先確定因子是否有效果,你要設計一個條件式,來測試單一因子是否有選股的效果。以「股東權益報酬率」來說明,我會設計從寬鬆到嚴苛,撰寫選股條件,範例如下:

from finlab import data
roe = data.get('fundamental_features:ROE稅後')

roe_rank = roe.rank(axis=1, pct=True)
stocks1 = roe_rank > 0.2 # 寬鬆,選擇前 80% 的股票
stocks2 = roe_rank > 0.4
stocks3 = roe_rank > 0.6
stocks4 = roe_rank > 0.8 # 嚴苛,選擇前 20% 的股票

我會將上述四個條件都試試,回測總報酬率或是夏普值,以程式碼中的 stocks4 為範例:

from finlab import backtest

report = backtest.sim(stocks4, resample="Q", fee_ratio=0, tax_ratio=0))

這邊的換股頻率是「每季 (Q)」,因為「股東權益報酬率」是每個季度會公佈,所以我們只關注每季價格的變化,但假如你的指標是價格,則可以使用其他的頻率,例如「每週 (W)」或是「每月 (M)」。有些人製作因子,也會用「近四季平均或累計」來表示,並且以「每年 (A)」為單位換股,這樣也是可以的。假如上述回測有長期打贏大盤,那可以說,這個因子可能是有用的!

但很多人看回測看的是「報酬率累計是否比大盤高」,這是不正確的做法,一個極端的例子就是,當一個策略報酬率如下:

  • 第一天比大盤多 3%
  • 之後每一天都跟大盤的報酬率一模一樣。

這樣此策略的「報酬率累加」永遠都比大盤的高,但實際交易並沒有顯著的效果。所以平常除了看 alpha beta sharpe 之外,也可以目測「報酬率累計跟大盤差距越來越大」,假如有的話,才代表此因子時時刻刻都在發揮作用。

3. 決定是否棄用因子

假如你發現此因子沒有任何作用(回測都比大盤爛),請你先直接棄用,而不是加入其他的因子。有點像是蓋大樓,假如地基沒有打穩,地震就會垮。你要設想 2000 檔股票裡面,其實只有幾檔是寶,假如今天用了差勁的因子不小心過濾移除了,錯過挑選它的好機會,有可能只選出一些烏合之眾,就算再用好的濾網,也選不出好股票。所以請直接將此因子移除吧!

4. 篩選條件

當做完上述檢測,你發現這個因子真的有用!就可以開始針對因子設定條件,你可以將第二步驟已經回測的數據拿出來,例如總報酬率如下(示意):

  1. 篩選出前 80% 的股票:總報酬 300%
  2. 篩選出前 60% 的股票:總報酬 500%
  3. 篩選出前 40% 的股票:總報酬 700%
  4. 篩選出前 20% 的股票:總報酬 700%

以上四種條件,從寬鬆到嚴格,你會使用哪一個條件呢?要記住我們的目的在於「總體報酬率高」及「有效分散風險」,前者當然是為了賺錢,而後者是為了「少賠錢」。有了以上得目的,相信你不難選出第三個:「篩選出前 40% 的股票」當作是最佳的條件了。你會發現 3 跟 4 篩選出的股票數量不同,但是報酬率都差不多,在同樣的報酬率下,越多股票對你越有利,除了分散風險外的好處,由於樣本數多,也不太會過擬合。還有額外的好處是:你保留足夠多的股票,可以再加入其他的因子來篩選出更有上漲潛力的股票。

5. 重複 1~4 步驟

假如你留有足夠多的股票,這時候就可以再加入因子,看看是否能提升報酬率。有些因子之間會有加成效果,而有些則沒有。你甚至可以調整因子篩選的順序,不過會建議主要的因子不要再改順序了,除非你想做一個完全不同的策略。至於到底有多少因子才夠呢?其實並不一定,但最終目的是篩選出 20~30 檔股票以內,畢竟太多股票對一般人來說也是很難一次買齊。

選擇較少股票,這其實是一件不容易的事情,因為股票少,整體投資組合勢必波動變大。因此在股票少的狀況下,必須確保策略報酬波動小,就是這個階段的關鍵。

新因子額外篩選股票,程式的寫法,如下:

stocks4 = (stocks4 * new_factor).is_largest(30)

其中 stocks4 就是原本篩選出來的股票,數值為 0 (False) 或 1 (True) 代表是否被選入,而 new_factor 就是新因子,這樣就可以用新的因子篩選出前 30 名的股票,這邊的 new_factor 是大於零,且越大越好。假如所有股票的 new_factor 同時有正負,要記得加上一個 threshold,讓 new_factor + th 的數值一定為正:

stocks1 = (stocks1 * (new_factor + th)).is_largest(10)

組合好就可以將篩選完的股票進行回測囉!

backtest.sim(stocks1, resample='Q')

以下還有一些複雜的方法,但是個人覺得用以上的方法找好策略已經綽綽有餘,除非你每一種因子都已經玩很無聊,那以下比較進階的方法就適合你:

進階:非線性

這個世界並不是線性的,以上述的範例「股東權益報酬率」來說,我們只是假設其數值越高越好,將因子與績效之間的關係假想成是線性。但現實生活中,報酬率與因子之間可能是非線性的,例如「股東權益報酬率」太高,有可能會有均值回歸的狀況發生,使未來股票走勢不好。假如希望可以做的更精細,可以在上述第四步驟中,再額外調整篩選股票的區間段,例如將股票依照因子大小分成五份來回測。

進階:N 階因子

另外,上述步驟中,是假設因子之間並沒有關連,但事實上它們之間會交互作用,例如你單純買「投信買進」的股票可能沒什麼用,但是假如你買「股價暴跌投信還買進」的股票,可能就有用。可以在上述第四步驟中,再額外加入這種反向因子,但是條件越多就會越複雜,要盡量避免過於複雜而導致過擬合喔!

總結

選股策略千百種,上述方法是我覺得一定可以產生出好策略的 SOP,但關鍵在於,不要盲目加入一堆條件,把好的股票都篩掉了!要慎選因子。現在就開始使用我們免費公開的超好用回測系統來選股吧!

https://ai.finlab.tw

FinLab - 韓承佑

嗨大家好,我是韓承佑,FinLab創辦人,畢業於巴黎薩克雷大學資工博士,目前擔任臺灣量化交易協會 學術顧問、台北商業大學 創新育成中心 創業技術顧問與上市科技公司 量化交易顧問。當初,我喜歡寫程式、無意間因為軟體比賽接觸Fintech,從此開始了財經跟程式的學習之路。我們成立 FinLab 量化投資部落格,用自己研發的軟體,對台灣股市做大量快速的實驗。希望可以在量化投資的路上,當大家的「武器製造商」!