返回目錄
A
數據驅動的投資決策:從基礎統計到量化交易 - 第 4 章
第 4 章:量化交易策略的構建與優化
發布於 2026-02-21 23:02
# 第 4 章:量化交易策略的構建與優化
本章將理論與實務緊密結合,從策略設計、回測、優化到實時交易的全流程,示範如何以數據驅動的方式構建可執行、可監控的量化交易模型。
## 4.1 策略設計流程
1. **交易假說(Hypothesis)**:先明確「為什麼」市場會產生可抓取的信號。
- 例:短期均線交叉、波動率突破、價量關係等。
2. **特徵選擇**:挑選能最有效表達假說的技術指標或基礎資料。
3. **訊號定義**:根據特徵生成買進、賣出或觀望訊號。
4. **風險限制**:設定止損、停利、持倉比例等風控參數。
5. **優化與過度擬合控制**:使用交叉驗證、Walk‑Forward 分析等方法避免模型過度擬合。
## 4.2 技術指標與訊號示例
以下列舉幾種常見且可組合的技術指標,並用 Python 語法展示簡易訊號產生。
### 4.2.1 簡單移動平均(SMA)交叉
python
import pandas as pd
import numpy as np
def sma_cross(df, short=20, long=50):
df['SMA_S'] = df['Close'].rolling(window=short).mean()
df['SMA_L'] = df['Close'].rolling(window=long).mean()
df['Signal'] = 0
df.loc[df['SMA_S'] > df['SMA_L'], 'Signal'] = 1
df.loc[df['SMA_S'] < df['SMA_L'], 'Signal'] = -1
return df
### 4.2.2 布林帶突破
python
def bollinger(df, window=20, k=2):
df['MA'] = df['Close'].rolling(window).mean()
df['STD'] = df['Close'].rolling(window).std()
df['Upper'] = df['MA'] + k*df['STD']
df['Lower'] = df['MA'] - k*df['STD']
df['Signal'] = 0
df.loc[df['Close'] > df['Upper'], 'Signal'] = -1
df.loc[df['Close'] < df['Lower'], 'Signal'] = 1
return df
### 4.2.3 成交量加權平均價格(VWAP)判斷
python
def vwap(df):
df['TP'] = (df['High'] + df['Low'] + df['Close'])/3
df['TPV'] = df['TP'] * df['Volume']
df['VWAP'] = df['TPV'].cumsum() / df['Volume'].cumsum()
df['Signal'] = 0
df.loc[df['Close'] > df['VWAP'], 'Signal'] = 1
df.loc[df['Close'] < df['VWAP'], 'Signal'] = -1
return df
## 4.3 策略回測與優化
### 4.3.1 回測框架
- **Python**:backtrader、zipline
- **R**:quantstrat、blotter
python
# 使用 backtrader 進行簡易回測
from backtrader import cerebro
# 讀取資料
data = bt.feeds.PandasData(dataname=df)
# 加入策略
cerebro.addstrategy(MyStrategy)
# 設定初始資金與佣金
cerebro.broker.setcash(100000)
cerebro.broker.setcommission(commission=0.001)
# 執行回測
cerebro.run()
### 4.3.2 參數優化
利用 `GridSearchCV` 或 `optuna` 等工具,對策略參數進行多維度搜索。
python
import optuna
def objective(trial):
short = trial.suggest_int('short', 5, 30)
long = trial.suggest_int('long', 30, 100)
# 進行回測並返回績效指標
return portfolio_return
study = optuna.create_study(direction='maximize')
study.optimize(objective, n_trials=50)
## 4.4 風險管理與資金配置
| 指標 | 目的 | 實作方式 |
|------|------|----------|
| 勝率(Win Rate) | 檢查策略勝負比例 | `wins / total` |
| 最大回撤(Max Drawdown) | 風險極限 | 追蹤累積盈虧峰值與最低點 |
| 風險回報比(Risk‑Reward Ratio) | 衡量單筆交易風險成本 | `avg_profit / avg_loss` |
### 4.4.1 均衡配置
使用 Kelly 或 Fractional Kelly 公式計算每筆交易的適當投資額。
python
k = (win_rate - (1 - win_rate) / risk_reward_ratio)
allocation = min(k, 1)
## 4.5 程式化交易實作
1. **數據供應**:使用 `yfinance`、`Alpha Vantage` 或直接連接證券商 API。
2. **訊號生成**:在實時資料流上套用上述訊號函式。
3. **執行層**:利用 `alpaca-trade-api`、`IB_insync` 等執行下單。
4. **狀態管理**:保持持倉、停損、停利狀態同步。
python
from alpaca_trade_api import REST
api = REST('APCA-API-KEY', 'APCA-SECRET-KEY', base_url='https://paper-api.alpaca.markets')
# 取得最新行情
barset = api.get_barset('AAPL', 'minute', limit=50)
price = barset['AAPL'][-1].c
# 生成訊號
signal = sma_cross(df)['Signal'].iloc[-1]
# 下單邏輯
if signal == 1:
api.submit_order(symbol='AAPL', qty=10, side='buy', type='market', time_in_force='gtc')
elif signal == -1:
api.submit_order(symbol='AAPL', qty=10, side='sell', type='market', time_in_force='gtc')
## 4.6 監控與調整
| 指標 | 監控頻率 | 觸發條件 | 調整措施 |
|------|----------|----------|----------|
| 交易績效 | 每天 | 超過預設偏差 | 重新評估參數 |
| 風險限額 | 每週 | 超過最大回撤 | 立即平倉、降低倉位 |
| 系統延遲 | 交易時 | 延遲>5s | 交換API、優化網路 |
使用 Grafana + InfluxDB 等可視化監控平台,搭配自動化腳本實時告警。
## 4.7 案例研究:均線+布林帶雙重策略
1. **策略概念**:結合短期均線突破與布林帶極限,過濾假訊號。
2. **參數**:SMA 20 vs SMA 50;布林帶 k=2;最大持倉 3 張。
3. **回測結果**:年化報酬 18%,最大回撤 12%。
4. **實盤測試**:在 2023 年底至 2024 年初,持續監測並調整止損點。
5. **結論**:多指標融合提升訊號品質,但仍需注意市場結構變化。
> **重點提醒**:即使回測表現優秀,實盤仍可能因滑點、手續費或市場流動性不足而失效,持續監控與快速迭代是關鍵。
---
本章結束,您已掌握從策略設計到實時交易的完整流程。下一章將深入探討 **機器學習模型** 在量化交易中的應用與挑戰,並示範如何將深度學習結合傳統技術指標,以期提升預測精度與風險調控能力。