三項現金流全正 = 飆股?數據告訴你真相
三項現金流全正,真的是飆股嗎?
這是很多投資人相信的「常識」:
「營業現金流正、投資現金流正、融資現金流正 = 好公司 = 飆股」
但數據會說謊嗎?讓我們來驗證。
在 2015-2025 年的台股回測中:
- 三項全正策略年化報酬:4.61%
- 營業正+投資負策略:12.07%
- 優化後策略:25.51%
結果令人驚訝:三項全正反而是最差的!
提醒:以下為歷史回測結果,不代表未來表現。
市場現象:不同現金流組合的績效差異
首先,我們測試所有可能的現金流組合:
請回測以下現金流策略,比較不同組合的績效:
- 三項現金流全正
- 營業現金流正
- 營業正 + 投資負
- 營業正 + 融資負
顯示程式碼
from finlab import data
from finlab.backtest import sim
import pandas as pd
# 取得現金流數據
營業現金流 = data.get('financial_statement:營業活動之淨現金流入_流出')
投資現金流 = data.get('financial_statement:投資活動之淨現金流入_流出')
融資現金流 = data.get('financial_statement:籌資活動之淨現金流入_流出')
vol = data.get('price:成交股數')
# 流動性篩選
vol_filter = vol.average(20) > 300 * 1000
# 策略 A:三項全正
三項全正 = (營業現金流 > 0) & (投資現金流 > 0) & (融資現金流 > 0) & vol_filter
# 策略 B:營業現金流正
營業正 = (營業現金流 > 0) & vol_filter
# 策略 C:營業正 + 投資負(成長股模式)
成長股模式 = (營業現金流 > 0) & (投資現金流 < 0) & vol_filter
# 回測比較
results = []
for name, position in [('三項全正', 三項全正), ('營業正', 營業正), ('成長股模式', 成長股模式)]:
report = sim(position.loc['2015':], resample='M', position_limit=0.1, upload=False)
stats = report.get_stats()
results.append({
'策略': name,
'年化報酬': f"{stats['cagr']:.2%}",
'夏普比率': f"{stats['monthly_sharpe']:.2f}"
})
pd.DataFrame(results)震驚發現:三項全正竟然墊底!
| 策略 | 年化報酬率 | 夏普比率 | 排名 |
|---|---|---|---|
| 營業正+投資負 | 12.07% | 0.58 | 1 |
| 營業現金流正 | 12.03% | 0.58 | 2 |
| 營業正+融資負 | 11.69% | 0.57 | 3 |
| 自由現金流正 | 10.60% | 0.53 | 4 |
| 投資現金流正 | 9.32% | 0.46 | 5 |
| 融資現金流正 | 8.33% | 0.41 | 6 |
| 三項全正 | 4.61% | 0.23 | 7(墊底) |
三項全正績效僅 4.61%,是所有策略中最差的!
為什麼三項全正反而不好?
從財務分析的角度,三種現金流的正負號有不同含義:
| 現金流 | 正號含義 | 負號含義 |
|---|---|---|
| 營業現金流 | 本業賺錢 ✓ | 本業虧錢 ✗ |
| 投資現金流 | 處分資產/減少投資 ⚠️ | 積極投資擴張 ✓ |
| 融資現金流 | 借錢/增資 ⚠️ | 還債/配息 ✓ |
關鍵洞見:
- 投資現金流正 = 公司在賣資產或減少投資,可能是衰退信號
- 融資現金流正 = 公司在借錢或增資,可能是缺錢信號
- 三項全正 = 本業賺錢,但在縮減規模、籌錢度日,不是成長股特徵!
真正的成長股應該是:營業正 + 投資負(賺錢並積極投資未來)
基礎策略:只看營業現金流
既然營業現金流最重要,我們先建立基礎策略:
建立一個「營業現金流正」的基礎策略:
- 買進條件:營業現金流正
- 流動性:20 日均量 > 300 張
- 月度再平衡
顯示程式碼
from finlab import data
from finlab.backtest import sim
# 取得數據
營業現金流 = data.get('financial_statement:營業活動之淨現金流入_流出')
vol = data.get('price:成交股數')
# 條件
營業正 = 營業現金流 > 0
vol_filter = vol.average(20) > 300 * 1000
# 組合
position = 營業正 & vol_filter
# 回測
report = sim(position.loc['2015':], resample='M', position_limit=0.1, upload=False)
report.to_html('baseline_report.html')基礎策略績效
| 指標 | 數值 |
|---|---|
| 年化報酬率 | 12.03% |
| 夏普比率 | 0.58 |
| 最大回撤 | -35.75% |
績效中規中矩,但還有很大提升空間。