跳至主要內容

月營收動能選股(10 檔集中版)

回測視窗 2015-02-11 〜 2026-06-18 · 資料截至 2026-06-20

以五日平均漲跌幅動能、站上 20/60/120 日均線的多頭趨勢,加上近三月平均營收高於近十二月平均的營收動能選股,持有 10 檔。2015 年至 2026 年台股回測年化報酬 50.0%、日夏普 1.46、最大回撤 -35.5%;同視窗 0050 含息年化 21.3%。

投資警語:本文僅供教學參考,不構成投資建議。過去績效不代表未來表現,投資有風險。

回測績效

年化報酬率
50.0%
日夏普
1.46
最大回撤
-35.5%
總報酬率
9847%
平均持股
10.0 檔

回測含手續費 0.1425% 與賣出證交稅 0.3%(finlab 套件 sim() 預設成本),日夏普未扣無風險利率。策略淨值自資料可得日(2015-02-11)起算。

淨值曲線(對數座標)

月營收動能選股(10 檔集中版) vs 0050 買進持有(含息)
1x2x3x5x8x12x20x30x50x80x2015-02-112017-01-092018-11-282020-10-292022-09-222024-08-262026-06-18
月營收動能選股(10 檔集中版)0050 買進持有(含息)

與 0050 含息買進持有對照

對象年化報酬率日夏普最大回撤統計視窗
月營收動能選股(10 檔集中版)50.0%1.46-35.5%2015-02-11 〜 2026-06-18
0050 買進持有(含息)21.3%1.08-34.0%2015-01-01 〜 2026-06-20

完整策略程式碼

安裝 finlab 套件後即可直接執行重現(finlab.login() 會自動引導登入,不需手動填 token)。想用 AI 輔助安裝與跑第一次回測,可以走 安裝教學

展開程式碼(strategy.py)
"""月營收動能選股策略 — 與 /blog/monthly-revenue-momentum 同口徑的完整可重現程式。

回測視窗 2015-01-01 ~ 2026-06-20。執行前先安裝 finlab 並登入(finlab 會自動引導):

    pip install finlab
    python strategy.py

三個版本對照(原始 10 檔集中 / 加流動性過濾 / 分散 20 檔 + 部位上限)與 0050 含息基準,
數字與文章、互動式回測報告完全一致。
"""
import finlab
from finlab import data
from finlab.backtest import sim

finlab.login()  # finlab 會自動引導登入,不需手動填 token

close = data.get("price:收盤價")
volume = data.get("price:成交股數")
rev = data.get("monthly_revenue:當月營收")

# 訊號:五日平均漲跌幅(動能)+ 站上 20/60/120 日均線(多頭趨勢)+ 近三月均營收 > 近十二月均營收
pct_change = (close / close.shift() - 1).rolling(5).mean()
trend = (close > close.average(60)) & (close > close.average(20)) & (close > close.average(120))
rev_up = rev.average(3) > rev.average(12)
liquid = volume.average(20) > 500 * 1000  # 平均日成交 > 500 張,排除低流動性個股

# 版本一:文章主策略 — 動能最強的 10 檔,月再平衡(營收公布後第 11 天),10% 停損
position = pct_change[trend & rev_up].is_largest(10).loc["2015-01-01":"2026-06-20"]
report = sim(position, resample="M", resample_offset="11D", stop_loss=0.1, upload=False, name="月營收動能10檔")
report.display()
print(report.get_stats())

# 版本三:分散 20 檔 + 單檔部位上限 8%(降低單一個股風險的替代版本)
position_div = pct_change[trend & rev_up & liquid].is_largest(20).loc["2015-01-01":"2026-06-20"]
report_div = sim(position_div, resample="M", resample_offset="11D", stop_loss=0.1,
                 position_limit=0.08, upload=False, name="月營收動能20檔")
report_div.display()
print(report_div.get_stats())
到 FinLab Studio 重現這支策略

在 Studio 裡用同一套真實資料調整條件、重跑回測。

本頁策略與回測結果僅供教學與研究用途,詳見服務條款