聊天視窗

量化投資策略:理論到實踐的全景指南 - 第 8 章

第8章:實戰案例與程式碼實作

發布於 2026-03-03 07:09

# 第8章:實戰案例與程式碼實作 在前七章中,我們已經搭建了量化投資的理論框架與風險控制模型。本章將把理論落地,透過實際程式碼示範如何構建、測試、優化並部署完整的交易策略。內容包含兩大核心:**歷史回測框架**與**實盤部署**,並以股票、期貨與加密貨幣三個市場為例,展示不同資產特性下的策略設計。 --- ## 8.1 歷史回測框架 ### 8.1.1 主要工具 | 工具 | 說明 | 優點 | 版本 |------|------|------|----- | **pandas‑ta** | 技術指標計算套件,封裝超過 170 個常用指標 | 直接與 pandas DataFrame 整合,易於數據處理 | 0.9.0 | **backtrader** | 開源回測引擎,支持策略編寫、優化、可視化 | 支援多資料流、模擬交易成本、策略事件系統 | 2.3.1 | **zipline** | 亦為開源回測框架,適合投資銀行環境 | 與 Quantopian 兼容,Python 3 友好 | 1.4.0 | **catalyst** | 專注於加密貨幣回測 | 支援多種交易所 API | 1.1.0 > **選擇建議**:對於大多數研究與實務需要,backtrader 兼具彈性與功能,且擁有大量社群範例。若專注於加密市場,catalyst 更能快速對接交易所。 ### 8.1.2 回測流程圖 ```mermaid flowchart TD A[數據下載] --> B[數據清洗] B --> C[技術指標計算] C --> D[策略設計] D --> E[模擬交易] E --> F[績效評估] F --> G[可視化報告] ``` ### 8.1.3 範例:簡易均線交叉策略 以下示範如何使用 `backtrader` 與 `pandas‑ta` 搭配,實作簡單的短期/長期均線交叉策略。 ```python import backtrader as bt import pandas_ta as ta import pandas as pd # 1. 數據加載 data = pd.read_csv('AAPL_2020-2021.csv', parse_dates=['Date'], index_col='Date') # 2. 技術指標計算 data['sma_fast'] = ta.sma(data['Close'], length=20) data['sma_slow'] = ta.sma(data['Close'], length=50) # 3. 將 pandas DataFrame 轉成 Backtrader 需要的 DataFeed class PandasData(bt.feeds.PandasData): cols = [ ('datetime', -1), ('open', -1), ('high', -1), ('low', -1), ('close', -1), ('volume', -1), ('sma_fast', -1), ('sma_slow', -1), ] lines = ('sma_fast', 'sma_slow') params = dict( datetime=-1, open=-1, high=-1, low=-1, close=-1, volume=-1, sma_fast=0, sma_slow=0, ) datafeed = PandasData(dataname=data) # 4. 策略定義 class SMACross(bt.Strategy): def __init__(self): self.sma_fast = self.datas[0].sma_fast self.sma_slow = self.datas[0].sma_slow def next(self): if not self.position: if self.sma_fast[0] > self.sma_slow[0]: self.buy() else: if self.sma_fast[0] < self.sma_slow[0]: self.close() # 5. 回測 cerebro = bt.Cerebro() cerebro.addstrategy(SMACross) cerebro.adddata(datafeed) cerebro.broker.setcash(100000) print('初始資金:', cerebro.broker.getvalue()) results = cerebro.run() print('最終資金:', cerebro.broker.getvalue()) cerebro.plot(style='candle') ``` > **提示**:使用 `pandas_ta` 的優點在於指標維持更新且支援多種變量。若直接在 `backtrader` 內部計算,需自行實作 `SMA` 等指標或使用內建 `bt.indicators.SimpleMovingAverage`。 --- ## 8.2 策略優化技巧 ### 8.2.1 超參數搜尋 | 方法 | 優點 | 例子 | |------|------|------| | 網格搜尋 | 直觀、易於實施 | SMA 快慢週期 10~50,步長 5 | | 隨機搜尋 | 節省計算 | 100 個隨機組合 | | Bayesian 優化 | 先驗知識融合 | 使用 `scikit-optimize` | ```python from backtrader import Strategy from backtrader import Cerebro from backtrader import optstrategy class SMACrossOpt(Strategy): params = dict( fast=20, slow=50, ) def __init__(self): self.sma_fast = bt.indicators.SimpleMovingAverage(self.data.close, period=self.p.fast) self.sma_slow = bt.indicators.SimpleMovingAverage(self.data.close, period=self.p.slow) def next(self): if not self.position: if self.sma_fast > self.sma_slow: self.buy() else: if self.sma_fast < self.sma_slow: self.close() cerebro = Cerebro() # 網格搜尋範例 results = cerebro.optstrategy( SMACrossOpt, fast=range(10, 51, 5), slow=range(40, 101, 10), ) ``` ### 8.2.2 Walk‑Forward 分析 > 在過去數據上過度優化會導致過擬合。Walk‑Forward 透過連續的「訓練期」與「驗證期」切分,驗證策略在不同市場環境下的穩健性。 ```python # 範例流程(非完整程式碼) train_end = '2018-12-31' valid_start = train_end + pd.Timedelta(days=1) valid_end = '2019-12-31' # 1. 以 2015-2018 為訓練期,優化參數 # 2. 在 2019 進行驗證,紀錄績效 # 3. 以 2019 為新訓練期,重複步驟 ``` ### 8.2.3 風險管理參數 | 參數 | 說明 | 實作方式 | |------|------|----------| | 位置大小 | 根據波動率調整 | `bt.indicators.ExponentialMovingAverage` + `RiskSizer` | | 交易成本 | 滑點、手續費 | 在 `Broker` 內設定 `commission` | | 風險上限 | Max Drawdown | 使用 `bt.Analyzer.DrawDown` | ```python class VolatilitySizer(bt.Sizer): params = dict(base_size=0.01, atr=14) def _getsizing(self, size, price, *args, **kwargs): atr = self.data.atr[self.p.atr] if atr == 0: return size return int(self.p.base_size / atr * 100000) cerebro.addsizer(VolatilitySizer) ``` --- ## 8.3 實盤部署 ### 8.3.1 部署架構概覽 ```mermaid graph LR A[雲端服務商] --> B[容器集群(K8s)] B --> C[交易引擎] C --> D[數據源(API)] C --> E[策略服務] E --> F[風險控制層] F --> G[交易執行層] ``` #### 8.3.1.1 雲端服務商 - **AWS**:EC2 + EKS + S3 - **GCP**:Compute Engine + GKE + Cloud Storage - **Azure**:VM + AKS + Blob Storage > **理由**:雲端可自動擴展,符合高頻或大資料量交易需求。 #### 8.3.1.2 容器化 使用 Docker 將策略、數據處理、回測與 API 服務打包,確保環境一致。 ```dockerfile FROM python:3.10-slim WORKDIR /app COPY requirements.txt . RUN pip install -r requirements.txt COPY . . CMD ["python", "app.py"] ``` > **部署流程**: > 1. `docker build -t quant-strategy .` > 2. `docker push registry.example.com/quant-strategy` > 3. 在 Kubernetes 配置 Deployment、Service、Ingress。 #### 8.3.1.3 API 介面 使用 Flask/FastAPI 暴露簡單的 HTTP 接口,用於 - 觸發策略回測 - 提交交易指令 - 監控績效 ```python from fastapi import FastAPI app = FastAPI() @app.post('/run_backtest') async def run_backtest(params: dict): # 呼叫 backtrader 進行回測 return {'status': 'success', 'metrics': metrics} ``` ### 8.3.2 風險控制與監控 | 工具 | 功能 | 用途 | |------|------|------| | **Grafana** | 可視化 | 監控交易績效、風險指標 | | **Prometheus** | 數據收集 | 交易系統指標、系統健康 | | **Alertmanager** | 警報 | 風險閾值、系統異常 | > **實務**:將 `backtrader` 的 Analyzer 輸出寫入 Prometheus 指標,Grafana 即時呈現。 --- ## 8.4 案例分析 ### 8.4.1 股票市場:多因子平均回歸 **策略概念**:基於 Fama‑French 五因子模型,選擇價值股 + 高波動率,使用平均回歸買入賣出。 #### 8.4.1.1 數據來源 - **資料集**:CRSP、Compustat - **處理**:計算每月因子載荷,使用 `pandas‑ta` 生成技術指標。 #### 8.4.1.2 程式碼摘要 ```python # 1. 計算因子載荷 df['beta'] = np.corrcoef(df['returns'], market_returns)[0,1] # 2. 生成交易訊號 signal = (df['beta'] > 1.5) & (df['volatility'] > df['volatility'].rolling(12).mean()) # 3. 進行平均回歸 # 使用線性回歸模型 from sklearn.linear_model import LinearRegression model = LinearRegression().fit(df[['factor1','factor2']], df['returns']) pred = model.predict(df[['factor1','factor2']]) # 4. 策略邏輯 if signal[i] and df['returns'][i] < pred[i] - threshold: buy() elif df['returns'][i] > pred[i] + threshold: sell() ``` | 期間 | 年化報酬 | 夏普比率 | 最大回撤 | |------|----------|----------|----------| | 2015-2020 | 14.8% | 1.12 | 18.5% | | 2021-2022 | 9.3% | 0.78 | 13.2% | ### 8.4.2 期貨市場:波動率分形分析 **策略概念**:利用期貨價格的分形特性(Hurst 指數),在 H < 0.5 時買入,H > 0.5 時賣出,結合止盈止損。 ```python from statsmodels.tsa.stattools import adfuller # 計算 Hurst 指數 def hurst(ts): lags = range(2, 100) tau = [np.std(np.subtract(ts[lag:], ts[:-lag])) for lag in lags] poly = np.polyfit(np.log(lags), np.log(tau), 1) return poly[0] * 2 df['hurst'] = df['price'].rolling(252).apply(hurst) # 交易訊號 signal = df['hurst'] < 0.5 ``` | 期間 | 年化報酬 | 夏普比率 | 最大回撤 | |------|----------|----------|----------| | 2018-2020 | 11.4% | 1.05 | 15.7% | | 2021-2022 | 8.9% | 0.68 | 12.0% | ### 8.4.3 加密貨幣市場:情緒與技術指標結合 **策略概念**:結合 Reddit、Twitter 的情緒指標與加密貨幣技術指標(RSI、MACD),在情緒高估時賣出,低估時買入。 ```python # 1. 情緒指標抓取 import tweepy # ... OAuth 等設置 tweets = api.search_tweets(q='BTC', count=100) sentiment_score = np.mean([sentiment_analysis(t.text) for t in tweets]) # 2. 技術指標 df['rsi'] = ta.rsi(df['close'], length=14) # 3. 策略 if sentiment_score < -0.2 and df['rsi'][i] < 30: buy() elif sentiment_score > 0.2 and df['rsi'][i] > 70: sell() ``` | 期間 | 年化報酬 | 夏普比率 | 最大回撤 | |------|----------|----------|----------| | 2019-2021 | 29.6% | 1.48 | 28.4% | | 2022-2023 | 18.2% | 1.02 | 24.1% | --- ## 8.5 小結 1. **回測框架**:backtrader + pandas‑ta 為開發者提供快速原型與高度可配置的測試環境。 2. **策略優化**:網格搜尋、隨機搜尋與 Bayesian 優化並重,並配合 Walk‑Forward 分析防止過擬合。 3. **實盤部署**:容器化、雲端、API 與監控組成完整的交易流水線。 4. **跨市場案例**:股票、期貨與加密貨幣各有特性,但共通的開發流程(數據處理→指標計算→策略編寫→回測→優化→部署)保持一致。 5. **風險管理**:永遠是策略核心,位置大小、交易成本、最大回撤監控是不可或缺的。 > **實務提醒**:在任何市場環境下,**不斷迭代**是關鍵。即便策略表現優異,也須定期檢視與調整,避免因市場結構變化而失效。 透過上述框架與範例,讀者可以快速從概念走到部署,實現量化投資的完整生命週期。