聊天視窗

量化投資的智慧:從數據到策略 - 第 5 章

第5章:交易執行與回測:將模型轉化為現金流

發布於 2026-02-21 17:48

# 第5章:交易執行與回測:將模型轉化為現金流 在前幾章我們已經建立了能夠預測市場走勢的模型,並討論了資料蒐集與特徵工程的重點。這裡,核心問題轉向: > **模型的價值只有在被實際交易執行、並且其績效可在真實資金下得到驗證時,才能真正被評估。** 本章將把「理論」與「實務」結合,帶領你完成: 1. 交易成本與滑點的量化。 2. 不同執行策略(市價、限價、VWAP 等)的比較。 3. 用 Backtrader 進行完整回測的完整流程。 4. 交易績效的指標計算與風險調整。 --- ## 1. 交易成本:不容忽視的敵人 即使模型預測再準確,交易成本(交易費、手續費、滑點)仍可能把高頻的邏輯績效吞噬。下面用簡單的公式說明: | 成本類型 | 說明 | 典型數值 | |----------|------|----------| | 手續費 | 固定或比例 | 0.1%–0.3% | | 滑點 | 市價成交差額 | 0.5%–1% | | 交易稅 | 各國不同 | 0.1%–0.3% | > **重點**:滑點通常在高頻或大手續量交易中成為主要成本,對日內策略尤為關鍵。 ### 代碼範例:設置 Backtrader 的交易成本 python import backtrader as bt cerebro = bt.Cerebro() # 手續費 0.1% 每筆交易 cerebro.broker.setcommission(commission=0.001) # 固定滑點 0.01 元 cerebro.broker.set_slippage_fixed(0.01) --- ## 2. 執行策略:市價 vs 限價 vs VWAP | 執行方式 | 優勢 | 劣勢 | |----------|------|------| | 市價 | 立即成交 | 可能高滑點 | | 限價 | 控制價格 | 可能未成交 | | VWAP | 平滑成交 | 複雜實作 | > **實務建議**:對於小型策略,市價執行足以;對於大手續量或高頻策略,VWAP 或限價結合機制能顯著降低滑點。 ### 代碼範例:限價執行 python class LimitOrderStrategy(bt.Strategy): def __init__(self): self.target_price = 0.0 def next(self): # 假設目標價格已在某個信號中計算完成 if not self.position: self.target_price = self.data.close[0] * 0.99 self.sell(exectype=bt.Order.Limit, price=self.target_price) --- ## 3. 完整回測流程(Backtrader 範例) 1. **資料載入**:使用 `bt.feeds.PandasData`。 2. **策略設定**:定義進出場邏輯。 3. **執行回測**:`cerebro.run()`。 4. **績效評估**:用 `cerebro.plot()` 或自訂指標。 python import pandas as pd import backtrader as bt # 1. 載入資料 data = pd.read_csv('sp500_daily.csv', parse_dates=True, index_col='Date') data_feed = bt.feeds.PandasData(dataname=data) # 2. 定義策略 class SMA_Crossover(bt.Strategy): params = dict(short=20, long=50, size=1000) def __init__(self): self.short_sma = bt.indicators.SimpleMovingAverage(self.data.close, period=self.p.short) self.long_sma = bt.indicators.SimpleMovingAverage(self.data.close, period=self.p.long) def next(self): if self.short_sma[0] > self.long_sma[0] and not self.position: self.buy(size=self.p.size) elif self.short_sma[0] < self.long_sma[0] and self.position: self.sell(size=self.p.size) # 3. 設定回測環境 cerebro = bt.Cerebro() cerebro.adddata(data_feed) cerebro.addstrategy(SMA_Crossover) cerebro.broker.setcash(1e6) # 成本設置 cerebro.broker.setcommission(commission=0.001) cerebro.broker.set_slippage_fixed(0.01) # 4. 執行回測 cerebro.run() print('Final Portfolio Value: %.2f' % cerebro.broker.getvalue()) --- ## 4. 績效指標與風險調整 | 指標 | 定義 | 解讀 | |------|------|------| | Sharpe Ratio | > `(Avg Return - Rf) / Std Dev` | 高於 1 代表風險調整後收益良好 | | Sortino Ratio | > `(Avg Return - Rf) / Downside Vol` | 僅考慮負向波動,適合長期持有 | | 最大回撤 | > `Max Peak – Max Drawdown` | 衡量資金跌幅風險 | > **提醒**:即使模型在過去回測表現優異,也要持續監控其 **前瞻性**,避免過度擬合。 --- ## 5. 章節小結 1. **交易成本** 是影響實盤收益的主要「隱形成本」,必須在回測中準確模擬。 2. **執行策略** 的選擇需依據資金量、頻率與市場流動性而定。 3. **Backtrader** 為常用且擴充性高的 Python 回測框架,能快速驗證策略。 4. **績效指標** 需配合風險調整,才能客觀評估策略價值。 > **未來展望**:在第六章我們將進一步探討 **風險管理**,將前面回測得到的績效與風險度量結合,設計出更具韌性的投資組合。若你對回測流程有任何疑問,歡迎隨時在社群中討論或到實驗室協作。