簡介Backtrader 是一個開源的 Python 量化交易回測框架,功能非常強(qiáng)大,主要由以下模塊組成。
支持多種數(shù)據(jù)源(Yahoo、Pandas、CSV)
封裝了功能強(qiáng)大的交易接口,個人只需要實(shí)現(xiàn)策略邏輯即可
提供了多種交易指標(biāo),并提供了Ta-lib的支持,個人可根據(jù)接口規(guī)范實(shí)現(xiàn)自定義的指標(biāo)
提供了多種訂單類型
提供了對實(shí)盤環(huán)境中會遇到的資金、稅費(fèi)、滑點(diǎn)、成交限制等問題的支持
提供了對倉位的管理功能
提供了對策略評估指標(biāo)的支持
提供了對買賣點(diǎn)、凈值曲線、盈虧曲線的支持
提供了對可視化的支持 可見,基本上 Backtrader 已經(jīng)囊括了在量化交易中的方方面面,而且,它的文檔非常詳盡,按照官方文檔即可很快上手。 官方文檔: https://www./docu/ 實(shí)現(xiàn)三重濾網(wǎng)獲取歷史數(shù)據(jù)在之前的文章中已經(jīng)給出了幾種免費(fèi)獲取歷史交易數(shù)據(jù)的方式,可自行查看。 梳理交易策略在之前的文章中已經(jīng)給出了此策略的大體思路,以及使用程序?qū)崿F(xiàn)時應(yīng)該注意的問題。 實(shí)現(xiàn)技術(shù)指標(biāo)在此策略中,強(qiáng)力指數(shù)是作者自定義的一個指標(biāo),因此需要自行實(shí)現(xiàn)。 # 自定義指標(biāo)需繼承自 bt.Indicator class ForceIndexLine(bt.Indicator): # 給指標(biāo)起一個名字 lines = ('FI',) # 設(shè)置指標(biāo)的時間周期 params = (('period', 2),)
def __init__(self): # 為計(jì)算指標(biāo)所需的最小時間周期 self.addminperiod(self.p.period*2)
def next(self): last_c = self.data.close[-1] curt_c = self.data.close[0] curt_v = self.data.volume[0]
# 設(shè)置強(qiáng)力指數(shù)的計(jì)算邏輯 self.lines.FI[0] = curt_v * (curt_c - last_c) / 1000000 實(shí)現(xiàn)交易策略因?yàn)樯婕暗街堋⑷?、分鐘三個時間周期,因此需要分別處理
然后需要注意的是: Backtrader自帶的指標(biāo)計(jì)算結(jié)果與國內(nèi)各平臺指標(biāo)數(shù)值不一致! 因此,如果想要得到與國內(nèi)平臺一致的指標(biāo)數(shù)值,需要自行實(shí)現(xiàn)按照國內(nèi)指標(biāo)計(jì)算規(guī)則的算法。好在已經(jīng)有開源庫(MyTT)實(shí)現(xiàn)了這些功能,安裝此庫后直接使用即可。 然后在 next 函數(shù)中添加每周、每天需要做的初始化操作。當(dāng)然,這里也可以使用Timer來實(shí)現(xiàn)。 def next(self): # 為拉長指標(biāo)的計(jì)算周期, 設(shè)置的回測開始時間較早, 因此這里需要做時間過濾 wait_flag = self.data_m.datetime.datetime(0) < datetime.datetime(2020, 1, 6) if wait_flag: return # 每天開盤后做初始化的操作 if self.data_m.datetime.time(0) == datetime.time(9, 35): self.idx_w = self.data_w.datetime.get_idx() self.idx_d = self.data_d.datetime.get_idx() calendar = self.data_m.datetime.datetime(0).isocalendar() # 每周的第一個交易日重置動力系統(tǒng)狀態(tài) if self.calendar is None or calendar[0] != self.calendar[0] or calendar[1] != self.calendar[1]: self.calendar = calendar self.stops_prefit = False self.impulse_status = 0 self.impulse_system() # 每天重新計(jì)算由平均下跌穿透得到的買入價 self.adp_f = False array = [self.ema_d_s[self.idx_d i] - self.data_d.close[i] for i in range(-2, 1)] self.adp_v = sum([item for item in array if item > 0]) / self.p.EMA_D_S pre_ema = 2 * self.ema_d_s[self.idx_d - 1] - self.ema_d_s[self.idx_d - 2] self.adp_p = pre_ema - self.adp_v 然后實(shí)現(xiàn)之前在聚寬平臺上的處理,此外,這里添加了基于 ATR 的止損
測試交易策略cerebro = bt.Cerebro()
# 為盡量模擬全倉的效果, 這里設(shè)置最小單位為10 cerebro.addsizer(bt.sizers.FixedSize, stake=10)
# 加入三種時間周期的數(shù)據(jù), 也可以使用 resampling 模式 m_data = get_data_feed(stock, '5M', '%Y-%m-%d %H:%M:%S') cerebro.adddata(m_data, name=f'{stock}-5M') d_data = get_data_feed(stock, 'D', '%Y-%m-%d') cerebro.adddata(d_data, name=f'{stock}-D')
w_data = get_data_feed(stock, 'W', '%Y-%m-%d') cerebro.adddata(w_data, name=f'{stock}-W') # 設(shè)置資金和稅費(fèi) cerebro.broker.setcash(CASH) cerebro.broker.setcommission(COMMISSION)
# 添加策略后運(yùn)行并繪制結(jié)果 cerebro.addstrategy(strategy) cerebro.run() cerebro.plot() 業(yè)績評估指標(biāo)接下來就要分析一下策略的業(yè)績,通過 Backtrader 自帶的分析器即可得到收益、回撤、指標(biāo)等各項(xiàng)數(shù)據(jù)。 如果想要更詳細(xì)的數(shù)據(jù),也可以基于 quantstats 庫做進(jìn)一步的分析 當(dāng)然,如果想要實(shí)現(xiàn)更復(fù)雜的顯示效果,完全可以將收益序列導(dǎo)出后加載到 Highcharts-Stock 進(jìn)行定制化開發(fā)。 參數(shù)優(yōu)化在實(shí)現(xiàn)策略時涉及到了三個參數(shù)
顯然,周線級別的參數(shù)決定了買入時參考的時間周期,日線級別的參數(shù)決定了賣出時參考的時間周期。13、3、20 只是一種想當(dāng)然的經(jīng)驗(yàn)值,是否還有其它更優(yōu)的參數(shù)組合?如果是在量化平臺網(wǎng)站進(jìn)行測試,目前看來大多都只能手動調(diào)整。然而使用 Backtrader 的話,則只需要稍加修改,就可以支持對多個參數(shù)組合的回測。 # cerebro.addstrategy(strategy) # 將 addstrategy 修改為 optstrategy 即可,然后加入要測試的策略中的參數(shù)組合 cerebro.optstrategy(strategy, EMA_W_T=range(5, 25, 5), EMA_D_S=range(3, 15, 3), EMA_D_M=range(5, 30, 5)) # 這里需要設(shè)置最大內(nèi)核數(shù)以避免目前其尚未修復(fù)的BUG results = cerebro.run(maxcpus=1) 得到完整的參數(shù)組合效果
從中可以看到,最優(yōu)結(jié)果有聚集的現(xiàn)象,即當(dāng)某個參數(shù)固定時,調(diào)整其它參數(shù)對整體結(jié)果影響不大。當(dāng)然,最優(yōu)參數(shù)有過擬合的可能,具體還要結(jié)合收益曲線做進(jìn)一步的分析。 后期展望通過 Backtrader 可以本地運(yùn)行回測后,沒有了量化平臺積分的限制,那么就可以借助它的強(qiáng)大功能開始做一些有意思的事情了。比如,分析某個指標(biāo)在某些個股上的勝率,篩選對某些個股最有效的指標(biāo)。以及,各種技術(shù)形態(tài)在某些個股上的勝率。 |
|