本次使用tushare接口,股票为600018,时间是20200101——20211231。

使用的指标是:收盘价大于简单移动平均价。

佣金为0.001。

英文代码的英文原文:Quickstart Guide - Backtrader

注意:代码最后plot画图,在spyder中不能正常显示图片,只能显示提示信息:

<IPython.core.display.Javascript object>
<IPython.core.display.HTML object>

在Jupyter Notebook中则可以正常显示图片。

期初资金: 100000.00
2020-02-26, Close, 11.20
2020-02-26, 买入单, 11.20
2020-02-27, 已买入, 价格: 11.20, 费用: 112.00, 佣金 0.11
2020-02-27, Close, 11.21
2020-02-28, Close, 10.85
2020-02-28, 卖出单, 10.85
2020-03-02, 已卖出, 价格: 10.95, 费用: 112.00, 佣金 0.11
2020-03-02, 交易利润, 毛利润 -2.50, 净利润 -2.72
2020-03-02, Close, 11.04
2020-03-03, Close, 11.06
......
2022-01-21, Close, 8.76
2022-01-24, Close, 8.69
2022-01-25, Close, 8.56
2022-01-25, 卖出单, 8.56
2022-01-26, 已卖出, 价格: 8.57, 费用: 86.30, 佣金 0.09
2022-01-26, 交易利润, 毛利润 -0.60, 净利润 -0.77
2022-01-26, Close, 8.57
2022-01-27, Close, 8.45
2022-01-28, Close, 8.41
期末资金: 99968.07

