自由現金流多因子(現金流報酬率+營收+動能)
自由現金流除以投資資本(股東權益+長短期借款)排名全市場前 30%,同時要求月營收年增率為正、近三個月股價動能站上,每月等權換股,把「會產生現金的公司」加上成長與價格確認。2018 年至 2026 年台股回測年化報酬 24.5%、日夏普 1.31、最大回撤 -30.9%;同視窗 0050 含息年化 24.5%、最大回撤 -34.0%。
投資警語:本文僅供教學參考,不構成投資建議。過去績效不代表未來表現,投資有風險。
回測績效
- 年化報酬率
- 24.5%
- 日夏普
- 1.31
- 最大回撤
- -30.9%
- 總報酬率
- 550%
- 平均持股
- 163.5 檔
回測含手續費 0.1425% 與賣出證交稅 0.3%(finlab 套件 sim() 預設成本),日夏普未扣無風險利率。策略淨值自資料可得日(2018-01-31)起算。
淨值曲線(對數座標)
自由現金流多因子(現金流報酬率+營收+動能)0050 買進持有(含息)
與 0050 含息買進持有對照
| 對象 | 年化報酬率 | 日夏普 | 最大回撤 | 統計視窗 |
|---|---|---|---|---|
| 自由現金流多因子(現金流報酬率+營收+動能) | 24.5% | 1.31 | -30.9% | 2018-01-31 〜 2026-08-20 |
| 0050 買進持有(含息) | 24.5% | 1.17 | -34.0% | 2018-01-01 〜 2026-08-20 |
持股樣本
完整策略程式碼
安裝 finlab 套件後即可直接執行重現(finlab.login() 會自動引導登入,不需手動填 token)。想用 AI 輔助安裝與跑第一次回測,可以走 安裝教學。
展開程式碼(strategy.py)
# ============================================================================
# 自由現金流多因子策略(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()
在 Studio 裡用同一套真實資料調整條件、重跑回測。