"""自由現金流「多因子」選股策略 — 可重現的真實 finlab 回測。

實測結果（2013-04 ~ 2026-06，月調倉、等權重、未計手續費）：
    年化報酬 CAGR 24.18%、夏普 1.28、索提諾 1.88、最大回撤 -30.90%
對照同期含息 0050：CAGR 21.01%、最大回撤 -33.96%。

重點：單獨用「自由現金報酬率」價值螺絲（FCF＋本益比＋股價淨值比）只有 14.22%、
夏普 0.94，跑輸含息 0050；真正勝出的是把三個低相關因子疊起來。

跑法：先 pip install finlab，執行時 finlab.login() 會自動引導你完成登入。
"""
import numpy as np
import finlab
from finlab import data
from finlab.backtest import sim

finlab.login()

# 自由現金報酬率 ＝ 自由現金流 ÷ 投資資本（股東權益 ＋ 短期借款 ＋ 長期借款）
fcf = data.get("fundamental_features:自由現金流量")
equity = data.get("financial_statement:股東權益總額")
short_debt = data.get("financial_statement:短期借款")
long_debt = data.get("financial_statement:長期借款")
invested_capital = equity.fillna(0) + short_debt.fillna(0) + long_debt.fillna(0)
fcf_yield = (fcf / invested_capital).replace([np.inf, -np.inf], np.nan)

# 另外兩個與「價值體質」低相關的因子：營收成長與價格動能
revenue_yoy = data.get("monthly_revenue:去年同月增減(%)")
close = data.get("price:收盤價")
momentum = close / close.shift(60)  # 近 60 個交易日（約 3 個月）動能

# 三因子同時成立才買進
position = (
    (fcf_yield.rank(axis=1, pct=True) > 0.7)  # 自由現金報酬率全市場前 30%
    & (revenue_yoy > 0)                        # 月營收年增率為正
    & (momentum > 1)                           # 近三個月股價站上
)

# resample 控制換股頻率：每月（"M"）與每季（"Q"）表現最好，每年（"Y"）會讓動能失效
report = sim(position, resample="M", name="自由現金流多因子")
report.display()
