動能策略很常用到「股價創新高」這個條件,所謂的動能策略簡單說就是追突破,通說認為創新高的股票比較少套牢壓力,上漲的延續性較高。反之股價無創新高的股票,可能在上漲過程跌跌撞撞,一漲上去可能就被套牢賣壓打下來。
但股價創新高這麼廣為人知的突破策略真的有用嗎?趕緊來回測驗證一下
股價創新高策略範例
程式碼
from finlab.backtest import sim
from finlab import data
# 標的範圍為上市櫃普通股
with data.universe(market='TSE_OTC'):
# 取得收盤價
close = data.get("price:收盤價")
# 股價創近200日新高
position = (close == close.rolling(200).max())
# 每兩週再平衡,單檔最大持股比例限制20%,停損20%
report = sim(position, resample="2W", position_limit=0.2, stop_loss=0.2, name="股價創新高策略")
report.display()
選股條件
程式很簡單,這是一個偏短線的技術面策略,不用幾行就可以開發完成,只有了一個股價創新高條件和一些回測基本設定。
主要條件為:
- 標的範圍為上市櫃普通股
- 股價創近200日新高,天數越高,則壓力越小
- 每兩週再平衡
- 單檔最大持股比例限制20%,避免個股單壓的非系統性風險
- 停損20%
回測結果
年化報酬率為17.7%,幾乎每年都獲利,至今只有兩個年份虧損,困難年份2008、2018、2022年的表現優於大盤,但困難年份 2011 表現不好。以報酬率表現來說,該因子表現不錯。
但夏普率和最大下跌和大盤風險差不多,並無明顯優勢。
策略優化
上述策略的缺點在只有近一天突破就買,你可能會「買到假突破的標的」、「錯過前幾天突破小拉回的好標地」。
一個動能夠強的標的,短期不會只有一天創新高,而是「連續挑戰新高」,創新高越多次,代表動能越強,這樣的訊號除了確認訊號強度,也可把前幾天有突破,近期小回檔的強勢股納進來,將時間條件更有彈性,比較不會錯過飆股,你時間定的越死,會很吃選股日當日訊號的運氣。
為了更確認訊號及囊括近期強勢標的,我會使用FinlabDataFrame的語法糖 sustain 去判斷訊號強度延續性。
程式範例
from finlab.backtest import sim
from finlab import data
with data.universe(market='TSE_OTC'):
close = data.get("price:收盤價")
# 近5日內有3日以上的股價創前200日新高
position = (close == close.rolling(200).max()).sustain(5,3)
report = sim(position, resample="2W", position_limit=0.2, stop_loss=0.2, name="創新高延續動能策略")
report.display()
選股條件
只將創新高條件加入強度延續性判斷,為公平比較,其餘條件相同。
- 標的範圍為上市櫃普通股
- 近5日內有3日以上(含)的股價創前200日新高。
- 每兩週再平衡
- 單檔最大持股比例限制20%,避免個股單壓的非系統性風險
- 停損20%
回測結果
年化報酬率為25.9%,比原先的17.7%大幅上升,幾乎每年都獲利,困難年份2008、2011、2018、2022年的表現優於大盤。
夏普率明顯提升到1.1,最大下跌和下跌幅度曲線比原先收斂不少,長時間都能比大盤有更小的回檔風險。
結論
經過小小的觀念和語法調整,卻能讓策略大幅優化!是不是很神奇呢?
如果你的策略也有用到「股價創新高的條件」之類的突破策略,可以試試加入 sustain 語法,看看會不會有優化的效果。甚至將 sustain 語法應用到其他條件。