- 登入
- 註冊
量化交易是一種利用數學模型、統計分析和計算機技術來制定和執行交易策略的方法。它旨在通過對大量市場數據的深入分析,發現市場中的規律和異常,從而實現自動化和系統化的交易決策。量化交易的興起,大大提升了交易的效率和精確度,改變了傳統依賴直覺和經驗的交易模式。
在量化交易中,回測(Backtesting)是一個很重要的步驟。回測是將交易策略套用到歷史市場數據中,以評估該策略在過去市場的表現。這個過程可以幫助交易者了解策略的獲利能力、風險水平以及穩定性,為策略的優化和實際上線提供重要依據。
回測的重要性體現在以下幾個方面:
然而,回測也有其局限性。市場環境是動態且不可預測的,歷史數據不一定能代表未來的市場走勢。此外,過度擬合 (Over Fitting) 可能導致策略在歷史數據上表現出色,但在實際交易中卻效果不佳。因此,回測結果應與實時市場分析相結合,並在實際交易中持續監控和調整策略。
回測是量化交易中不可或缺的一環,它為交易者提供了評估和改進策略的方法,有助於降低交易風險,提高投資決策的質量。通過嚴謹的回測,交易者可以在投入真實資金之前深入了解策略的優缺點,從而做出更明智的投資決策。
常見的 Python 回測套件有以下幾個,其中包括在台灣廣泛使用的工具:
本文我們將會比較: TQuant Lab、Backtrader 以及 Finlab 在撰寫策略以及回測上的差異。
抓取數據範例可參考官網範例:
我們這邊使用相同的交易邏輯來編寫三個交易程式:
使用一個簡單的移動平均線交叉策略或者官方範例參考,來比較回測的差異。 簡單的移動平均線交叉策略:在這個策略中,當短期移動平均線上穿長期移動平均線時買入,下穿時賣出。
由於程式碼的部份十分冗長,因此我們將三份程式碼放在文末做為附錄,我們這邊直接看結論:
綜合以上比較,TQuant Lab 在開發便利性、數據品質、回測效率以及技術支持方面都表現都好。它提供了一個高度整合的環境,使得量化交易策略的開發和測試變得更加簡單高效。相較之下,Backtrader 雖然功能強大但學習成本較高,但數據處理更加繁瑣。FinLab 則受限於市場覆蓋範圍和社區資源。
因此,TQuant Lab 是進行量化交易回測的最佳選擇。它不僅能夠滿足專業交易者的需求,對於初學者來說也是一個友好的入門工具,能夠快速上手並開展實際的策略開發和回測工作。
比較項目 | TQuant Lab | Backtrader | FinLab |
---|---|---|---|
程式撰寫容易度 | 高 提供簡潔直觀的API,開發流程順暢,適合快速上手 | 中等 需要遵循特定的架構,學習曲線較陡 | 中等 需要遵循特定的架構,學習曲線較陡 |
資料取得容易度 | 高內置高品質數據,無需額外處理 | 低需自行準備和格式化數據,增加開發時間 | 中等提供台灣市場數據,但其他市場數據取得有限 |
資料完整度 | 高覆蓋多市場和多資產類別,數據完整性和準確性高 | 無 | 中等數據覆蓋範圍廣,但是由 FinLab 自行爬蟲取得,數據的準確性需要再確認 |
回測多樣性 | 高支援多種策略類型和回測需求,性能優化良好,且有很多範例 | 中等功能強大,支持複雜策略和多資產回測 | 中等回測功能較為基本,適用於簡單策略的測試,也是使用 Backtrader來回測 |
範例多寡 | 多官方 Github 很多範例程式,且多為 Jupyter notebook 下載回來可以可以直接用 | 少但是商品種類多元,數據來源也不同,很難直接抄下來用 | 中等數量僅次於TQuant Lab 提供的範例 |
缺點 | 要花錢,綁三個月 | GitHub 好一陣子沒人在維護 | 要花錢,綁約一年 |
Overall | 最優選項 | 不建議新手使用,彈性大 | 中等選項 |
如上文所述,我們這邊使用相同的交易邏輯來編寫三個交易程式:使用一個簡單的移動平均線交叉策略或者官方範例參考,主要為比較回測的差異。 簡單的移動平均線交叉策略:在這個策略中,當短期移動平均線上穿長期移動平均線時買入,下穿時賣出
TQuant Lab實測程式碼連結:https://colab.research.google.com/drive/1JhXGTg3UNGePns_qLsUWcij3h9nCVMtY?usp=sharing
TQuant Lab回測圖表:
import backtrader as bt
class MAStrategy(bt.Strategy):
params = dict(
ma_short=5,
ma_long=20,
)
def __init__(self):
self.ma_short = bt.indicators.SMA(self.data.close, period=self.p.ma_short)
self.ma_long = bt.indicators.SMA(self.data.close, period=self.p.ma_long)
def next(self):
if not self.position:
if self.ma_short[0] > self.ma_long[0]:
self.buy()
else:
if self.ma_short[0] < self.ma_long[0]:
self.sell()
# 創建Cerebro引擎
cerebro = bt.Cerebro()
# 加載數據
data = bt.feeds.GenericCSVData(
dataname='2330.csv', # 自備資料來源
dtformat='%Y-%m-%d',
datetime=0,
open=1,
high=2,
low=3,
close=4,
volume=5,
openinterest=-1
)
cerebro.adddata(data)
# 加入策略
cerebro.addstrategy(MAStrategy)
# 運行回測
cerebro.run()
# 繪製結果
cerebro.plot()
Source 來源:
from finlab import data
from finlab.backtest import sim
# 獲取收盤價數據
close = data.get('price:收盤價')
# 計算5日和20日移動平均線
sma5 = close.average(5)
sma20 = close.average(20)
# 定義買入和賣出信號
# 當5日均線上穿20日均線時買入
entries = (sma5 > sma20) & (sma5.shift(1) <= sma20.shift(1))
# 當5日均線下穿20日均線時賣出
exits = (sma5 < sma20) & (sma5.shift(1) >= sma20.shift(1))
# 定義持倉策略
position = entries.hold_until(exits)
# 執行回測
backtest_report = sim(position, upload=False)
# 查看回測報告
from finlab.backtest import sim
backtest_report = sim(position,upload=False)
backtest_report.display()