Shopping Cart

購物車內沒有任何商品。

Python量化交易套件評測,帶你找到適合的工具!TQuant Lab、Backtrader、Backtesting.py、FinLab、vn.py

立即訂閱電子報,掌握最新資訊!

    稱呼

    電子郵件

    以下非必填,但若您願意分享,我們將能推送更精準的內容給您

    投資經驗

    是否為理工科背景、工程師或有寫程式的經驗?

    有興趣的主題
    量化交易台股期貨海外期貨虛擬貨幣美股

    有興趣的量化交易軟體/平台
    不清楚MultiChartsTradingViewPythonXQ

    想透過量化交易達成甚麼目的?
    不確定自動交易選股回測投資績效量化自己的投資方法想找現成的策略套用

    還有什麼想詢問的?

    20241111 1920 400
    20241111 978 258


    量化交易是一種利用數學模型、統計分析和計算機技術來制定和執行交易策略的方法。它旨在通過對大量市場數據的深入分析,發現市場中的規律和異常,從而實現自動化和系統化的交易決策。量化交易的興起,大大提升了交易的效率和精確度,改變了傳統依賴直覺和經驗的交易模式。

    回測的重要性

    在量化交易中,回測(Backtesting)是一個很重要的步驟。回測是將交易策略套用到歷史市場數據中,以評估該策略在過去市場的表現。這個過程可以幫助交易者了解策略的獲利能力、風險水平以及穩定性,為策略的優化和實際上線提供重要依據。

    回測的重要性體現在以下幾個方面:

    1. 驗證策略有效性:通過回測,可以檢驗交易策略在不同歷史時期和市場狀態下的表現,包括牛市、熊市和盤整市。這有助於確定策略是否具有普遍適用性,還是僅在特定條件下有效
    2. 風險評估與管理:回測可以揭示策略的風險特徵,例如最大回撤、收益波動性和風險收益比。這些指標有助於交易者評估策略可能帶來的風險,從而制定適當的風險管理和資金管理方案
    3. 策略優化:在回測過程中,交易者可以調整策略的參數,如移動平均線的週期、指標的閾值等,以尋找最佳組合。這種優化能夠提升策略的整體表現,但需要注意避免過度擬合(Over Fitting)
    4. 節省時間和資源:在實際市場中測試策略可能耗時耗資,而回測則可以在短時間內模擬多年甚至數十年的市場數據,快速獲得策略的歷史表現,從而節省大量時間和資源
    5. 建立信心:良好的回測結果可以增強交易者對策略的信心,使其在實際交易中更能堅持策略,不會因短期波動而輕易改變計劃

    然而,回測也有其局限性。市場環境是動態且不可預測的,歷史數據不一定能代表未來的市場走勢。此外,過度擬合 (Over Fitting) 可能導致策略在歷史數據上表現出色,但在實際交易中卻效果不佳。因此,回測結果應與實時市場分析相結合,並在實際交易中持續監控和調整策略。

    回測是量化交易中不可或缺的一環,它為交易者提供了評估和改進策略的方法,有助於降低交易風險,提高投資決策的質量。通過嚴謹的回測,交易者可以在投入真實資金之前深入了解策略的優缺點,從而做出更明智的投資決策。

    常見的 Python 回測套件

    常見的 Python 回測套件有以下幾個,其中包括在台灣廣泛使用的工具:

    1. TQuant Lab
      • 簡介:TQuant Lab 是一個專為量化交易設計的 Python 開發環境,提供從數據取得、策略開發、回測到實時交易的一站式解決方案
      • 特點:支持臺灣市場和多資產類別,內置豐富的技術指標和策略模板 (GitHub上),並提供高品質的數據服務,適合各種層次的交易者
    2. Backtrader
      • 簡介:Backtrader 是一個功能強大的開源 Python 回測框架,適用於開發和測試各種量化交易策略
      • 特點:支援多資產、多時間框架的回測,具有靈活的架構和豐富的社區資源,允許用戶自定義指標和策略,並且可以做 live trading(需要使用自定義的報價且需微調背後框架)
    3. Backtesting.py
      • 簡介:Backtesting.py 是一個輕量級的 Python 回測框架,旨在簡化策略開發和回測流程
      • 特點:提供直觀易用的 API 接口,支持向量化運算,能夠高效地執行回測,適合快速原型設計和小型策略的測試,但已經很久沒人維護了
    4. FinLab
      • 簡介:FinLab 是台灣的量化交易平台,提供 Python 的回測工具和豐富的金融數據資源。
      • 特點:專注於台灣市場,提供本地證券和期貨的歷史數據,並提供教育資源和線上社群(Discord)
    5. vn.py
      • 簡介:vn.py 是一個基於 Python 的開源量化交易平台,主要在中國使用
      • 特點:支持多市場、多資產,提供完整的從數據、回測到實時交易的解決方案,並擁有活躍的開發者社群,另外有 GUI 可以使用

    本文我們將會比較: TQuant Lab、Backtrader 以及 Finlab 在撰寫策略以及回測上的差異。

    抓取數據範例可參考官網範例:

    Py 101209161710
    Py 101209161711

    實測與結論整理

    我們這邊使用相同的交易邏輯來編寫三個交易程式:

    使用一個簡單的移動平均線交叉策略或者官方範例參考,來比較回測的差異。 簡單的移動平均線交叉策略:在這個策略中,當短期移動平均線上穿長期移動平均線時買入,下穿時賣出。

    由於程式碼的部份十分冗長,因此我們將三份程式碼放在文末做為附錄,我們這邊直接看結論:

    1. 開發便利性
      • TQuant Lab:提供了一體化的開發環境,從數據獲取到回測都非常順暢。代碼簡潔明瞭,適合快速開發和測試策略。TQuant Lab 的模組化架構,已經事先將環境建置所需要設定的參數、因子和指標函式化,這不僅簡化整個平台的使用過程,即便是初學者能輕鬆上手。
      • Backtrader:需要自行準備和格式化數據,策略開發需要遵循特定的結構,學習曲線較陡。
      • FinLab:數據獲取相對方便,但策略函數需要特定的格式,對於初學者可能需要一些時間適應。
    2. 數據品質與覆蓋範圍
      • TQuant Lab:目前國內最大、最豐富的金融財經資料庫,提供高品質的歷史數據,覆蓋多個市場和資產類別,數據的完整性和準確性高。TQuant Lab 的資料集所提供的歷史數據內,總共包含「基本資料」、「公司營運」、「財務資料」、「籌碼資料」。
      • Backtrader:數據來源可以有多樣,但需要自己找數據跟自行處理數據的質量和一致性問題。
      • FinLab:主要專注於台灣市場,數據覆蓋範圍廣,但是由 FinLab 自行爬蟲取得,數據的準確性需要再確認。
    3. 回測準確度與效率
      • TQuant Lab:針對量化回測進行了優化,能夠高效地處理大量數據。內建了交易成本與下單模擬功能以更貼合真實交易的情況。
      • Backtrader:功能強大但在大型數據集上可能會較慢,需要額外優化。
      • FinLab:回測速度適中,但在複雜策略下可能需要更多時間計算。
    4. 社區與支持
      • TQuant Lab:由專業團隊維護,提供了詳細的文件跟客服支援。
      • Backtrader:需要自備數據,很少人在維護了。
      • FinLab:本地化程度高,有一定的用戶群體,也有文件跟客服支援(Discord),但回測使用的 Backtrader 相對沒有 TQuant Lab使用的 zipline 多元。

    結論

    綜合以上比較,TQuant Lab 在開發便利性、數據品質、回測效率以及技術支持方面都表現都好。它提供了一個高度整合的環境,使得量化交易策略的開發和測試變得更加簡單高效。相較之下,Backtrader 雖然功能強大但學習成本較高,但數據處理更加繁瑣。FinLab 則受限於市場覆蓋範圍和社區資源。

    因此,TQuant Lab 是進行量化交易回測的最佳選擇。它不僅能夠滿足專業交易者的需求,對於初學者來說也是一個友好的入門工具,能夠快速上手並開展實際的策略開發和回測工作。

    比較項目TQuant LabBacktraderFinLab
    程式撰寫容易度
    提供簡潔直觀的API,開發流程順暢,適合快速上手
    中等
    需要遵循特定的架構,學習曲線較陡
    中等
    需要遵循特定的架構,學習曲線較陡
    資料取得容易度內置高品質數據,無需額外處理需自行準備和格式化數據,增加開發時間中等提供台灣市場數據,但其他市場數據取得有限
    資料完整度覆蓋多市場和多資產類別,數據完整性和準確性高中等數據覆蓋範圍廣,但是由 FinLab 自行爬蟲取得,數據的準確性需要再確認
    回測多樣性支援多種策略類型和回測需求,性能優化良好,且有很多範例中等功能強大,支持複雜策略和多資產回測中等回測功能較為基本,適用於簡單策略的測試,也是使用 Backtrader來回測
    範例多寡官方 Github 很多範例程式,且多為 Jupyter notebook 下載回來可以可以直接用少但是商品種類多元,數據來源也不同,很難直接抄下來用中等數量僅次於TQuant Lab 提供的範例
    缺點要花錢,綁三個月GitHub 好一陣子沒人在維護要花錢,綁約一年
    Overall最優選項不建議新手使用,彈性大中等選項

    TQuant Lab實測

    如上文所述,我們這邊使用相同的交易邏輯來編寫三個交易程式:使用一個簡單的移動平均線交叉策略或者官方範例參考,主要為比較回測的差異。 簡單的移動平均線交叉策略:在這個策略中,當短期移動平均線上穿長期移動平均線時買入,下穿時賣出

    TQuant Lab回測圖表:

    Python Backtest 10131037100

    TQuant Lab 回測圖表 1

    Python Backtest 10131037101

    TQuant Lab 回測圖表 2

    Backtrader 實測

    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()

    Finlab 實測

    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()
    Python Backtest 10131037102

    Finlab 實測


    加入LINE社群量化交易討論群」無壓力討論與分享!

    加入Discord 「量化交易討論群」即時獲取實用的資源!

    Write Together 101306261122
    Write Together 101306261121
    量化通
    量化通

    量化通是個致力於全民量化金融教育的社群,我們希望透過由淺入深的內容,帶領大家以正確觀念來實踐自動化的金融投資研究分析。

    文章: 209

    發佈留言

    發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *