聊天視窗

數據驅動的投資決策:從基礎統計到量化交易 - 第 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. **結論**:多指標融合提升訊號品質,但仍需注意市場結構變化。 > **重點提醒**:即使回測表現優秀,實盤仍可能因滑點、手續費或市場流動性不足而失效,持續監控與快速迭代是關鍵。 --- 本章結束,您已掌握從策略設計到實時交易的完整流程。下一章將深入探討 **機器學習模型** 在量化交易中的應用與挑戰,並示範如何將深度學習結合傳統技術指標,以期提升預測精度與風險調控能力。