小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

基于Backtrader進(jìn)行量化交易策略(三重濾網(wǎng))回測(cè)

 飄零的訫 2024-03-22 發(fā)布于北京

簡(jiǎn)介

Backtrader 是一個(gè)開源的 Python 量化交易回測(cè)框架,功能非常強(qiáng)大,主要由以下模塊組成。

  • 數(shù)據(jù)模塊

支持多種數(shù)據(jù)源(Yahoo、Pandas、CSV)

  • 策略模塊

封裝了功能強(qiáng)大的交易接口,個(gè)人只需要實(shí)現(xiàn)策略邏輯即可

  • 指標(biāo)模塊

提供了多種交易指標(biāo),并提供了Ta-lib的支持,個(gè)人可根據(jù)接口規(guī)范實(shí)現(xiàn)自定義的指標(biāo)

  • 訂單模塊

提供了多種訂單類型

  • 經(jīng)紀(jì)模塊

提供了對(duì)實(shí)盤環(huán)境中會(huì)遇到的資金、稅費(fèi)、滑點(diǎn)、成交限制等問(wèn)題的支持

  • 倉(cāng)位模塊

提供了對(duì)倉(cāng)位的管理功能

  • 分析模塊

提供了對(duì)策略評(píng)估指標(biāo)的支持

  • 觀測(cè)模塊

提供了對(duì)買賣點(diǎn)、凈值曲線、盈虧曲線的支持

  • 繪圖模塊

提供了對(duì)可視化的支持

可見,基本上 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)時(shí)應(yīng)該注意的問(wèn)題。

實(shí)現(xiàn)技術(shù)指標(biāo)

在此策略中,強(qiáng)力指數(shù)是作者自定義的一個(gè)指標(biāo),因此需要自行實(shí)現(xiàn)。

# 自定義指標(biāo)需繼承自 bt.Indicatorclass ForceIndexLine(bt.Indicator): # 給指標(biāo)起一個(gè)名字 lines = ('FI',) # 設(shè)置指標(biāo)的時(shí)間周期 params = (('period', 2),)
def __init__(self): # 為計(jì)算指標(biāo)所需的最小時(shí)間周期 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)樯婕暗街堋⑷?、分鐘三個(gè)時(shí)間周期,因此需要分別處理

class TripleScreenStrategy(bt.Strategy):    # 動(dòng)力系統(tǒng)使用周級(jí)別的數(shù)據(jù), 設(shè)置EMA的時(shí)間周期    # 日線級(jí)別計(jì)算平均下跌穿透的時(shí)間周期, 以及設(shè)置止損時(shí)跌破均線的時(shí)間周期    params = (('EMA_W_T', 13), ('EMA_D_S', 3), ('EMA_D_M', 20), ('P', True))
def __init__(self): # 此策略需要傳入三種時(shí)間周期的數(shù)據(jù) self.data_m = self.datas[0] self.data_d = self.datas[1] self.data_w = self.datas[2]

然后需要注意的是: Backtrader自帶的指標(biāo)計(jì)算結(jié)果與國(guó)內(nèi)各平臺(tái)指標(biāo)數(shù)值不一致! 因此,如果想要得到與國(guó)內(nèi)平臺(tái)一致的指標(biāo)數(shù)值,需要自行實(shí)現(xiàn)按照國(guó)內(nèi)指標(biāo)計(jì)算規(guī)則的算法。好在已經(jīng)有開源庫(kù)(MyTT)實(shí)現(xiàn)了這些功能,安裝此庫(kù)后直接使用即可。

然后在 next 函數(shù)中添加每周、每天需要做的初始化操作。當(dāng)然,這里也可以使用Timer來(lái)實(shí)現(xiàn)。

def next(self): # 為拉長(zhǎng)指標(biāo)的計(jì)算周期, 設(shè)置的回測(cè)開始時(shí)間較早, 因此這里需要做時(shí)間過(guò)濾 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() # 每周的第一個(gè)交易日重置動(dòng)力系統(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ì)算由平均下跌穿透得到的買入價(jià) 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)之前在聚寬平臺(tái)上的處理,此外,這里添加了基于 ATR 的止損

