添加分析指标

# 添加分析指标
# 返回年初至年末的年度收益率
cerebro.addanalyzer(bt.analyzers.AnnualReturn, _name='_AnnualReturn')
# 计算最大回撤相关指标
cerebro.addanalyzer(bt.analyzers.DrawDown, _name='_DrawDown')
# 计算年化收益:日度收益
cerebro.addanalyzer(bt.analyzers.Returns, _name='_Returns', tann=252)
# 计算年化夏普比率:日度收益
cerebro.addanalyzer(bt.analyzers.SharpeRatio, _name='_SharpeRatio', timeframe=bt.TimeFrame.Days, annualize=True, riskfreerate=0) # 计算夏普比率
cerebro.addanalyzer(bt.analyzers.SharpeRatio_A, _name='_SharpeRatio_A')
# 返回收益率时序
cerebro.addanalyzer(bt.analyzers.TimeReturn, _name='_TimeReturn')
# 启动回测
result = cerebro.run()# 提取结果
print("--------------- AnnualReturn -----------------")
print(result[0].analyzers._AnnualReturn.get_analysis())
print("--------------- DrawDown -----------------")
print(result[0].analyzers._DrawDown.get_analysis())
print("--------------- Returns -----------------")
print(result[0].analyzers._Returns.get_analysis())
print("--------------- SharpeRatio -----------------")
print(result[0].analyzers._SharpeRatio.get_analysis())
print("--------------- SharpeRatio_A -----------------")
print(result[0].analyzers._SharpeRatio_A.get_analysis())# 常用指标提取
analyzer = {}
# 提取年化收益
analyzer['年化收益率'] = result[0].analyzers._Returns.get_analysis()['rnorm']
analyzer['年化收益率(%)'] = result[0].analyzers._Returns.get_analysis()['rnorm100']
# 提取最大回撤
analyzer['最大回撤(%)'] = result[0].analyzers._DrawDown.get_analysis()['max']['drawdown'] * (-1)
# 提取夏普比率
analyzer['年化夏普比率'] = result[0].analyzers._SharpeRatio_A.get_analysis()['sharperatio']# 日度收益率序列
ret = pd.Series(result[0].analyzers._TimeReturn.get_analysis())

下面是在 Backtrader 社区中找到的自定义分析器,用于查看每笔交易盈亏情况:

地址:

https://community.backtrader.com/topic/1274/closed-trade-list-including-mfe-mae-analyzer;

该案例涉及到 trade 对象的相关属性,具体可以参考官方文档:https://www.backtrader.com/docu/trade/ 。

class trade_list(bt.Analyzer):def __init__(self):self.trades = []self.cumprofit = 0.0def notify_trade(self, trade):if trade.isclosed:brokervalue = self.strategy.broker.getvalue()dir = 'short'if trade.history[0].event.size > 0: dir = 'long'pricein = trade.history[len(trade.history)-1].status.pricepriceout = trade.history[len(trade.history)-1].event.pricedatein = bt.num2date(trade.history[0].status.dt)dateout = bt.num2date(trade.history[len(trade.history)-1].status.dt)if trade.data._timeframe >= bt.TimeFrame.Days:datein = datein.date()dateout = dateout.date()pcntchange = 100 * priceout / pricein - 100pnl = trade.history[len(trade.history)-1].status.pnlcommpnlpcnt = 100 * pnl / brokervaluebarlen = trade.history[len(trade.history)-1].status.barlenpbar = pnl / barlenself.cumprofit += pnlsize = value = 0.0for record in trade.history:if abs(size) < abs(record.status.size):size = record.status.sizevalue = record.status.valuehighest_in_trade = max(trade.data.high.get(ago=0, size=barlen+1))lowest_in_trade = min(trade.data.low.get(ago=0, size=barlen+1))hp = 100 * (highest_in_trade - pricein) / priceinlp = 100 * (lowest_in_trade - pricein) / priceinif dir == 'long':mfe = hpmae = lpif dir == 'short':mfe = -lpmae = -hpself.trades.append({'ref': trade.ref,'ticker': trade.data._name,'dir': dir,'datein': datein,'pricein': pricein,'dateout': dateout,'priceout': priceout,'chng%': round(pcntchange, 2),'pnl': pnl, 'pnl%': round(pnlpcnt, 2),'size': size,'value': value,'cumpnl': self.cumprofit,'nbars': barlen, 'pnl/bar': round(pbar, 2),'mfe%': round(mfe, 2), 'mae%': round(mae, 2)})def get_analysis(self):return self.trades# 添加自定义的分析指标
cerebro.addanalyzer(trade_list, _name='tradelist')# 启动回测
result = cerebro.run(tradehistory=True)# 返回结果
ret = pd.DataFrame(result[0].analyzers.tradelist.get_analysis())

