Backtrader Github页面:https://github.com/mementum/backtrader

官网Quickstart 教程:https://www.backtrader.com/docu/quickstart/quickstart/

温馨提示:大家不要用tushare这个库获取数据了,这个已经不能白嫖了…而且替换方案有很多

BackTrader编码流程

代码的架构也比较清晰:

  1. 控制所有流程的是cerebro组件
  2. 然后把数据(backtrader.feeds)、策略(backtrader.Strategy) 等都分别写好,最后添加到这个cerebro中即可

各个组件之间是类(class)的格式,继承自backtrader各自的父类,然后对有自定义需求的函数覆写,其他默认即可写一整套东西出来

交易单的触发

  1. 触发交易单需要手动的写在策略类的next()函数中,框架在执行过程中会不断循环next(),每经过一个K线,执行一次next(),示例可以见下面的代码

  2. 满足自定义的条件后,执行self.buy()即可买入,self.sell()即可卖出

  3. 策略类的notify_order是另一个会循环执行的函数,函数名称固定,可以跟踪订单的情况,比如使用order.executed.price就可以得到订单执行的价格,当策略中使用了条件单,限定了价格区间时,跟踪订单就非常有用了

示例代码

from datetime import datetime
import backtrader
from loguru import logger
import matplotlib.pyplot as plt
import pandas as pd
import efinancedef get_k_data(stock_code, begin: datetime, end: datetime) -> pd.DataFrame:"""根据efinance工具包获取股票数据:param stock_code:股票代码:param begin: 开始日期:param end: 结束日期:return:"""# stock_code = '600519'  # 股票代码,茅台k_dataframe: pd.DataFrame = efinance.stock.get_quote_history(stock_code, beg=begin.strftime("%Y%m%d"), end=end.strftime("%Y%m%d"))k_dataframe = k_dataframe.iloc[:, :9]k_dataframe.columns = ['name', 'code', 'date', 'open', 'close', 'high', 'low', 'volume', 'turnover']k_dataframe.index = pd.to_datetime(k_dataframe.date)k_dataframe.drop(['name', 'code', 'date'], axis=1, inplace=True)return k_dataframeclass MyStrategy1(backtrader.Strategy):  # 策略def __init__(self):# 初始化交易指令、买卖价格和手续费self.close_price = self.datas[0].close  # 这里加一个数据引用,方便后续操作self.sma = backtrader.indicators.SimpleMovingAverage(self.datas[0], period=5)  # 借用这个策略,计算5日的均线def notify_order(self, order):  # 固定写法,查看订单情况# 查看订单情况if order.status in [order.Submitted, order.Accepted]:  # 接受订单交易,正常情况returnif order.status in [order.Completed]:if order.isbuy():logger.debug('已买入, 购入金额 %.2f' % order.executed.price)elif order.issell():logger.debug('已卖出, 卖出金额 %.2f' % order.executed.price)elif order.status in [order.Canceled, order.Margin, order.Rejected]:logger.debug('订单取消、保证金不足、金额不足拒绝交易')def next(self):  # 固定的函数,框架执行过程中会不断循环next(),过一个K线,执行一次next()# 此时调用 self.datas[0]即可查看当天的数据# 执行买入条件判断:当天收盘价格突破5日均线if self.close_price[0] > self.sma[0]:# 执行买入logger.debug("buy 500 in {}, 预期购入金额 {}, 剩余可用资金 {}", self.datetime.date(), self.data.close[0],self.broker.getcash())self.buy(size=500, price=self.data.close[0])# 执行卖出条件已有持仓,且收盘价格跌破5日均线if self.position:if self.close_price[0] < self.sma[0]:# 执行卖出logger.debug("sell in {}, 预期卖出金额 {}, 剩余可用资金 {}", self.datetime.date(), self.data.close[0],self.broker.getcash())self.sell(size=500, price=self.data.close[0])if __name__ == '__main__':# 获取数据start_time = datetime(2015, 1, 1)end_time = datetime(2021, 1, 1)dataframe = get_k_data('600519', begin=start_time, end=end_time)# =============== 为系统注入数据 =================# 加载数据data = backtrader.feeds.PandasData(dataname=dataframe, fromdate=start_time, todate=end_time)# 初始化cerebro回测系统cerebral_system = backtrader.Cerebro()  # Cerebro引擎在后台创建了broker(经纪人)实例,系统默认每个broker的初始资金量为10000# 将数据传入回测系统cerebral_system.adddata(data)  # 导入数据,在策略中使用 self.datas 来获取数据源# 将交易策略加载到回测系统中cerebral_system.addstrategy(MyStrategy1)# =============== 系统设置 ==================# 设置启动资金为 100000start_cash = 1000000cerebral_system.broker.setcash(start_cash)# 设置手续费 万2.5cerebral_system.broker.setcommission(commission=0.00025)logger.debug('初始资金: {} 回测期间:from {} to {}'.format(start_cash, start_time, end_time))# 运行回测系统cerebral_system.run()# 获取回测结束后的总资金portvalue = cerebral_system.broker.getvalue()pnl = portvalue - start_cash# 打印结果logger.debug('净收益: {}', pnl)logger.debug("总资金: {}", portvalue)cerebral_system.plot(style='candlestick')plt.show()

