"""動能投資策略 — 與 /blog/momentum-strategy 同口徑的完整可重現程式。

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

    pip install finlab
    python strategy.py

包含:原始 12-1 動能(前 30、月換股,實測輸 0050)與複合動能優化版
(複合動能 + ROE>10 + 營收 YoY>0、季換股、前 10),數字與文章一致。
"""
import finlab
from finlab import data
from finlab.backtest import sim

finlab.login()  # finlab 會自動引導登入

adj = data.get("etl:adj_close")
roe = data.get("fundamental_features:ROE稅後")
yoy = data.get("monthly_revenue:去年同月增減(%)")

# ---- 原始 12-1 動能:過去 12 個月報酬扣掉最近 1 個月,選前 30 檔,月換股 ----
mom_12_1 = adj.pct_change(252) - adj.pct_change(21)
position_simple = mom_12_1.is_largest(30)
report_simple = sim(position_simple, resample="M", fee_ratio=0.001425, tax_ratio=0.003, upload=False)
report_simple.display()
print(report_simple.get_stats())

# ---- 複合動能優化版:3 月與 6 月動能都為正 + ROE>10 + 營收 YoY>0,季換股,前 10 ----
mom_3m = adj.pct_change(60)
mom_6m = adj.pct_change(120)
pool = (mom_3m > 0) & (mom_6m > 0) & (roe > 10) & (yoy > 0)
position_composite = mom_6m[pool].is_largest(10)
report_composite = sim(position_composite, resample="Q", fee_ratio=0.001425, tax_ratio=0.003, upload=False)
report_composite.display()
print(report_composite.get_stats())
