backtrader 量化回测模块中 cerebro.plot()图像不是很方便使用,所以测试了很多作图相关的模块;
总结:
1.backtrader_bokeh这个应该是一种付费的模块,所以本人没有钱
2. quantstats quantstats
这个模块最关键的是要做索引设置returns.index = returns.index.tz_convert(None)

cerebro.addanalyzer(bt.analyzers.PyFolio, _name='pyfolio')
back  = cerebro.run(maxcpus=12,exactbars=True,stdstats=False)strat = back[0]
portfolio_stats = strat.analyzers.getbyname('pyfolio')
returns, positions, transactions, gross_lev = portfolio_stats.get_pf_items()
returns.index = returns.index.tz_convert(None)

3.backtrader_plotting 是Bokeh专门针对backtrader开发的模块port端口没有办法改变,不方便做成相关服务被flask app调用,只能单独使用https://github.com/verybadsoldier/backtrader_plotting

4.btplotting 这个模块是在backtrader_plotting模块下改进的,可以改变相关端口port,构建单独的新服务被flask app 进行整合,但是不能够适应复杂策略需求,同时在backtrader Bokeh模块下有个小bug需要在处理

5.backtrader_plotly这个模块没有进行相关测试,感觉不太被维护 https://github.com/lamkashingpaul/backtrader_plotly

6.Bokeh这个是backtrader自带的作图模块,上面这些都是基于此模型改进开发的

7.如果想要一个适合自己喜欢那就动手造吧!知乎上的大神做了
Dash plotly https://zhuanlan.zhihu.com/p/98775974

8.折腾案例学习和借鉴,量化大道溜达走起
BTR-E2020 https://github.com/klein203/BTR-E2020

learn_backtrader
https://github.com/jrothschild33/learn_backtrader