最后查看日志:

.........
2022-05-05 16:38:06.484 | DEBUG    | __main__:<module>:70 - 净收益: 3445540.136249995
2022-05-05 16:38:06.484 | DEBUG    | __main__:<module>:71 - 总资金: 4445540.136249995

资产翻了小4倍,哇咔咔咔咔咔咔,最后的结果图如下:

Backtrader量化回测1——基本的交易策略与挂单买卖相关推荐

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

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

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

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

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

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

  4. 手把手教你用Python搭建自己的量化回测框架【均值回归策略】

    1 引言 大部分量化策略都可以归类为均值回归与动量策略.事实上,只有当股票价格是均值回归或趋势的,交易策略才能盈利.否则,价格是随机游走的,交易将无利可图.均值回归是金融学的一个重要概念,指股票价格无 ...

  5. 量化回测框架设计之交易篇(一)

    背景介绍 目前回测中报单模式可分为普通限价下单.拆单限价下单(TWAP及VWAP)及智能优化下单(只限定报单量,由算法自动根据当前市场状态优化报单价格),普通限价下单主要用于普通的策略回测,拆单限价下 ...

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

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

  7. vnpy怎么创建策略并回测_【手把手教你】入门量化回测最强神器backtrader(一)

    1 引言 目前基于Python的量化回测框架有很多,开源框架有zipline.vnpy.pyalgotrader和backtrader等,而量化平台有Quantopian(国外).聚宽.万矿.优矿.米 ...

  8. backtrader股票技术指标自定义与量化回测

    01 引言 股票市场自交易以来,人们就开始孜孜不倦地探索各种各样的投资理论,其中技术分析是重要的理论之一.实际上,技术分析是100多年前创建的股票投资理论,是投资者对股票量价变化长期观察归纳总结的若干 ...

  9. 如何用backtrader对股票组合进行量化回测?

    01 引言 backtrader是功能非常强大的量化回测框架之一,得到欧洲很多银行.基金等金融机构的青睐,并应用于实盘交易中.公众号Python金融量化针对backtrader的入门和应用已连续发布了 ...

最新文章

  1. 还不懂Docker?一个故事安排的明明白白!
  2. 高斯曲率求表面极值点
  3. mysql中数据定义和数据控制语言_MySQL 数据定义语言(DDL)
  4. 网络流24题——魔术球问题(有向无环图最小路径覆盖)
  5. 云监控中inode使用率监控具体作用是什么
  6. 大数据分析的环节有哪些
  7. malloc分配的内存空间是连续的吗
  8. 关于css布局的定位问题
  9. Kafka 多种跨 IDC 灾备方案调研对比
  10. cmos和ttl_TTL和CMOS电平别傻傻分不清
  11. 【产品志】华硕 ARUA 的 ARGB 方案
  12. AD15 PCB笔记
  13. 书籍之 Head First HTML与CSS
  14. 2020-10-27
  15. matlab 求信号频率响应,基于MATLAB的频率响应
  16. CNKI知网如何批量下载论文
  17. 软件专业学习之成长志(四)
  18. 学习笔记2022.7.25-7.30
  19. Linux下串口调试及使用shell编程接收数据
  20. Extjs处理客户复制三位一撇到numberfield里面

热门文章

  1. android自定义videoview,android-如何在播放前在videoview中设置预览图像
  2. C语言带符号整形的转换
  3. Mob开放日:成功手游基因大揭秘
  4. 点盾云输入激活码激活视频时,显示鉴权失败无效激活码怎么办?
  5. 地下消防应急通信救援多跳自组网电台设备MESH通信解决方案
  6. 打不开HTTPS网页的解决方案 解决打不开HTTPS 打不开安全网页 无法打开HTTPS 修复打开HTTPS
  7. IT高管中国下课潮的背后
  8. 利用FreeMarker实现网页到Word文档的生成
  9. matlab定义函数
  10. i lost my chenyi