from __future__ import (absolute_import, division, print_function,unicode_literals)
from datetime import datetime  # For datetime objects
# Import the backtrader platform
import backtrader as bt
import pandas as pd
import tushare as ts# 创建策略继承bt.Strategy
class TestStrategy(bt.Strategy):params = (# 均线参数设置15天,15日均线('maperiod', 15),)def log(self, txt, dt=None):# 记录策略的执行日志dt = dt or self.datas[0].datetime.date(0)print('%s, %s' % (dt.isoformat(), txt))def __init__(self):# 保存收盘价的引用self.dataclose = self.datas[0].close# 跟踪挂单self.order = None# 买入价格和手续费self.buyprice = Noneself.buycomm = None# 加入指标# Add a MovingAverageSimple indicatorself.sma = bt.indicators.SimpleMovingAverage(self.datas[0], period=self.params.maperiod)# Indicators for the plotting showbt.indicators.ExponentialMovingAverage(self.datas[0], period=25)bt.indicators.WeightedMovingAverage(self.datas[0], period=25,subplot=True)bt.indicators.StochasticSlow(self.datas[0])bt.indicators.MACDHisto(self.datas[0])rsi = bt.indicators.RSI(self.datas[0])bt.indicators.SmoothedMovingAverage(rsi, period=10)bt.indicators.ATR(self.datas[0], plot=False) # 订单状态通知,买入卖出都是下单def notify_order(self, order):if order.status in [order.Submitted, order.Accepted]:# broker 提交/接受了,买/卖订单则什么都不做return# 检查一个订单是否完成# 注意: 当资金不足时,broker会拒绝订单if order.status in [order.Completed]:if order.isbuy():self.log('已买入, 价格: %.2f, 费用: %.2f, 佣金 %.2f' %(order.executed.price,order.executed.value,order.executed.comm))self.buyprice = order.executed.priceself.buycomm = order.executed.commelif order.issell():self.log('已卖出, 价格: %.2f, 费用: %.2f, 佣金 %.2f' %(order.executed.price,order.executed.value,order.executed.comm))# 记录当前交易数量self.bar_executed = len(self)elif order.status in [order.Canceled, order.Margin, order.Rejected]:self.log('订单取消/保证金不足/拒绝')# 其他状态记录为:无挂起订单self.order = None# 交易状态通知,一买一卖算交易def notify_trade(self, trade):if not trade.isclosed:returnself.log('交易利润, 毛利润 %.2f, 净利润 %.2f' %(trade.pnl, trade.pnlcomm))def next(self):# 记录收盘价self.log('Close, %.2f' % self.dataclose[0])# 如果有订单正在挂起,不操作if self.order:return# 如果没有持仓则买入if not self.position:# 今天的收盘价在均线价格之上 if self.dataclose[0] > self.sma[0]: # 买入self.log('买入单, %.2f' % self.dataclose[0])# 跟踪订单避免重复self.order = self.buy()else:# 如果已经持仓,收盘价在均线价格之下if self.dataclose[0] < self.sma[0]:# 全部卖出self.log('卖出单, %.2f' % self.dataclose[0])# 跟踪订单避免重复self.order = self.sell()def get_data(code,start='2020-01-01',end='2022-01-31'):df=ts.get_k_data(code,autype='qfq',start=start,end=end)df.index=pd.to_datetime(df.date)df['openinterest']=0df=df[['open','high','low','close','volume','openinterest']]return dfdataframe=get_data('600018')start=datetime(2020, 1, 1)
end=datetime(2021, 12, 31)if __name__ == '__main__':# 初始化cerebro回测系统设置cerebro = bt.Cerebro()# 取得股票历史数据data = bt.feeds.PandasData(dataname=dataframe, fromdate=start, todate=end)# 为Cerebro引擎添加策略cerebro.addstrategy(TestStrategy)# 加载交易数据cerebro.adddata(data)# 设置投资金额cerebro.broker.setcash(100000.0)# 每笔交易使用固定交易量cerebro.addsizer(bt.sizers.FixedSize, stake=10)# 设置佣金为0.001,除以100去掉%号cerebro.broker.setcommission(commission=0.001)#获取回测开始时的总资金print('期初资金: %.2f' % cerebro.broker.getvalue())#运行回测系统cerebro.run()#获取回测结束后的总资金print('期末资金: %.2f' % cerebro.broker.getvalue())# Plot the resultcerebro.plot()

使用Backtrader对股票历史数据进行指标回测相关推荐

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

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

  2. 自己做量化交易软件(44)小白量化实战17--利用小白量化金融模块在迅投QMT极速策略交易系统上仿大智慧指标回测及实战交易设计

    自己做量化交易软件(44)小白量化实战17–利用小白量化金融模块在迅投QMT极速策略交易系统上仿大智慧指标回测及实战交易设计 小白量化平台是由若干小白金融模块构成.其中包含行情接收模块,仿通达信大智慧 ...

  3. 自己做量化交易软件(43)小白量化实战16--利用小白量化金融模块在恒生PTrade交易系统(交易端)上仿大智慧指标回测及实战交易设计

    自己做量化交易软件(43)小白量化实战16–利用小白量化金融模块在恒生PTrade交易系统(交易端)上仿大智慧指标回测及实战交易设计 量化产品PTrade(Personalise Trade)交易系统 ...

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

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

  5. Excel-VBA 股票网格交易策略回测

    大家好,我是陈小虾,是一名自动化方向的IT民工.写博客是为了记录自己的学习过程,通过不断输出倒逼自己加速成长.功能说明:由于水平有限,博客中难免会出现一些BUG,或者有更优方案恳请各位大佬不吝赐教!微 ...

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

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

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

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

  8. Python量化投资——股票择时到底能否赚钱?ADX指标的有效性回测

    ADX指标的有效性回测 Python量化投资--`ADX`技术指标的有效性研究 背景介绍 技术指标介绍 指标用法建议 `qteasy`中的ADX内置策略 433支股票五年回测结果 12.45% --该 ...

  9. pb 如何导出csv_backtrader如何加载股票因子数据?以换手率、市盈率为例进行回测【附Python代码】

    1引言 关于backtrader,公众号已连续发布了三篇推文:<[手把手教你]入门量化回测最强神器backtrader(一)>.<[手把手教你]入门量化回测最强神器backtrade ...

最新文章

  1. 【敏捷开发】从需求文档出发聊敏捷
  2. C# 判断两张图片是否一致,极快速
  3. 怎样把 Boot Camp 里 Windows 的色温调节得和 Mac OS X 一致
  4. Linux下获取毫秒级时间差
  5. Leetcode 面试题 10.01. 合并排序的数组 (每日一题 20210616)
  6. Spaly_Tree 模版
  7. mysql不支持union_MySQL中Union子句不支持order by的解决方法
  8. fastica和pca区别_PCA与ICA
  9. nodejs菜鸟教程
  10. vue获取剪切板内容_Vue实现剪贴板复制功能
  11. p1 p 0xf在c语言中啥意思,单片机控制1位共阴极数码管,控制端P1=0x76;则数码管显示的内容是 答案:H...
  12. Android Mvc 模式
  13. widowns上从chrome上抓取图片
  14. 树莓派和主机相互PING
  15. oracle限制查询条数-rownum用法详解
  16. 水仙花数 matlab,matlab向量运算解决水仙花数问题
  17. 基于51单片机定时器计数+2片74HC595联级+8位数码管时钟+按键修改时间
  18. Mac 关闭Cisco AnyConnect 开启启动
  19. 关于飞鱼U3D主程/高级的招聘
  20. python自然语言处理-就职演说语料库

热门文章

  1. nexus2.5版本升级到nexus2.14(同时升级到nexus3.24版本)版本
  2. 四种利用js导出Excel的方法(兼容IE6+、主流浏览器、支持复杂表头和合并单元格)
  3. let’s talk in englsh P41
  4. 【MySQL】格式化时间戳以及时间格式
  5. 解决MySQL导入.CSV数据中文乱码
  6. 接口测试工具soapUI(一)
  7. python文章抄袭检测_用Python写了个检测文章抄袭,详谈去重算法原理
  8. html中确认密码怎么,HTML确认密码
  9. linux下的磁盘状态查看方式
  10. 什么是非拜占庭错误?什么是拜占庭错误?