if self.position: # 有持倉(cāng)時(shí)    # 動(dòng)力系統(tǒng)建議賣出則直接清倉(cāng)    if self.impulse_status < 0:        self.order_sell(1)        return    # 跌破買入價(jià)或均線一個(gè)ATR時(shí)止損    price = min(self.ema_d_m[self.idx_d], self.position.price)    atr_sell = price - self.close_m[0] > self.atr_d[self.idx_d]    if atr_sell:        self.order_sell(2)        self.max_high = 0        self.stops_prefit = True        return    if self.data_m.high[0] > self.max_high:        self.max_high = self.data_m.high[0]else: # 沒有持倉(cāng)時(shí)    # 動(dòng)力系統(tǒng)建議賣出或者當(dāng)周已經(jīng)做過(guò)止損則不再交易    if self.impulse_status < 0 or self.stops_prefit:        return            # 跌破買入價(jià)后記錄狀態(tài)    if self.close_m[0] < self.adp_p:        self.adp_f = True        return    # 又重新站上買入價(jià)時(shí)買入    if self.adp_f and self.close_m[0] > self.adp_p:        self.order_buy(1)        return    # 10點(diǎn)之后突破昨日最高價(jià)則買入    after = self.data_m.datetime.time(0) >= self.am10    if after and self.close_m[0] > self.high_d[0]:        self.order_buy(2)        return

測(cè)試交易策略

cerebro = bt.Cerebro()
# 為盡量模擬全倉(cāng)的效果, 這里設(shè)置最小單位為10cerebro.addsizer(bt.sizers.FixedSize, stake=10)
# 加入三種時(shí)間周期的數(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è)績(jī)?cè)u(píng)估指標(biāo)

接下來(lái)就要分析一下策略的業(yè)績(jī),通過(guò) Backtrader 自帶的分析器即可得到收益、回撤、指標(biāo)等各項(xiàng)數(shù)據(jù)。

圖片

如果想要更詳細(xì)的數(shù)據(jù),也可以基于 quantstats 庫(kù)做進(jìn)一步的分析

圖片

當(dāng)然,如果想要實(shí)現(xiàn)更復(fù)雜的顯示效果,完全可以將收益序列導(dǎo)出后加載到 Highcharts-Stock 進(jìn)行定制化開發(fā)。

圖片

參數(shù)優(yōu)化

在實(shí)現(xiàn)策略時(shí)涉及到了三個(gè)參數(shù)

class TripleScreenStrategy(bt.Strategy):    # 動(dòng)力系統(tǒng)使用周級(jí)別的數(shù)據(jù), 設(shè)置EMA的時(shí)間周期    # 日線級(jí)別計(jì)算平均下跌穿透的時(shí)間周期, 以及設(shè)置止損時(shí)跌破均線的時(shí)間周期    params = (('EMA_W_T', 13), ('EMA_D_S', 3), ('EMA_D_M', 20), ('P', True))

顯然,周線級(jí)別的參數(shù)決定了買入時(shí)參考的時(shí)間周期,日線級(jí)別的參數(shù)決定了賣出時(shí)參考的時(shí)間周期。13、3、20 只是一種想當(dāng)然的經(jīng)驗(yàn)值,是否還有其它更優(yōu)的參數(shù)組合?如果是在量化平臺(tái)網(wǎng)站進(jìn)行測(cè)試,目前看來(lái)大多都只能手動(dòng)調(diào)整。然而使用 Backtrader 的話,則只需要稍加修改,就可以支持對(duì)多個(gè)參數(shù)組合的回測(cè)。

# cerebro.addstrategy(strategy)# 將 addstrategy 修改為 optstrategy 即可,然后加入要測(cè)試的策略中的參數(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ù)的BUGresults = cerebro.run(maxcpus=1)

得到完整的參數(shù)組合效果

