聊天視窗

自由數據:用資料科學解鎖個人財務自由 - 第 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 結語 風險管理與資產配置是將數據科學「價值」轉化為「現金」的關鍵環節。透過歷史波動、相關性、蒙地卡羅模擬與多因子模型,我們不僅能預測回報,更能量化風險。將這些工具納入投資組合,並持續迭代調整,才能在波動的市場中維持穩健增長,邁向財務自由。 > **一句話提醒**:**「風險管理不是保護,而是為機會保駕護航。**