# ============================================================================
# 自由現金流多因子策略（finlab.finance/strategies/fcf-multifactor 頁面數字來源）
# ----------------------------------------------------------------------------
# 三個條件同時成立才買進，每月等權換股：
#   1. 自由現金流報酬率（自由現金流 ÷ 投資資本）排名全市場前 30%
#   2. 月營收年增率 > 0
#   3. 近三個月（60 個交易日）股價動能 > 1（價格站上三個月前）
# Benchmark：0050 含息（etl:adj_close，純算術買進持有，不經 sim、不含成本）。
# 執行：安裝 finlab 後直接跑（finlab.login() 會自動引導登入）。
# 回測區間：2018-01-01 ~ 2026-08-20；sim() 已內扣手續費 0.1425% 與證交稅 0.3%。
# ============================================================================
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:長期借款')
rev_yoy = data.get('monthly_revenue:去年同月增減(%)')
close = data.get('price:收盤價')

# ---- 因子一：自由現金流報酬率 = 自由現金流 ÷ 投資資本 ------------------------
# 投資資本 = 股東權益 + 短期借款 + 長期借款
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)

# ---- 因子二、三：營收成長與價格動能（與現金流體質低相關的確認訊號）------------
momentum = close / close.shift(60)

# ---- 三個條件同時成立才持有（布林部位，等權重）-------------------------------
position = (
    (fcf_yield.rank(axis=1, pct=True) > 0.7)
    & (rev_yoy > 0)
    & (momentum > 1)
)

# ---- 回測：月換股，finlab 預設已含手續費 0.1425% 與賣出證交稅 0.3% -----------
report = sim(position.loc['2018':], resample='M', name='自由現金流多因子', upload=False)
report.display()