参数优化:

该功能只需通过 cerebro.optstrategy() 方法往大脑添加策略。

class TestStrategy(bt.Strategy):params=(('period1',5),('period2',10),) #全局设定均线周期......# 实例化大脑
cerebro1= bt.Cerebro(optdatas=True, optreturn=True)
# 设置初始资金
cerebro1.broker.set_cash(10000000)
# 加载数据
datafeed1 = bt.feeds.PandasData(dataname=data1, fromdate=datetime.datetime(2019,1,2), todate=datetime.datetime(2021,1,28))
cerebro1.adddata(datafeed1, name='600466.SH')# 添加优化器
cerebro1.optstrategy(TestStrategy, period1=range(5, 25, 5), period2=range(10, 41, 10))# 添加分析指标
# 返回年初至年末的年度收益率
cerebro1.addanalyzer(bt.analyzers.AnnualReturn, _name='_AnnualReturn')
# 计算最大回撤相关指标
cerebro1.addanalyzer(bt.analyzers.DrawDown, _name='_DrawDown')
# 计算年化收益
cerebro1.addanalyzer(bt.analyzers.Returns, _name='_Returns', tann=252)
# 计算年化夏普比率
cerebro1.addanalyzer(bt.analyzers.SharpeRatio_A, _name='_SharpeRatio_A')
# 返回收益率时序
cerebro1.addanalyzer(bt.analyzers.TimeReturn, _name='_TimeReturn')# 启动回测
result = cerebro1.run()# 打印结果
def get_my_analyzer(result):analyzer = {}# 返回参数analyzer['period1'] = result.params.period1analyzer['period2'] = result.params.period2# 提取年化收益analyzer['年化收益率'] = result.analyzers._Returns.get_analysis()['rnorm']analyzer['年化收益率(%)'] = result.analyzers._Returns.get_analysis()['rnorm100']# 提取最大回撤(习惯用负的做大回撤,所以加了负号)analyzer['最大回撤(%)'] = result.analyzers._DrawDown.get_analysis()['max']['drawdown'] * (-1)# 提取夏普比率analyzer['年化夏普比率'] = result.analyzers._SharpeRatio_A.get_analysis()['sharperatio']return analyzerret = []
for i in result:ret.append(get_my_analyzer(i[0]))pd.DataFrame(ret)

