返回目錄
A
自由數據:用資料科學解鎖個人財務自由 - 第 6 章
第六章:風險管理與資產配置的數據驅動方法
發布於 2026-02-25 02:54
# 第六章:風險管理與資產配置的數據驅動方法
> **一句話提醒**:\*\*「風險即是機會的鏡子,若不觀測其形狀,投資將失衡。**\*
## 6.1 風險評估:從歷史波動到情景模擬
在前幾章,我們已經建立了收益預測模型與因子選擇策略。接下來,我們將把關注點轉向風險。風險管理並非單純的「止損」或「資金分散」——它是一套數據科學流程,將不確定性量化並納入投資決策。
### 6.1.1 歷史波動率 (Historical Volatility)
- **計算方式**:\(\sigma = \sqrt{\frac{1}{N-1}\sum_{t=1}^{N}(r_t - \bar{r})^2}\)
- **實務步驟**:使用 `pandas` 的 `rolling` 函式,設定滑動窗口 252 天(約一年),計算日收益的年化波動率。
- **注意事項**:在市場大幅波動時,歷史波動率會被過去的極端值拉高,導致過度保守。
### 6.1.2 相關性矩陣 (Correlation Matrix)
- **目的**:了解不同資產之間的相互影響,避免「同時下跌」的風險。
- **技術**:使用 `numpy.corrcoef` 或 `scikit-learn` 的 `PCA` 進行降維,提取主要風險因子。
- **可視化**:熱力圖 (`seaborn.heatmap`) 可快速辨識高相關區塊。
### 6.1.3 蒙地卡羅模擬 (Monte Carlo Simulation)
- **概念**:透過隨機生成多條收益路徑,觀察投資組合在不同市場情境下的表現。
- **實作要點**:
1. 產生收益率的正態分布參數(均值、方差)。
2. 使用 `numpy.random.multivariate_normal` 同時模擬多個資產。
3. 計算每條路徑下的累積報酬、最大回撤、夏普比率。
- **效益**:提供「機率分佈」而非單一點估計,讓投資人了解「極端事件」的可能性。
## 6.2 資產配置:從均值-方差到多因子模型
### 6.2.1 Markowitz 平均-方差模型
- **目標**:在給定風險水平下最大化預期收益。
- **程式實作**:
python
import cvxpy as cp
returns = price_df.pct_change().dropna()
mu = returns.mean()
sigma = returns.cov()
w = cp.Variable(len(mu))
risk = cp.quad_form(w, sigma)
ret = mu.T @ w
prob = cp.Problem(cp.Maximize(ret), [cp.sum(w) == 1, w >= 0, risk <= target_risk])
prob.solve()
- **限制**:假設收益分佈為正態,忽略極端風險。
### 6.2.2 多因子模型 (Factor‑Based Portfolio)
- **概念**:將風險拆解成多個因子,進而構造「因子暴露」最小化的投資組合。
- **常見因子**:市場因子、價值因子、動量因子、規模因子、質量因子。
- **回測流程**:
1. 收集因子資料(可用 `yfinance` 或 `Quandl`)。
2. 使用 `statsmodels` 進行多重回歸,得到每支股票的因子載荷。
3. 目標:最小化整體因子暴露,或在保持收益的同時調整因子風險。
- **優勢**:更符合實際市場行為,能捕捉到「因子驅動」的風險。
## 6.3 風險預算 (Risk Budgeting)
- **定義**:將總風險(如波動率或VaR)分配到各個策略或資產。
- **實務範例**:
python
total_risk = 0.12 # 12% 年化波動
risk_allocation = {
"股票": 0.08,
"債券": 0.03,
"商品": 0.02,
}
- **動態調整**:隨著市場環境改變,可使用 `optuna` 重新調整風險預算,確保「整體」不超過設定上限。
## 6.4 交易成本與滑點的實測
- **滑點**:買入時實際成交價低於報價。透過 `backtrader` 的 `sizer` 與 `slippage` 參數模擬。
- **交易費用**:手續費、稅金、ETF 交易費等。建議在 `Quantopian` 或 `zipline` 的 `commission` 模組中定義。
- **數據源**:可抓取 Yahoo Finance 的 `fees` API 或自行設定。
- **實務示例**:
python
class MyStrategy(bt.Strategy):
def __init__(self):
self.sma = bt.indicators.SimpleMovingAverage(self.data.close, period=30)
def next(self):
if self.data.close[0] > self.sma[0]:
self.buy()
elif self.data.close[0] < self.sma[0]:
self.sell()
`slippage = 0.0005` (0.05%) 以及 `commission = 0.001` (0.1%)。
## 6.5 實務案例:台股 50 產業指數
1. **資料下載**:使用 `yfinance` 抓取 `^TWII` 近 5 年行情。
2. **波動率計算**:滑動窗口 63 天(約 3 個月)。
3. **因子加權**:取 10 個行業權重,利用因子回歸得到因子暴露。
4. **資產配置**:在 `cvxpy` 中設定風險預算,求解最佳權重。
5. **回測**:使用 `backtrader`,加入 0.05% 滑點與 0.1% 手續費。
6. **報表**:輸出夏普比率、最大回撤、風險分解表。
## 6.6 常見錯誤與陷阱
| 錯誤 | 影響 | 如何避免 |
|------|------|----------|
| **過度擬合** | 模型在歷史上表現好,但未來失效 | 交叉驗證、滑動窗口回測 |
| **忽略交易成本** | 真實報酬被嚴重削弱 | 在模型中加入成本項,回測時模擬滑點 |
| **只看收益** | 風險被忽視,潛在損失大 | 同時考量波動率、VaR、最大回撤 |
| **靜態配置** | 市場變化時配置不匹配 | 重新優化每個周期(如每月或每季) |
## 6.7 結語
風險管理與資產配置是將數據科學「價值」轉化為「現金」的關鍵環節。透過歷史波動、相關性、蒙地卡羅模擬與多因子模型,我們不僅能預測回報,更能量化風險。將這些工具納入投資組合,並持續迭代調整,才能在波動的市場中維持穩健增長,邁向財務自由。
> **一句話提醒**:**「風險管理不是保護,而是為機會保駕護航。**