# 程式交易入門範例:三因子複合排名選股,月頻自動換股
# 環境:pip install finlab;首次執行會要求登入 finlab 帳號(免費)
# 回測區間:2013-05 ~ 2026-06(台股全上市櫃),含手續費與證交稅
from finlab import data
from finlab.backtest import sim

# Step 1. 取台股資料(收盤價、成交量、月營收年增、ROE、股價淨值比)
close   = data.get('price:收盤價')
vol     = data.get('price:成交股數')
rev_yoy = data.get('monthly_revenue:去年同月增減(%)')   # 成長
roe     = data.get('fundamental_features:ROE稅後')       # 品質
pb      = data.get('price_earning_ratio:股價淨值比')     # 價值(低 PB)

# Step 2. 流動性過濾:近 20 日均量大於 200 張,避免回測買得到、實單買不到
liquidity = vol.average(20) > 200_000

# Step 3. 三因子 rank-weighted 複合分數(各因子轉百分位再相加,不用 AND 避免持股太少)
score = (
    rev_yoy.rank(axis=1, pct=True)
    + roe.rank(axis=1, pct=True)
    + (1 - pb.rank(axis=1, pct=True))
)

# Step 4. 只在流動性足夠的股票池內,取分數前 20 名
position = score[liquidity].is_largest(20)

# Step 5. 月頻換股,延後 14 天對齊月營收公布日(捕捉公布後的資訊優勢)
#         fee_ratio 用台股手續費 6 折;sim() 預設已扣賣出證交稅 0.3%
report = sim(
    position,
    resample='M',
    resample_offset='14D',
    fee_ratio=1.425 / 1000 / 3,
    name='程式交易三因子複合策略',
)
report.display()  # 互動式儀表板:權益曲線、月報酬熱力圖、年度績效