W_T, D_S, D_M, 平均年化, 最大回撤, 夏普比率  5,   3,   5,     2.69,   -18.91,    -0.03  5,   3,  10,     2.78,   -18.86,    -0.02  5,   3,  15,     2.77,   -18.63,    -0.03  5,   3,  20,     1.88,   -18.42,    -0.07  5,   3,  25,     1.20,   -19.08,    -0.10  5,   6,   5,     0.53,   -21.61,    -0.10  5,   6,  10,     0.00,   -21.92,    -0.12  5,   6,  15,     0.06,   -21.90,    -0.12  5,   6,  20,    -0.06,   -21.21,    -0.13  5,   6,  25,    -1.06,   -21.89,    -0.17  5,   9,   5,     2.13,   -17.51,    -0.07  5,   9,  10,     1.65,   -17.78,    -0.10  5,   9,  15,     1.64,   -17.78,    -0.10  5,   9,  20,     1.44,   -17.43,    -0.12  5,   9,  25,     0.77,   -18.09,    -0.15  5,  12,   5,     3.08,   -18.38,    -0.02  5,  12,  10,     2.70,   -18.48,    -0.03  5,  12,  15,     2.82,   -18.50,    -0.03  5,  12,  20,     2.64,   -18.15,    -0.04  5,  12,  25,     1.96,   -18.89,    -0.06 10,   3,   5,     7.69,   -19.80,     0.14 10,   3,  10,     7.44,   -19.83,     0.13 10,   3,  15,     7.38,   -19.72,     0.13 10,   3,  20,     6.55,   -19.71,     0.11 10,   3,  25,     6.27,   -19.75,     0.10 10,   6,   5,     6.72,   -22.71,     0.11 10,   6,  10,     5.78,   -22.69,     0.08 10,   6,  15,     5.67,   -22.67,     0.08 10,   6,  20,     5.42,   -22.37,     0.07 10,   6,  25,     4.87,   -22.46,     0.06 10,   9,   5,     8.13,   -18.61,     0.15 10,   9,  10,     7.38,   -18.95,     0.14 10,   9,  15,     7.26,   -18.94,     0.13 10,   9,  20,     7.01,   -18.63,     0.13 10,   9,  25,     6.74,   -18.66,     0.12 10,  12,   5,     9.01,   -19.49,     0.17 10,  12,  10,     8.14,   -19.41,     0.15 10,  12,  15,     8.14,   -19.41,     0.15 10,  12,  20,     7.94,   -19.05,     0.14 10,  12,  25,     7.71,   -19.08,     0.14 15,   3,   5,     8.95,   -20.90,     0.16 15,   3,  10,     8.96,   -20.88,     0.16 15,   3,  15,     9.08,   -20.70,     0.16 15,   3,  20,     8.75,   -20.72,     0.15 15,   3,  25,     8.54,   -20.66,     0.15 15,   6,   5,     8.06,   -23.60,     0.13 15,   6,  10,     6.86,   -23.70,     0.11 15,   6,  15,     6.86,   -23.70,     0.11 15,   6,  20,     6.88,   -23.41,     0.11 15,   6,  25,     6.54,   -23.35,     0.10 15,   9,   5,     8.88,   -19.69,     0.16 15,   9,  10,     7.69,   -19.79,     0.14 15,   9,  15,     7.69,   -19.79,     0.14 15,   9,  20,     7.61,   -19.42,     0.14 15,   9,  25,     7.37,   -19.46,     0.13 15,  12,   5,     8.90,   -20.37,     0.16 15,  12,  10,     8.28,   -20.57,     0.15 15,  12,  15,     8.28,   -20.57,     0.15 15,  12,  20,     8.22,   -20.24,     0.15 15,  12,  25,     7.95,   -20.28,     0.14 20,   3,   5,     6.78,   -23.88,     0.11 20,   3,  10,     6.79,   -23.86,     0.11 20,   3,  15,     7.04,   -23.71,     0.11 20,   3,  20,     6.59,   -23.70,     0.10 20,   3,  25,     6.35,   -23.67,     0.10 20,   6,   5,     5.91,   -26.65,     0.09 20,   6,  10,     4.82,   -26.58,     0.06 20,   6,  15,     4.82,   -26.58,     0.06 20,   6,  20,     4.69,   -26.32,     0.06 20,   6,  25,     4.43,   -26.34,     0.05 20,   9,   5,     6.62,   -22.84,     0.10 20,   9,  10,     5.67,   -22.84,     0.08 20,   9,  15,     5.67,   -22.84,     0.08 20,   9,  20,     5.61,   -22.45,     0.08 20,   9,  25,     5.34,   -22.49,     0.07 20,  12,   5,     6.67,   -23.45,     0.10 20,  12,  10,     6.25,   -23.63,     0.09 20,  12,  15,     6.25,   -23.63,     0.09 20,  12,  20,     6.17,   -23.33,     0.09 20,  12,  25,     5.90,   -23.36,     0.09

從中可以看到,最優(yōu)結(jié)果有聚集的現(xiàn)象,即當(dāng)某個(gè)參數(shù)固定時(shí),調(diào)整其它參數(shù)對(duì)整體結(jié)果影響不大。當(dāng)然,最優(yōu)參數(shù)有過(guò)擬合的可能,具體還要結(jié)合收益曲線做進(jìn)一步的分析。

后期展望

通過(guò) Backtrader 可以本地運(yùn)行回測(cè)后,沒有了量化平臺(tái)積分的限制,那么就可以借助它的強(qiáng)大功能開始做一些有意思的事情了。比如,分析某個(gè)指標(biāo)在某些個(gè)股上的勝率,篩選對(duì)某些個(gè)股最有效的指標(biāo)。以及,各種技術(shù)形態(tài)在某些個(gè)股上的勝率。

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多