更多精彩內容,歡迎關注公眾號:數量技術宅,也可新增技術宅個人微訊號:sljsz01,與我交流。
典型股票量化回測流程
典型的股票量化策略回測流程包括以下幾個步驟:
-
資料獲取:首先需要獲取所需的股票市場資料,包括股票價格、交易量、財務資料等。這些資料可以從金融資料供應商、交易所、財經網站或者專門的資料提供商處獲取。
-
資料預處理:對獲取到的資料進行預處理和清洗,以確保資料的質量和一致性。這包括去除異常值、處理缺失資料、調整股票價格(如復權處理)等。
-
策略開發:根據具體的量化策略目標,設計和開發相應的交易策略。這可能涉及技術指標的計算、訊號生成規則的制定、風險管理規則的定義等。
-
-
績效評估:根據回測結果評估策略的績效表現。常見的評估指標包括累計收益、年化收益率、最大回撤、夏普比率等。此外,還可以進行風險敞口、交易頻率等方面的分析。
上述流程中,1、2我們可以使用Tushare配合Pandas庫來進行,而3、4、5步驟可以使用Backtrader庫來完成。接下來,我們就來介紹Tushare和Backtrader在量化回測中的使用。
如何使用Tushare獲取股票資料
Tushare是一個基於Python語言的開源金融資料介面包,提供了豐富的股票、期貨、基金等金融資料獲取功能。 Tushare為金融從業者和開發者提供了方便快捷的資料獲取和處理工具,幫助他們進行金融資料分析和量化策略開發。
要安裝和使用Tushare,我們需要按照以下步驟進行操作:
-
安裝Python:首先,確保你的計算機上已經安裝了Python。Tushare支援Python 3.x版本。
-
安裝Tushare包:開啟命令列終端(Windows使用者可以使用命令提示符或PowerShell),輸入以下命令安裝Tushare包:
pip install tushare
-
-
獲取Tushare的Token:在使用Tushare之前,你需要在Tushare官網(https://tushare.pro)註冊一個賬號,並獲取API令牌(Token)。登入後,在使用者中心頁面可以找到你的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)
-
在上面的示例中,首先使用
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的一些主要特點和功能:
-
靈活的策略開發:Backtrader提供了簡潔而靈活的API,使得策略的開發變得方便。你可以透過繼承和擴充套件Backtrader的基礎類來建立自定義的交易策略,並在其中定義買入、賣出訊號和風險管理規則等。
-
多種交易工具支援:Backtrader支援多種交易工具,包括股票、期貨、外匯等。你可以使用Backtrader來開發各種市場的交易策略。
-
多樣化的交易指標和分析工具:Backtrader內建了大量的交易指標和分析工具,如移動平均線、布林帶、相對強弱指標(RSI)、夏普比率等。這些工具可以幫助你分析市場趨勢、計算策略績效等。
-
靈活的資料回測: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策略模組邏輯,構建自己的量化交易策略。總之,本文提供的是一個通用的回測框架,更多的玩法留給我們的讀者。