from btplotting import BacktraderPlotting, BacktraderPlottingOptBrowser
from btplotting.schemes import Tradimodef btplotting_results():result = cerebro.run(optreturn=False)strat = result[0]btp = BacktraderPlotting(style='bar', multiple_tabs=True)browser = BacktraderPlottingOptBrowser(btp, strat,port=9000)browser.start()return
from __future__ import (absolute_import, division, print_function,unicode_literals)import datetime  # 用于datetime对象操作
import os.path  # 用于管理路径
import sys  # 用于在argvTo[0]中找到脚本名称
import backtrader as bt # 引入backtrader框架
import backtrader.feeds as btfeeds
import pandas as pdimport quantstats
import warnings
warnings.filterwarnings('ignore')import math
# 创建策略
class SmaCross(bt.Strategy):# 可配置策略参数params = dict(pfast=10,  # 短期均线周期pslow=30,  # 长期均线周期poneplot=False,  # 是否打印到同一张图# pstake = 1000 # 单笔交易股票数目)def __init__(self):# self.log_file = open('position_log.txt', 'w') # 用于输出仓位信息self.inds = dict()for i, d in enumerate(self.datas):self.inds[d] = dict()self.inds[d]['dataclose'] = d.closeself.inds[d]['sma1'] = bt.ind.SMA(d.close, period=self.p.pfast)  # 短期均线self.inds[d]['sma2'] = bt.ind.SMA(d.close, period=self.p.pslow)  # 长期均线self.inds[d]['cross'] = bt.ind.CrossOver(self.inds[d]['sma1'], self.inds[d]['sma2'], plot=False)  # 交叉信号# 跳过第一只股票data,第一只股票data作为主图数据if i > 0:if self.p.poneplot:d.plotinfo.plotmaster = self.datas[0]def next(self):for i, d in enumerate(self.datas):dt, dn = self.datetime.date(), d._name  # 获取时间及股票代码pos = self.getposition(d)# 买入策略if not len(pos):  # 不在场内,则可以买入if self.inds[d]['cross'] > 0:  # 如果金叉# self.buy(data = d, size = self.p.pstake) # 买买买self.buy(data=d)  # 买买买# 止损策略elif self.inds[d]['cross'] < 0:  # 在场内,且死叉self.close(data=d)  # 卖卖卖elif ((pos.price - pos.adjbase) > 0.3) or ((pos.adjbase - pos.price) > 0.4):#                 print("code: {},pos_price:{},today_close:{},value_size{}".format(#                     d._name, pos.price, pos.adjbase,pos.size))self.close(data=d)  # 卖卖卖cerebro = bt.Cerebro()
import tushare as ts# 初始化pro接口,写自己的免费token
pro = ts.pro_api('******************************')
data = pro.query('stock_basic', exchange='', list_status='L', fields='ts_code')
stk_pools = data.ts_code[:5]
def quantstats_cerebro_plot():results = cerebro.run(stdstats=False, tradehistory=True)  # executestrat = results[0]pyfoliozer = strat.analyzers.getbyname('pyfolio')returns, positions, transactions, gross_lev = pyfoliozer.get_pf_items()returns.index = returns.index.tz_convert(None)quantstats.reports.html(returns,output='fstatss.html',download_filename='fstatss.html', title='Returns Sentiment')return
def bokeh_cerebro_plot():from backtrader_plotting import Bokeh, OptBrowserfrom backtrader_plotting.schemes import Tradimofrom bokeh.io import show, save, output_filecerebro.run(optreturn=False, tradehistory=True)fnames = "bt_bokeh_plot.html"b = Bokeh(style='bar', tabs='multi', filename=fnames)  # 黑底,多页# b=Bokeh(style='bar',scheme=Tradimo()) # 传统白底,单页# b=Bokeh(style='bar',tabs='multi',scheme=Tradimo()) #传统白底,多页output_file(fnames, mode='cdn', title='海龟交易策略')cerebro.plot(b)return
if __name__ == '__main__':# 获取数据for stk_code in stk_pools:# 拉取数据df = pro.daily(**{"ts_code": stk_code,"trade_date": "","start_date": "20180101","end_date": "20211231","offset": "","limit": ""}, fields=["ts_code","trade_date","open","high","low","close","pre_close","change","pct_chg","vol","amount"])df = df.iloc[::-1]# tushare数据存入excel后,trade_date变为int类型列,需变成string后转为datatime类型df.trade_date = pd.to_datetime(df.trade_date.apply(str))data = btfeeds.PandasData(dataname=df,fromdate=datetime.datetime(2018, 1, 1),todate=datetime.datetime(2021, 12, 31),timeframe=bt.TimeFrame.Days,datetime='trade_date',open='open',high='high',low='low',close='close',volume='vol',openinterest=-1)# 在Cerebro中添加股票数据cerebro.adddata(data, name=str(stk_code))# 设置启动资金cerebro.broker.setcash(100000.0)# 设置佣金为零cerebro.broker.setcommission(commission=0.001)idx = cerebro.addstrategy(SmaCross, poneplot=False)  # 添加策略cerebro.addsizer_byidx(idx, maxRiskSizer)cerebro.addanalyzer(bt.analyzers.SharpeRatio)cerebro.addobserver(bt.obs.Broker)  # removed below with stdstats=Falsecerebro.addobserver(bt.obs.Trades)  # removed below with stdstats=Falsecerebro.broker.set_coc(True)cerebro.addanalyzer(bt.analyzers.PyFolio, _name='pyfolio')cerebro.addanalyzer(bt.analyzers.SharpeRatio, _name='SharpeRatio')cerebro.addanalyzer(bt.analyzers.DrawDown, _name='DW')cerebro.addanalyzer(bt.analyzers.AnnualReturn, _name='AnnualReturn')cerebro.addanalyzer(bt.analyzers.Returns, _name='Returns')cerebro.addanalyzer(bt.analyzers.SQN, _name='SQN')cerebro.addanalyzer(bt.analyzers.PyFolio, _name='pyfolio')# 添加观测器observerscerebro.addobserver(bt.observers.Broker)cerebro.addobserver(bt.observers.Trades)cerebro.addobserver(bt.observers.BuySell)cerebro.addobserver(bt.observers.DrawDown)cerebro.addobserver(bt.observers.TimeReturn)cerebro.addobserver(bt.observers.Value)print('初始资金: %.2f' % cerebro.broker.getvalue())bokeh_cerebro_plot()quantstats_cerebro_plot()print('最终资金: %.2f' % cerebro.broker.getvalue())