backtrader指标相关推荐

  1. Backtrader来啦:常见案例汇总

    量化投资与机器学习微信公众号,是业内垂直于量化投资.对冲基金.Fintech.人工智能.大数据等领域的主流自媒体.公众号拥有来自公募.私募.券商.期货.银行.保险.高校等行业30W+关注者,荣获202 ...

  2. Backtrader系列教程④:交易篇(上)

    预定系列 Backtrader 来了 Backtrader 数据篇 Backtrader 指标篇 Backtrader 交易篇(上) Backtrader 交易篇(下) Backtrader 策略篇 ...

  3. 视频教程-顾比均线以及顾比熵指标的策略编写-Python

    顾比均线以及顾比熵指标的策略编写 20年企业以及互联网软件开发经验,开发过互联网广告.大型企业组织项目资产管理.股票期货数字货币高频自动化交易系统.全市场数据流图式分析系统等,熟悉分层.消息驱动.微内 ...

  4. Backtrader(十一) - Indicator指标

    简述 backtrader支持 内置指标 和 talib 指标 相关文档: 内置指标:https://www.backtrader.com/docu/indautoref/ talib指标:https ...

  5. 使用Backtrader对股票历史数据进行指标回测

    本次使用tushare接口,股票为600018,时间是20200101--20211231. 使用的指标是:收盘价大于简单移动平均价. 佣金为0.001. 英文代码的英文原文:Quickstart G ...

  6. backtrader源码解析_BackTrader 中文文档 内置指标参考

    https://www.backtrader.com/docu/indautoref/ AccelerationDecelerationOscillator 加速/减速技术指标(AC)测量当前驱动力的 ...

  7. Backtrader系列教程③:指标篇

    概述 在编写策略时,除了常规的高开低收成交量等行情数据外,还会用到各式各样的指标(变量),比如宏观经济指标.基本面分析指标.技术分析指标.另类数据等等.Backtrader 大致有 2 种获取指标的方 ...

  8. 动量轮动与光大RSRS指标在backtrader的实现

    持续行动1期 58/100,"AI技术应用于量化投资研究". 前面我们说轮动其实是一种"范式",天然带着分散.组合的特点.动量也不是一个策略或者某一个因子,而是 ...

  9. Backtrader官方中文文档:集成TA-Lib指标库参考

    本文档参考backtrader官方文档,是官方文档的完整中文翻译,可作为backtrader中文教程.backtrader中文参考手册.backtrader中文开发手册.backtrader入门资料使 ...

最新文章

  1. 简单又实用的分享!SharePoint母版页引用(实战)
  2. Linux系统启动级别及grub配置(一)
  3. 第三部分 基本类型:第16章 数组
  4. 机器学习算法优缺点改进总结
  5. 使用ab进行页面的压力测试
  6. C# 实现程序最小化到托盘
  7. 【安安教具】-【工具】-【随机点名】模拟器 教你如何用python制作随机点名器
  8. win7计算机未连接网络,教你w7电脑本地连接受限制或无连接的七种解决方法
  9. Load和Initialize的区别和使用
  10. java对接快递鸟单号查询自动识别api接口,调用代码示例
  11. 机器学习:数学加强(二)——条件概率、贝叶斯公式、常见分布、协方差、相关系数、切比雪夫不等式、大数定律
  12. 全球与中国云计算数据中心IT资产处置(ITAD)市场深度研究分析报告
  13. 腾达路由器登录远端服务器无响应,腾达路由器 192.168.0.1(tendawifi.com)打不开,怎么办?...
  14. python股票交易接口-C++和C#调用
  15. 【DZX修改】根据性别不同显示不同的默认头像
  16. java调用微软语音库,微软语音识别SDK总结
  17. 禅道如何设置邮箱提醒
  18. 中国人是怎样移民到日本,拿到长期居留身份的呢?
  19. JavaEE进阶 - Spring Boot 日志文件 - 细节狂魔
  20. 用vue实现按字母排序的多选列表功能类似通讯录

热门文章

  1. Android Studio安装问题及填坑
  2. 集训04-06 (c++实现)
  3. 销售员所做的一切工作最终目的就是为了成交
  4. C语言enum关键字
  5. 100个经典的C语言算法
  6. GDB 使用——Linux C编程
  7. Symbian系统开发教程(二)
  8. Mybatis 在 IDEA 中使用 generator 逆向工程生成 pojo,mapper
  9. YASnippet - emacs 的代码片段管理工具
  10. .12-浅析webpack源码之NodeWatchFileSystem模块总览