聊天視窗

自由數據:用資料科學解鎖個人財務自由 - 第 5 章

第五章:量化投資策略的建構與驗證

發布於 2026-02-25 02:36

# 量化投資策略的建構與驗證 在前面幾章中,我們已經掌握了財經數據的抓取、清洗與特徵工程,現在要將這些資料投入模型,打造屬於自己的投資策略。 ## 1. 目標設定:什麼是量化投資? 量化投資(Quantitative Investing)不僅僅是寫幾行程式碼;它是一種以數據為基礎、可重複、可測量的投資思維。核心目標是: 1. **定義投資邏輯**:確定哪些市場因子、風險因子或訊號能帶來超額報酬。 2. **構建可執行模型**:將邏輯轉化為可自動化執行的交易規則。 3. **驗證與風險控制**:通過歷史回測、壓力測試與風險度量,確保模型在不同市場環境下皆具備穩定性。 ## 2. 資料準備:歷史行情 + 特色因子 | 資料來源 | 內容 | 目的 | |----------|------|------| | Yahoo Finance | `Adj Close`, `Volume`, `Open`, `High`, `Low` | 基礎行情 | | FRED | 經濟指標(GDP、失業率) | 宏觀因子 | | Twitter API | 市場情緒 | 替代數據 | | Bloomberg API | 產業因子 | 深度行業分析 | > **Tip**:在量化投資中,**資料多樣性**往往是突破點。試著將新聞情緒、社群討論熱度與傳統財務指標結合,能挖掘出不同時間尺度的訊號。 ## 3. 特徵工程:從原始資料到可交易訊號 1. **技術指標**:RSI、MACD、布林帶。 2. **統計特徵**:對數收益、年化波動率、夏普比率。 3. **機器學習特徵**:滑動窗口的均值與標準差、PCA 取主成分。 4. **替代因子**:Twitter sentiment score、Google Trends 搜尋熱度。 python import pandas as pd import numpy as np from ta import add_all_ta_features # 讀取行情資料 price_df = pd.read_csv('sp500_adj_close.csv', parse_dates=['Date'], index_col='Date') # 產生技術指標 price_df = add_all_ta_features(price_df, open=None, high=None, low=None, close='Adj Close', volume=None) # 加入情緒因子 sentiment = pd.read_csv('twitter_sentiment.csv', parse_dates=['Date'], index_col='Date') price_df = price_df.join(sentiment, how='left').fillna(0) > **Pro Tip**:在特徵選擇時使用 **L1 正則化(Lasso)** 或 **特徵重要性排序**,能有效剔除冗餘特徵,降低過擬合風險。 ## 4. 模型構建:從線性回歸到強化學習 ### 4.1 基本回歸模型 python from sklearn.linear_model import Ridge from sklearn.model_selection import TimeSeriesSplit, cross_val_score X = price_df.drop(columns=['Adj Close']) y = price_df['Adj Close'].pct_change().shift(-1).dropna() X = X.loc[y.index] # 時間序列交叉驗證 tscv = TimeSeriesSplit(n_splits=5) ridge = Ridge(alpha=1.0) scores = cross_val_score(ridge, X, y, cv=tscv, scoring='neg_mean_squared_error') print('MSE:', -scores.mean()) ### 4.2 隨機森林與 XGBoost 隨機森林能捕捉非線性關係,而 XGBoost 在梯度提升上表現卓越。兩者都能處理高維特徵,並提供特徵重要性指標。 ### 4.3 強化學習:Q‑Learning 之簡易實作 對於多策略選擇與動態配置,強化學習提供了一種自我優化的框架。 python import numpy as np states = np.arange(10) # 風險等級 actions = np.arange(3) # 交易訊號(買、持、賣) Q = np.zeros((len(states), len(actions))) alpha = 0.1 gamma = 0.9 for episode in range(1000): state = np.random.choice(states) action = np.random.choice(actions) reward = np.random.randn() # 模擬報酬 next_state = np.random.choice(states) Q[state, action] += alpha * (reward + gamma * Q[next_state].max() - Q[state, action]) > **Caution**:強化學習模型需要大量歷史資料與嚴謹的離線驗證,否則易陷入過擬合。 ## 5. 回測與風險評估 ### 5.1 回測框架 - **Zipline**:Python 的開源回測庫,適合日線與更高頻交易。 - **Backtrader**:易於上手、社群活躍、可視化工具多。 - **custom engine**:若需自定義條件,使用 `pandas` + `numpy` 直接編寫。 ### 5.2 風險度量 | 指標 | 意義 | |------|------| | 夏普比率 | 把報酬與波動率做比較 | | 最大回撤 | 最大資金下跌幅度 | | 卡爾曼因子 | 風險調整後的收益 | | VaR / CVaR | 潛在風險估算 | > **例子**:最大回撤超過 25% 時,策略自動停止交易並重設投資比例。 ## 6. 交易執行:從策略到實盤 1. **訂單管理**:使用 Alpaca、Interactive Brokers API,支援 REST、WebSocket。 2. **滑點與手續費模擬**:回測時加入固定滑點 0.05% 或動態模型,確保策略在實盤可行。 3. **監控與報警**:將交易結果推送至 Telegram / Slack,或自建儀表板(Dash、Streamlit)。 ## 7. 持續優化:自我調整與迭代 - **模型監控**:使用 `mlflow` 或 `Weights & Biases` 追蹤版本、績效。 - **參數再優化**:每 30 天跑一次 `GridSearchCV`,自動調整 `alpha`、`max_depth` 等。 - **因子更新**:新資料到來時,重新訓練,避免模型過時。 ## 8. 結語 量化投資並非一次性完成,而是一個持續學習、迭代改進的循環。資料的力量在於**可操作性**;若缺乏可執行的策略,即使擁有最先進的模型,也無法實現財務自由。 > **一句話提醒**:**永遠把「交易成本」視為模型的一部分**,忽略成本往往是許多新手失敗的根源。 --- **練習題**: 1. 以 S&P 500 為基礎,使用 `rolling_mean`、`rolling_std` 與 `MACD` 來產生買賣訊號,並進行 5 歲回測。輸出夏普比率與最大回撤。 2. 以 Twitter sentiment score 作為額外因子,評估其對策略表現的提升。若提升幅度不足 5%,請嘗試其他替代因子。 **下一章預告**:將探討「機器學習模型部署與雲端運行」——如何將模型部署於 AWS SageMaker 或 GCP Vertex AI,實現雲端自動化。