策略範例
本益成長比
本頁內容5
PEG(Price/Earnings to Growth ratio,本益成長比)衡量股價相對於盈餘成長速度是否合理:PEG 越低,代表股價相對於成長潛力越被低估。這個策略在營收趨勢向上的公司裡挑 PEG 最低的股票,並配合月營收公布的節奏換股,適合想找成長被低估的股票的人。完整說明見 PEG 策略教學。
策略邏輯
- 營收趨勢多頭:3 個月營收均線 ÷ 12 個月營收均線 > 1.1,且當月營收不低於上月的 90%。
- 本益成長比:本益比 ÷ 營業利益成長率。
- 選股:在符合營收條件的股票中,選出 PEG 最小的 10 檔。
- 換股:每月在營收公告截止日換股,停損 10%。
完整程式碼
strategy.py
from finlab import data
from finlab.backtest import sim
rev = data.get('monthly_revenue:當月營收')
rev_ma3 = rev.average(3)
rev_ma12 = rev.average(12)
# 營收趨勢多頭策略
cond1 = rev_ma3 / rev_ma12 > 1.1
cond2 = rev / rev.shift(1) > 0.9
cond_all = cond1 & cond2
pe = data.get('price_earning_ratio:本益比')
營業利益成長率 = data.get('fundamental_features:營業利益成長率')
# 本益成長比
peg = pe / 營業利益成長率
# 本益成長比和原訊號相乘,若不持有則相乘後等於 0
position = peg * (cond_all)
# 原訊號為 0 的不要選
# 若沒加這行且策略只選到 7 檔,之後還是會選 3 檔訊號為 0(不持有)的補足 10 檔
# 執行這行就會排除訊號為 0 的標的
position = position[position > 0]
# 選股挑本益成長比前 10 小的
position = position.is_smallest(10)
# 月營收截止日換股
position = position.reindex(rev.index_str_to_date().index, method='ffill')
report = sim(
position=position, name="策略教學範例:peg_rev", stop_loss=0.1, upload=False
)
report.display()report.display() 會畫出完整的回測報告。
在月營收截止日換股
月營收的日期是次月 10 日,也就是公告截止日。要在這一天換股,position 的 DataFrame 要用營收的 index,不要用收盤價的 index:
reindex:對 position 加上 reindex 月營收的日期索引後,position 的日期會變成每月營收截止日。resample不用設定:使用預設的None,不執行再平衡。把 position 想成「每一列」而不是「每一天」:因為reindex讓每列間隔一個月,執行上就是每隔一個月產生換股訊號。
怎麼調整
- 營收門檻
rev_ma3 / rev_ma12 > 1.1:短期營收均線要比長期高出多少,才算營收趨勢向上。 - 單月門檻
rev / rev.shift(1) > 0.9:當月營收最多可以比上月低多少。 - 持股檔數
is_smallest(10):每次持有 PEG 最小的幾檔。 - 停損
stop_loss=0.1:個股下跌 10% 時出場。
下一步
這一頁有幫到你嗎?