如何使用Tushare+ Backtrader進行股票量化策略回測

数量技术宅發表於2024-05-08

更多精彩內容,歡迎關注公眾號:數量技術宅,也可新增技術宅個人微訊號:sljsz01,與我交流。

典型股票量化回測流程

典型的股票量化策略回測流程包括以下幾個步驟:

  1. 資料獲取:首先需要獲取所需的股票市場資料,包括股票價格、交易量、財務資料等。這些資料可以從金融資料供應商、交易所、財經網站或者專門的資料提供商處獲取。

  2. 資料預處理:對獲取到的資料進行預處理和清洗,以確保資料的質量和一致性。這包括去除異常值、處理缺失資料、調整股票價格(如復權處理)等。

  3. 策略開發:根據具體的量化策略目標,設計和開發相應的交易策略。這可能涉及技術指標的計算、訊號生成規則的制定、風險管理規則的定義等。

  4. 回測執行:使用歷史資料執行所開發的策略。按照時間順序,逐個週期模擬交易決策,並記錄每次交易的執行價格、成交量、手續費等資訊。

  5. 績效評估:根據回測結果評估策略的績效表現。常見的評估指標包括累計收益、年化收益率、最大回撤、夏普比率等。此外,還可以進行風險敞口、交易頻率等方面的分析。

上述流程中,1、2我們可以使用Tushare配合Pandas庫來進行,而3、4、5步驟可以使用Backtrader庫來完成。接下來,我們就來介紹Tushare和Backtrader在量化回測中的使用。

如何使用Tushare獲取股票資料

Tushare是一個基於Python語言的開源金融資料介面包,提供了豐富的股票、期貨、基金等金融資料獲取功能。 Tushare為金融從業者和開發者提供了方便快捷的資料獲取和處理工具,幫助他們進行金融資料分析和量化策略開發。

要安裝和使用Tushare,我們需要按照以下步驟進行操作:

  1. 安裝Python:首先,確保你的計算機上已經安裝了Python。Tushare支援Python 3.x版本。

  2. 安裝Tushare包:開啟命令列終端(Windows使用者可以使用命令提示符或PowerShell),輸入以下命令安裝Tushare包:

pip install tushare
  1. 這將自動從Python包索引(PyPI)下載並安裝Tushare包及其依賴項。

  2. 獲取Tushare的Token:在使用Tushare之前,你需要在Tushare官網(https://tushare.pro)註冊一個賬號,並獲取API令牌(Token)。登入後,在使用者中心頁面可以找到你的Token。

  3. 使用Tushare:在Python中引入Tushare包,並使用你的Token進行初始化。以下是一個簡單的示例程式碼:

import tushare as ts

# 初始化Tushare,替換YOUR_TOKEN為你的Token
ts.set_token('YOUR_TOKEN')

# 建立Tushare介面物件
pro = ts.pro_api()

# 呼叫Tushare介面函式,獲取股票行情資料
data = pro.daily(ts_code='000001.SZ', start_date='20220101', end_date='20220131')

# 列印獲取的資料
print(data)
  1. 在上面的示例中,首先使用set_token函式設定你的Token,然後使用pro_api函式建立Tushare介面物件。接下來,可以使用各種Tushare介面函式(如daily)獲取不同型別的金融資料。

    請根據Tushare的文件(https://tushare.pro/document/2)和API參考(https://tushare.pro/document/1)檢視更多的介面函式和詳細用法。

需要注意,上述示例中的Tushare Pro的介面需要付費訂閱才能訪問高階資料。如果你想省去註冊和付費的麻煩,而且只取有限的簡單資料做個嘗試,可以使用Tushare的免費介面。免費介面的示例程式碼更簡單

import tushare as ts
# 獲取滬深300指數從2014年1月1日到最新的行情資料
hs300 = ts.get_k_data('hs300', start='2014-01-01')

由此,我們就獲取到了免費版本的滬深300指數從2014年1月1日到最新的日K線資料:

如何對資料進行視覺化

在獲取到滬深300的歷史K線資料後,我們如果想初步計算一些技術指標,並把技術指標和歷史行情展現出來,給我們下一步進行策略開發提供一些思路,應該如何實現?

對於資料視覺化,有兩種實現方式,一種是採用Python自帶的plt庫,另一種是專門處理顯示K線資料的三方庫:mplfinance。我們先來看第一種實現方式:

首先我們定義一個RSI函式,並輸入剛才獲取到的滬深300指數資料,然後,再呼叫plt庫的相關方法,將RSI指標和歷史價格,共同顯示在一張圖上。

# 將RSI值新增到hs300資料中
hs300['RSI'] = RSI(hs300)

# 畫圖
plt.figure(figsize=(12,6))
plt.plot(hs300['date'], hs300['close'], label='Close') # 畫出收盤價曲線
plt.legend(loc='upper left')
plt.twinx()
plt.plot(hs300['date'], hs300['RSI'], 'r', label='RSI') # 畫出RSI曲線
plt.legend(loc='upper right')
plt.show()

另一種方式,我們也可以使用mplfinance庫,繪製出獲取到滬深300的歷史K線資料的K線量價圖。這裡,我們留下同時繪製RSI指標的問題,給讀者思考和練習。

import mplfinance as mpf

hs300 = hs300.set_index('date')
hs300.index = pd.to_datetime(hs300.index)
mpf.plot(hs300, type='candle', volume=True, mav=(5,10,20), figratio=(12,6), title='HS300 Candlestick Chart')

如何使用BackTrader進行回測

Backtrader是一個功能強大的Python量化交易框架,用於開發、回測和執行交易策略。它提供了廣泛的功能和工具,使得量化交易策略的開發和測試變得更加簡單和高效。

Backtrader的一些主要特點和功能:

  1. 靈活的策略開發:Backtrader提供了簡潔而靈活的API,使得策略的開發變得方便。你可以透過繼承和擴充套件Backtrader的基礎類來建立自定義的交易策略,並在其中定義買入、賣出訊號和風險管理規則等。

  2. 多種交易工具支援:Backtrader支援多種交易工具,包括股票、期貨、外匯等。你可以使用Backtrader來開發各種市場的交易策略。

  3. 多樣化的交易指標和分析工具:Backtrader內建了大量的交易指標和分析工具,如移動平均線、布林帶、相對強弱指標(RSI)、夏普比率等。這些工具可以幫助你分析市場趨勢、計算策略績效等。

  4. 靈活的資料回測:Backtrader提供了豐富的回測功能,可以使用歷史資料對策略進行測試和最佳化。你可以使用不同的時間週期和資料頻率進行回測,模擬真實的交易環境。同時,Backtrader還支援多執行緒回測,加快回測速度。

具體到Backtrader的使用,我們還是以獲取到的滬深300指數歷史資料、和RSI指標一起,構建量化策略的回測。首先,需要做的是把獲取到的K線資料,轉換成Backtrader的回測資料格式。

# Get data from tushare
df = ts.get_k_data('hs300', start='2014-01-01')
df['date'] = pd.to_datetime(df['date'])  # 將日期轉換為datetime格式
df = df.set_index('date', drop=True)  # 將日期設定為索引
data = bt.feeds.PandasData(dataname=df, datetime=None,
                           open=0, high=1, low=2, close=3, volume=4, openinterest=-1)  # 建立資料來源

第二步,我們構建一個RSI策略的回測函式,在這個回測函式中,我們先計算RSI指標14週期的數值,並以RSI<30作為買入訊號,RSI>70作為賣出訊號。

# Define the strategy
class RSI(bt.Strategy):
    params = (('rsi_period', 14),)

    def __init__(self):
        self.rsi = bt.indicators.RSI(period=self.params.rsi_period)

    def next(self):
        if not self.position:
            if self.rsi < 30:
                self.buy(size=1)
        else:
            if self.rsi > 70:
                self.sell(size=1)

第三步,呼叫BackTrader庫相關方法,新增回測資料、設定初始資金和手續費、輸出初始資金,執行策略,後輸出最終資金並繪製圖表。

cerebro = bt.Cerebro()
cerebro.adddata(data)  # 新增資料來源
cerebro.addstrategy(RSI)
cerebro.broker.setcash(1000000.0)  # 設定初始資金
cerebro.broker.setcommission(commission=0.001)  # 設定佣金
print('Starting Portfolio Value: %.2f' % cerebro.broker.getvalue())  # 輸出初始資金
cerebro.run()  # 執行策略
print('Final Portfolio Value: %.2f' % cerebro.broker.getvalue())  # 輸出最終資金
cerebro.plot()  # 繪製圖表

透過上述三步,我們就完成了資料BackTrader格式的預處理、構建策略訊號邏輯函式、以及執行BackTrader回測和展示回測結果,一起來看BackTrader展示的回測結果吧。

可以看到,BackTrader所展示的回測結果很豐富,包括了歷史量價和RSI指標的展示、買賣點的標記、資金曲線、回撤線以及NetValue的數值。

綜上,我們就完成了從資料獲取、到資料視覺化、再到策略回測的整個構建過程,感興趣的朋友,可以把示例中Tushare獲取的資料替換成其他標的歷史資料,也可也修改RSI策略模組邏輯,構建自己的量化交易策略。總之,本文提供的是一個通用的回測框架,更多的玩法留給我們的讀者。

相關文章