backtrader的回测结果之Bokel quantstats backtrader_plotting btplotting相关推荐

  1. Backtrader 策略回测初探

    Backtrader 策略回测初探 这篇介绍简单的回测流程,主要的内容如下: 回测函数介绍 单股回测 多股回测 回测函数 回测策略类很简洁,直接继承 bt.Strategy ,复写父类的方法,最后把回 ...

  2. backtrader期权回测框架

    使用backtrader数据进行回测,数据源来自于交易所爬取. 效果还行,我相信各位通过这个的框架学习,会对backtrader的应用有更深的领悟.包括数据的连接,新指标的加入. 导入框架: __fu ...

  3. python tushare backtrader股票回测双均线策略

    前言: 在前面学了点机器学习知识后,发现自己还没有一个回测框架,找了短时间学习资料,还是决定使用backtrader,至于聚宽优米那些平台感觉使用起来好像没那么自由,还是先学习下backtrader, ...

  4. backtrader量化回测,基础篇,附MACD交易回测代码

    backtrader由德国工程师开发,拥有股票的回测,检测交易策略,支持期货实时交易,对于股票交易还在完善,我尝试了pylagotrade,vn.py,发现backtrader功能强大,交易策略全面, ...

  5. 【手把手教你】用backtrader量化回测海龟交易策略

    01 引言 海龟交易策略是比较经典的趋势交易系统之一,涵盖了从入场交易(品种选择).仓位管理(基于ATR加减仓).离场(触发条件)的整个过程.机械套用海龟交易法则在A股上进行交易可能效果不佳,但其交易 ...

  6. 扫地僧Backtrader量化回测与交易闭环生态系列教程

    backtrader是著名的开源量化框架,作者叫Daniel Rodriguez,就是下图这位老兄. 这个作者是德国人,工作在德国慕尼黑,编程水平极高,比国内一些非专业程序员编写的回测平台代码质量高太 ...

  7. Backtrader量化回测1——基本的交易策略与挂单买卖

    Backtrader Github页面:https://github.com/mementum/backtrader 官网Quickstart 教程:https://www.backtrader.co ...

  8. Backtrader量化回测11——策略信号Indicator

    对于程序来讲,该有的代码一行都不会少,但是把代码分块就可以很直观的阅读或修改代码.使用Indicator可以将策略的信号从策略类Strategy中脱离出来,方便策略进行协调与控制 文章目录 策略信号 ...

  9. 量化策略——准备3 数据、Backtrader回测框架与quantstats评价指标

    我们一般使用AKShare这个库来获取股票数据或策略中用得到的数据: AKShare github主页:https://github.com/akfamily/akshare 使用Backtrader ...

  10. 把backtrader改造成金融强化学习回测引擎

    原创文章第119篇,专注"个人成长与财富自由.世界运作的逻辑, AI量化投资". 继续强化学习应用于金融投资. 我们的AI量化平台,针对传统规则量化策略,进行了"积木式& ...

最新文章

  1. transforms函数查询
  2. WWW 2021|基于图神经网络的分级相关性匹配
  3. Java – HashMap详细说明
  4. Android自己定义DataTimePicker(日期选择器)
  5. 向ES6看齐,用更好的JavaScript(三)
  6. Bootstrap表格表单
  7. struts2学习一:搭建第一个struts2.5项目
  8. mysql预编译表名_JDBC预编译语句表名占位异常
  9. 拓端tecdat|R语言模拟ARCH过程模型分析时间序列平稳性、波动性
  10. Tinker的简单接入
  11. 功率放大器的设计要点
  12. FCM算法与K-means 算法
  13. 三星s8怎么分屏操作_三星Galaxy Z Fold2帮你应对快节奏生活
  14. debian中直接使用yed.jar
  15. 测绘专硕要学计算机吗,测绘工程专硕专业介绍_测绘工程非全日制研究生(专业硕士)_125在职研究生...
  16. MDM三权分立及分类分级权限说明
  17. vue-cli、脚手架创建、eslint、alias别名配置、proxy代理配置、axios、scoped、穿透、媒体查询、12栅格、动态rem、1px边框、移动端事件、300ms延迟问题(六)
  18. 【图像加密】DNA混沌系统图像加密【含Matlab源码 1190期】
  19. springcloud-微服务
  20. 《老炮儿》结尾貌似历史上的一幕

热门文章

  1. Java自动生成编号
  2. mysql怎么设置id自动编号_MySQL中实现ID编号自动增加的方法
  3. 两个ip linux,教你ipconfig有两个ip地址的解决方法
  4. 《影响中国大数据产业进程100人》 刘冬冬: 数据如何来支持新的商业战争
  5. the little schemer 笔记(10)
  6. html设置文字在背景图上,css如何实现文字在背景图片之上 css实现文字在背景图片之上代码...
  7. Oracle | 初级-第一章 Oracle概述
  8. ie 无人操作自动关闭_为什么ie11打开未响应然后闪退_win10ie打开就未响应自动关闭的解决方法...
  9. 2015美国大学计算机科学专业排名,美国大学研究生计算机科学专业排名|2015年计算机科学专业排行榜(1/2)- 各国学校排名网...
  10. 超越YOLOv4-tiny!YOLObile:移动设备上的实时目标检测 [左侧有码]