返回目錄
A
量化投資之道:理論、模型與實戰 - 第 7 章
第七章:算法交易與執行策略
發布於 2026-02-23 20:10
# 第七章:算法交易與執行策略
> **執行是理論的終點,也是投資價值的起點**。\n理論模型若無法在真實交易中落地,將永遠停留在「想像」層面。此章將帶領你從理論走向實務,從策略回測到實時執行,並深入探討如何把風險管理與執行效率緊密結合。
## 7.1 執行環境概覽
| 層級 | 主要職責 | 典型工具 |
|------|----------|-----------|
| 交易策略層 | 產生買賣訊號 | Python、Jupyter、pandas |
| 執行引擎層 | 把訊號轉成實際委託 | backtrader、zipline、pyalgotrade |
| 交易接口層 | 與券商或交易所對接 | IB API、Alpaca、Binance API |
| 風控層 | 監控風險、控制敞口 | QuantConnect、RiskQuantLib |
| 資料層 | 提供行情與歷史 | Bloomberg、Yahoo Finance、Quandl |
> 章節中,我們以 **Interactive Brokers(IB)** 為例,因其 API 功能豐富、延遲低,且支持多種交易所與金融產品。
## 7.2 交易指令類型與選擇
| 指令類型 | 說明 | 何時使用 |
|----------|------|-----------|
| 市價單(Market Order) | 以市場價格即時成交 | 快速進出、短期投機 |
| 限價單(Limit Order) | 指定價格或更好價格成交 | 長期持有、避開價格波動 |
| 成本控制單(Stop‑Loss / Trailing Stop) | 觸發時執行市價單 | 風險控制 |
| VWAP / TWAP | 在整個交易日或指定時間內平均成交 | 大額交易、降低衝擊 |
| 市場深度單(Iceberg, Fill or Kill) | 隱藏部分委託量 | 量化機器人、對沖 |
> **風險與成本的權衡**:市價單即時成交但成本高;限價單成本低但可能不成交。選擇取決於策略的時間週期與風險容忍度。
## 7.3 執行算法實作
以下示範 **VWAP** 執行算法,使用 IB 的 `IB` 套件(`ib_insync`)與 `pandas` 進行時間同步。
python
from ib_insync import *
import pandas as pd
import numpy as np
# 連線到 IB
ib = IB()
ib.connect('127.0.0.1', 7497, clientId=1)
# 取得合約(以 SPY 為例)
contract = Stock('SPY', 'SMART', 'USD')
ib.qualifyContracts(contract)
# 取得當日成交量與價格資料(5 分鐘 K 線)
bars = ib.reqHistoricalData(
contract,
endDateTime='',
durationStr='1 D',
barSizeSetting='5 mins',
whatToShow='MIDPOINT',
useRTH=True,
formatDate=1
)
df = util.df(bars)
df['vwap'] = (df['close'] * df['volume']).cumsum() / df['volume'].cumsum()
# 假設每日目標成交量為 1,000,000 股
target_volume = 1_000_000
# 迴圈模擬 VWAP 執行
current_volume = 0
orders = []
for idx, row in df.iterrows():
# 估算每筆單可買多少股(按 VWAP 目標分配)
pct_of_day = (row['volume'] / df['volume'].sum())
qty_to_buy = int(target_volume * pct_of_day - current_volume)
if qty_to_buy <= 0:
continue
# 建立限價單,價格略低於 VWAP 以提高成交率
limit_price = round(row['vwap'] * 0.999, 2)
order = MarketOrder('BUY', qty_to_buy) # 市價單示範
trade = ib.placeOrder(contract, order)
orders.append(trade)
current_volume += qty_to_buy
ib.disconnect()
print(f"共下單 {len(orders)} 筆,總成交量 {current_volume} 股")
> **說明**:上述程式碼僅為簡易示範,實際執行時需加入容錯、延遲控制、以及交易回報驗證。
## 7.4 滑點與成交成本估算
| 成本來源 | 估算方法 |
|-----------|----------|
| 滑點 | 過去交易的買賣差價、成交量與市場深度 |
| 手續費 | 以券商收費表為基礎,或設定固定百分比 |
| 交易稅 | 依所在國家/地區法規設置 |
### 7.4.1 滑點模擬
滑點可用 **成交價與最佳買賣價差** 或 **交易量與深度比** 模擬。以下為簡易滑點模擬方法:
python
# 假設最佳買賣價差為 0.02% 的動態變化
slippage_pct = 0.0002
executed_price = market_price * (1 + slippage_pct)
# 或者使用歷史成交資料直接抽樣
import random
historical_spreads = [0.0001, 0.0002, 0.00015, 0.00025] # 例子
slippage_pct = random.choice(historical_spreads)
### 7.4.2 成本扣除範例
python
# 交易成本模擬
commission_rate = 0.0005 # 0.05%
trade_cost = qty * executed_price * commission_rate
slippage_cost = qty * executed_price * slippage_pct
net_pnl = (sell_price - buy_price - commission_rate * (buy_price + sell_price) - slippage_cost) * qty
> **實務提醒**:滑點通常與市場流動性、時間窗口和策略規模正相關。使用 **實際委託執行情況**(如 IB 的 `HistoryDataRequest`)來校正滑點模型,可顯著提升回測精度。
## 7.5 交易系統架構圖
mermaid
graph LR
A[策略模組] -->|訊號| B[執行引擎]
B --> C{風控}
C -->|風險警報| D[停止執行]
B -->|下單| E[券商 API]
E -->|執行情況| B
C -->|報告| F[風控報表]
B -->|執行紀錄| G[交易日誌]
> 風控模組不僅監控敞口、波動率,更可即時監控滑點成本、交易頻率與市場情況。
## 7.6 實盤執行案例:ETF 市場做多
以下示範以 **iShares MSCI World ETF (URTH)** 為例,結合前面學到的 VWAP 與風險控制。
1. **策略設計**:日內長短期均線交叉,買入時觸發 VWAP
2. **風控條件**:
- 單日最大敞口 15%
- 成本總額(手續費+滑點)不得超 0.3% 的投資本金
3. **執行流程**:
- 計算當日 VWAP
- 下限價單,價格略低於 VWAP
- 交易完成後實時更新風險指標
python
# 伪代码示例
# 1. 計算交易量
max_position = total_capital * 0.15
trade_qty = min(max_position // market_price, target_volume * 0.5) # 取每日目標的一半
# 2. 下限價單
limit_price = vwap_price * 0.999
order = LimitOrder('BUY', trade_qty, limit_price)
trade = ib.placeOrder(contract, order)
# 3. 監控成交成本
while not trade.isDone():
ib.sleep(0.1)
# 估算滑點與手續費
current_price = trade.executedPrice
slippage = abs(current_price - limit_price)
commission = trade.qty * current_price * commission_rate
total_cost = commission + slippage
if total_cost > total_capital * 0.003: # 超過 0.3%
trade.cancel()
print("成本過高,已取消訂單")
break
# 4. 風控更新
position_value = trade.qty * trade.executedPrice
if position_value / total_capital > 0.15:
# 超敞口,平倉
sell_order = MarketOrder('SELL', trade.qty)
ib.placeOrder(contract, sell_order)
> **實務要點**:
> - **動態下單**:隨著市場流動性變化,動態調整價格與下單量。
> - **成本回饋**:每次交易後即時計算實際成本,並在風控閾值內做調整。
> - **日終結算**:對照日終報表,檢查是否達到敞口限制,必要時進行調整。
## 7.7 常見陷阱與最佳實踐
| 陷阱 | 可能造成 | 解決方法 |
|------|-----------|-----------|
| **過度樂觀的滑點假設** | 未扣除實際交易成本 | 使用真實委託數據校正滑點模型 |
| **單一指令類型過度使用** | 市場衝擊過大 | 交叉使用市價單、限價單、VWAP、TWAP |
| **風控閾值設定不合適** | 敞口被提前清倉 | 依據策略特性與市場波動動態調整風控參數 |
| **執行延遲未同步** | 回測結果與實盤偏差 | 將 IB 的延遲管理與 `ib.sleep()` 整合到演算法 |
| **回測過於簡化的系統架構** | 交易日誌與風控報表不一致 | 實作完整的系統架構與日誌收集 |
> **最佳實踐**:
> 1. **資料真實性**:回測必須以 **實際委託執行情況** 為基礎。
> 2. **成本即時反饋**:每筆交易後即時更新成本與風險報表。
> 3. **模擬與實盤分離**:模擬環境與實盤環境使用同一份策略邏輯,但成本與風控條件可根據環境調整。
> 4. **日終報表審核**:每天結束後,審核日終報表與風控報表,確保交易成本、敞口與波動率在預期範圍內。
## 7.8 小結
- **執行算法**:選擇適當的指令類型與成本估算模型,是量化交易成功的關鍵。
- **滑點與成本**:使用實際委託執行情況校正滑點,避免回測過度樂觀。
- **風控即時性**:在執行過程中即時更新風險指標,確保敞口與成本不超預設閾值。
- **系統架構**:明確分層(策略、風控、執行、日誌)可提升維護性與可擴充性。
> 接下來,我們將在 **第六章** 探討 **高頻交易** 的延遲優化與 **多執行緒** 實作,為你打造完整的量化交易體系。