聊天視窗

量化投資之道:理論、模型與實戰 - 第 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 小結 - **執行算法**:選擇適當的指令類型與成本估算模型,是量化交易成功的關鍵。 - **滑點與成本**:使用實際委託執行情況校正滑點,避免回測過度樂觀。 - **風控即時性**:在執行過程中即時更新風險指標,確保敞口與成本不超預設閾值。 - **系統架構**:明確分層(策略、風控、執行、日誌)可提升維護性與可擴充性。 > 接下來,我們將在 **第六章** 探討 **高頻交易** 的延遲優化與 **多執行緒** 實作,為你打造完整的量化交易體系。