策略公開,大部分都會無效化,唯有自己打造,永不失效
我們在新的選股平台中,分享了一堆策略,但是這些是公開的策略,大家都看得到,所以難保之後不會失效。所以唯有打造自己的策略,你才更有底氣,在股票市場中生存!
設計股票策略,對剛開始進入股市,或是剛使用選股系統的人來說,並不簡單。我有看過初學者,花很多精力,直接爆寫長達 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. 篩選條件
當做完上述檢測,你發現這個因子真的有用!就可以開始針對因子設定條件,你可以將第二步驟已經回測的數據拿出來,例如總報酬率如下(示意):
- 篩選出前 80% 的股票:總報酬 300%
- 篩選出前 60% 的股票:總報酬 500%
- 篩選出前 40% 的股票:總報酬 700%
- 篩選出前 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