backtrader量化回测,基础篇,附MACD交易回测代码
backtrader由德国工程师开发,拥有股票的回测,检测交易策略,支持期货实时交易,对于股票交易还在完善,我尝试了pylagotrade,vn.py,发现backtrader功能强大,交易策略全面,一直想用zipline写交易策略,但是一直安装不上,很多地方需要改,目前在研究,但是我们也很幸运,很多量化平台都是建立在zipline上的比如聚宽,掘金等,还有一个微软开发的机器学习量化库qlib,我有空去研究研究,分享给大家。
我们看一下如何安装backtrader,我们wind安装按win+r,输入cmd,进入命令节目,输入py -m pip install backtrader,但是安装会比较慢,我们通过清华大学的镜像来加速安装,安装如下,输入
后面我会边学习边介绍每个模块,以前学习过,但是现在有一些忘了,大三了,也快去实习了,打算仔细学习一下,后面我会结合量化平台聚宽进行量化分析,我在聚宽也写了一下文章。
需要回测程序关注微信公众号,数据分析与运用,回复macd量化回测就可以了
这里要重点提一下matplotlib安装版本最好为3.2.2,不然绘图会报错
py -m pip install -i https://pypi.tuna.tsinghua.edu.cn/simple matplotlib==3.2.2
我们看一下官网,主要包括,数据输入,大脑,优化指标,订单,经纪人等
下面我们看一下回测策略,我们交易策略为MACD主要交易点。
我结合了金融数据库,所以可以回测全部的股票,我们只要输入股票代码和数据开始时间就可以了,股票代码sz002466,天齐锂业,开始资金100万,交易费用0.003,也可以用于期货回测
我们输入回测开始时间比如20200601
我们就会看到数据回测,交易买卖的过程。
下面我们看到绘制的分析图片,结果还是很不错的,在股票下降的情况下,收益曲线平稳。
下面为程序代码。
量化回测
#北方稀土为例
#开始时间20210101
#结束时间20220217
#MACD交易策略,光头光脚阳线,光头光脚阴线交易策略
#测试资金100万,交易费用0.003
import pandas as pd
import akshare as ak
import matplotlib.pyplot as plt
import backtrader as bt
import datetime
import akshare as ak
import PySimpleGUI as sg
stock=sg.popup_get_file('输入股票代码比如sz002466')
start_date=sg.popup_get_file('输入开始时间比如20210101')
df=ak.stock_zh_a_daily(symbol=stock,start_date=start_date)
df.to_excel(r'C:\Users\Administrator\Desktop\天齐锂业.xlsx')
#写策略
class teststrategy(bt.Strategy):
#记录函数
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.dataopen=self.datas[0].open
self.datalow=self.datas[0].low
self.datahigh=self.datas[0].high
self.ma5=bt.indicators.MovingAverageSimple(self.dataclose,period=5)
self.ma10=bt.indicators.MovingAverageSimple(self.dataclose,period=10)
self.ma20=bt.indicators.MovingAverageSimple(self.dataclose,period=20)
self.MACD=bt.indicators.MACD(self.datas[0])
self.macd=self.MACD.macd
self.signal=self.MACD.signal
self.rsi=bt.indicators.RSI(self.datas[0])
self.boll=bt.indicators.BollingerBands(self.datas[0])
self.atr=bt.indicators.ATR(self.datas[0])
self.order=None
self.buyprice=None
self.comm=None
#交易状态检测
def notify_order(self,order):
if order.status in [order.Submitted,order.Accepted]:
return
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.price
self.buycomm = order.executed.comm
if order.issell():
self.log('卖出的价格 %.2f,账户值;%.2f,交易费用:%.2f' % (order.executed.price,order.executed.value,order.executed.comm))
elif order.status in [order.Canceled, order.Margin, order.Rejected]:
self.log('交易取消,资金不足,交易拒接')
#交易完统计
def notify_trade(self,trade):
if not trade.isclosed:
return
self.log('利润:%.2f,总利润: %.2f' %(trade.pnl,trade.pnlcomm))
#交易函数
def next(self):
#低位金叉买入
if self.macd[-1]<self.signal[-1]:
if self.macd[0]>self.signal[0]:
if self.macd[0]<0:
self.buy(size=500)
self.log('MACD低位金叉买入价格:%.2f' % self.dataclose[0])
#正常金叉买价
if self.macd[-1]<self.signal[-1]:
if self.macd[0]>self.signal[0]:
if self.macd[0]==0:
self.buy(size=500)
self.log('MACD正常金叉买入价格:%.2f' % self.dataclose[0])
#高位金叉买价,高位金叉有加速上升的作用
if self.macd[-1]<self.signal[-1]:
if self.macd[0]>self.signal[0]:
if self.macd[0]>0:
self.buy(size=500)
self.log('MACD高位金叉买入价格:%.2f' % self.dataclose[0])
#高位死叉卖出
if self .macd[-1]>self.signal[-1]:
if self.macd[0]<self.signal[-1]:
if self.macd[0]>=0:
self.sell(size=200)
self.log('MACD高位死叉卖出价格:%.2f' % self.dataclose[0])
#低位死叉卖出,和死叉减创
if self.macd[-1]<self.signal[-1]:
if self.macd[0]>self.signal[0]:
if self.macd[0]<0:
self.buy(size=500)
self.log('MACD低位金叉卖出价格:%.2f' % self.dataclose[0])
#低位死叉,加速下降卖出
if self .macd[-1]>self.signal[-1]:
if self.macd[0]<self.signal[-1]:
if self.macd[0]<0:
self.sell(size=200)
self.log('MACD低位死叉卖出价格:%.2f' % self.dataclose[0])
#macd下降趋势卖出
if (self.macd[-1]-self.signal[-1])>(self.macd[0]-self.signal[0]):
if self.signal[0]>self.macd[0]:
self.buy(size=100)
self.log('MACD下降趋势卖出价格:%.2f' % self.dataclose[0])
#macd上涨趋势买入
if (self.macd[-1]-self.signal[-1])<(self.macd[0]-self.signal[0]):
if self.signal[0]<self.macd[0]:
self.buy(size=100)
self.log('MACD上升趋势买入价格:%.2f' % self.dataclose[0])
#光头光脚大阳线买入
if self.dataopen[0]==self.datalow[0] and self.dataclose[0]==self.datahigh[0] and self.dataclose[0]>self.dataopen[0]:
self.buy(size=500)
self.log('光头光脚阳线买入,价格 %.2f' % self.dataclose[0])
#光头光脚大阴线卖出
if self.dataopen[0]==self.datahigh[0] and self.dataclose[0]==self.datalow[0] and self.dataopen[0]>self.dataclose[0]:
self.sell(size=100)
self.log('光头光脚大阴线卖出,价格 %.2f' % self.dataclose[0])
#底背离
#顶背离有空写
if __name__ == "__main__":
cerebro=bt.Cerebro()
cerebro.broker.set_cash(1000000)
cerebro.broker.setcommission(0.003)
#添加数据
df.index=pd.to_datetime(df['date'])
#,fromdate=datetime.datetime(2021,10,1),todate=datetime.datetime(2022,2,17)
data=bt.feeds.PandasData(dataname=df)
cerebro.adddata(data)
cerebro.addstrategy(teststrategy)
cerebro.run(runonce=False)
print('最终的值',cerebro.broker.getvalue())
cerebro.plot(style='candle')
plt.show()
backtrader量化回测,基础篇,附MACD交易回测代码相关推荐
- 机器学习之信用卡欺诈检测(零基础,附数据及详细python代码2022年Tensorflow2)
首先该数据参考:机器学习项目实战之信用卡欺诈检测(零基础,附数据及详细python代码) (4条消息) 机器学习项目实战之信用卡欺诈检测(零基础,附数据及详细python代码)_西南交大-Liu_z的 ...
- g4e基础篇#5 创建分支和保存代码
使用版本控制系统最常见的工作流程就是修改代码,保存代码,共享代码.Git提供了一个简单的3步工作流,让你方便的完成这些操作. 1. 新建工作分支 2. 提交更改 3. 推送分支到中心存储库与团队成员共 ...
- php面试题汇总一(基础篇附答案)
一份不错的php面试题,附答案,有准备换工作的同学可以参考一下. 1:使用五种以上方式获取一个文件的扩展名 要求:dir/upload.image.jpg,找出 .jpg 或者 jpg , 必须使用P ...
- alpha模型:打开量化投资的黑箱;附创业板布林带策略代码:年化15%。
原创文章第108篇,专注"个人成长与财富自由.世界运作的逻辑, AI量化投资". 关于量化投资,我们写了不少文章.从数据准备,预处理,因子特征工程,因子分析,规则策略,模型,回测, ...
- python matlab 多条曲线 单位_【基础篇】MATLAB科研制图常用代码命令
最近更新了不少关于数学建模算法与机器学习的博客,今天我来写写关于科研制图的MATLAB常用命令,众所周知,在未来的科研生涯中,只要是学工科的同学们,MATLAB都是大家必学的工具之一,而发paper中 ...
- 【程序员基础篇】开源中国私有库代码更新
开源中国私有库代码更新 环境 expect bash 步骤 在开源中国新建私有库 脚本执行代码库更新 在本地web项目目录下添加远程库 在本地web目录下/Appliactions/XAMPP/htd ...
- 【基础篇】JavaScript的4种代码调试输出方式
前言 JavaScript 不提供任何内建的打印或显示函数.那么我们在日常开发的时候,需要调试输出和打印的结果的时候该怎么办法呢,这里给大家推荐4种显示方案: 使用 window.alert() 写入 ...
- WF4.0 基础篇 (二) Activity介绍及WriteLine Activity的使用
从本篇开始,将正式讲解WF4.0,本文主要涉及如下内容:Activity介绍, WF4.0 中工作流的结构,通过WriteLine演示InArgument<T>参数的使用 目录 1 ...
- g4e基础篇#6 了解Git历史记录
Git的版本历史记录采用了与传统集中式版本管理系统完全不同的方式进行组织,在刚开始使用Git的时候我们往往会不知所措,比如看到这样的历史记录. 看到这个七拐八拐的图形,你可能完全不知道它代表了什么.其 ...
最新文章
- Win64 驱动内核编程-9.系统调用、WOW64与兼容模式
- 哪一个不是html5新增的语义化标记元素,东师19春《HTML5开发基础与应用》作业考核【标准答案】...
- 太阳表面是怎样的呢?
- gomod和govendor的简单理解
- 漫谈并发编程(三):共享受限资源
- Data Structures(Chapter 3 of The Algorithm Design Manual)
- 解决Linux环境下idea、webstorm等编辑器中文无效
- python中take函数_Python Pandas Series.take()用法及代码示例
- 计算机中常见的循环,电脑系统提示数据错误循环冗余检查的解决方法教程[多图]...
- Django DTL模板使用
- 华农大学计算机专硕,华南农业大学电子工程学院(人工智能学院)林芳老师课题组招收计算机方向学硕及专硕...
- ubuntu18.04安装MPV视频播放器
- 趣图:代码突然又可以运行了,why?
- 论文方法步骤:Knowledge-Enriched Transformer for Emotion Detection in Textual Conversations
- Mybatis学习笔记(尚硅谷版整理)
- 上网本 linux中文版,veket|veket linux上网本操作系统 v5.30 简体中文正式版 - 飞极下载站...
- 基于Kafka-Zookeeper-Nginx-FIlebeat-MySQL的日志清洗分析平台搭建
- c4droid用c语言画爱心,【图片】[自学C语言第五天]发一个作品【c4droid吧】_百度贴吧...
- 咬文嚼字 | 信息化和数字化的本质区别是什么?
- Win8+Matlab7.1测试例子(20150109、0116、0124、0202、0207、0217)
热门文章
- python伪造邮件发件地址_python-SMTPSenderRefused-553,发件人地址未经验证-Django电子邮件表格...
- 哈工大计算机学院美女多吗,16所大学男女比例:电子科大最高,哈工大、西电其次,复旦最均衡...
- 奥塔在线:基于token认证的基础知识详解
- 快乐星球计算机老师,《快乐星球Ⅴ》新电脑老师(上)
- Android Launcher 设置壁纸
- Windows Update自动更新
- Stable Diffusion6
- Android开关机定制(动画,声音)
- Hive系列 (一):Hive搭建
- 8.Python中装饰器是什么?