backtrader期权回测框架

使用backtrader数据进行回测,数据源来自于交易所爬取。

效果还行,我相信各位通过这个的框架学习,会对backtrader的应用有更深的领悟。包括数据的连接,新指标的加入。

导入框架:

__future__ import (absolute_import, division, print_function, unicode_literals)
import pymysql
from sqlalchemy import create_engine
import pandas as pd
import numpy as np
import pymssql
import datetime
import os.path
import sys
import backtrader as bt
import pandas as pd
import akshare as ak
import matplotlib
import matplotlib.pyplot as plt
from backtrader.feeds import PandasData
import datetime
from backtrader.feeds import PandasData
starttime = datetime.datetime.now()
print(starttime)

导入数据

df_read = pd.read_csv('option1.csv')
#df_read = df_read[~df_read['ts_code'].isin([0])]date_value_list  = []

创建策略

class BollStrategy(bt.Strategy):# 可配置策略参数params = dict(poneplot=False,  # 是否打印到同一张图pstake=1,      # 单笔交易股票数据)def __init__(self):self.order = None# for i, d in enumerate(self.datas):#     #跳过第一只股票data,第一只股票data作为主图数据#     if i == 0:#         if self.p.poneplot:#             d.plotinfo.plotmaster = self.datas[0]def prenext(self):# for i,d in enumerate(self.datas):# print(d._name)self.next()# 策略核心,根据条件执行买卖交易指令(必选)def next(self):# 获取当天日期date = self.datas[0].datetime.date(0)# 获取当天valuevalue = self.broker.getvalue()# 存入列表date_value_list.append((date, value))for i,d in enumerate(self.datas):#self.log(f'收盘价,{self.datas[i].close[0]}')dt,dn = self.datetime.date(), d._name   #获取时间和股票代码print(self.datas[i].rt[0])if self.order:returnpos = self.getposition(d).sizeif not pos:if self.datas[i].close[0] > 0:self.log(d._name, 'SELL Create, %2f' %self.datas[i].close[0])self.order = self.sell(d , size=self.p.pstake)elif self.datas[i].close[0] == 0 or self.datas[i].close[0] > pos.price * 2 or self.datas[i].rt[0] == 0 :self.log(d._name, 'CLOSE Create, %2f' % self.datas[i].close[0])self.order = self.close(d , size= self.p.pstake)#pass# print(self.datetime.date())# for i, d in enumerate(self.datas):#     pos = self.getposition(d)#     if not len(pos):#         if d.close[0]>0:#             self.sell(d,size= self.p.pstake)#         elif d.close[0] ==0 or d.close[0] > pos.price * 2:#             self.close(d,size= self.p.pstake)# for d in self.datas:#     if len(d) == 0:#         continue#     else:#         # 获取当天日期#         date = self.datetime.date()#         print(self.datas[0].datetime[0])#         #print(date)#         #查看持仓盈利情况#         for i,d in enumerate(self.datas):#             pos = self.getposition(d)#             # if self.datas[i].close[0] < 0.05:#             #     self.close(d,size = self.params.pstake)#             if len(pos):#                 # print('{}, 持仓:{}, 成本价:{}, 当前价:{}, 盈亏:{:.2f}'.format(#                 #     d._name, pos.size, pos.price, pos.adjbase, pos.size * (pos.adjbase - pos.price)),#                 #     file=self.log_file)#                 # print('{}, 持仓:{}, 成本价:{}, 当前价:{}, 盈亏:{:.2f}'.format(#                 #     d._name, pos.size, pos.price, pos.adjbase, pos.size * (pos.adjbase - pos.price)),#                 #     )#                 if self.datas[i].close[0] == 0:#                     self.close(d,size=self.params.pstake)#         # 获取当天value#         value = self.broker.getvalue()##         # 存入列表#         date_value_list.append((date, value))##         for i,d in enumerate(self.datas):#             #if self.datas[i].close[0] > 0.01:#             try:#                 if self.datas[i].close[0] > 0:#                     #print('buy',d.close[0])#                     self.sell(data = d, size=self.params.pstake)#                     #print(d._name)#                     #order.addinfo(ticker=d._name)#                     #print(d._name)#                 # else:#                 #     #print('sell',d.close[0])#                 #     self.close(data = d, size=self.params.pstake)#                 #     #order.addinfo(ticker=d._name)#                 #     #print(d._name)#             except:#                 pass#交易记录日志def log(self,txt,dt = None,doprint=False):dt = dt or self.datas[0].datetime.date(0)f = open("log.txt",'a')date = self.datas[0].datetime.date(0)f.write(f'{date},{txt}')f.write("\n")f.close()print(f'{txt}')# 记录交易收益情况(可省略,默认不输出结果)def notify_trade(self, trade):if not trade.isclosed:returnself.log(f'策略收益:\n毛收益 {trade.pnl:.2f}, 净收益 {trade.pnlcomm:.2f}')# 订单状态变化时引擎会调用notify_order# 记录交易执行情况(可省略,默认不输出结果)def notify_order(self, order):#print(order.getstatusname(order.status))if order.status in [order.Submitted, order.Accepted]:return# 如果交易已经完成,显示成交信息if order.status in [order.Completed]:if order.isbuy() or order.issell():self.log(f'买入:\n价格:{order.executed.price},\成本:{order.executed.value},\手续费:{order.executed.comm}')self.buyprice = order.executed.priceself.buycomm = order.executed.commelse:self.log(f'卖出:\n价格:{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 stop(self):#     self.log('(MA均线: %2d日) 期末总资金 %.2f' %#              (self.params.maperiod, self.broker.getvalue()), doprint=True)def stop(self):self.log('期末总资金 %.2f' %(self.broker.getvalue()), doprint=True)

添加参数

#添加参数
class ETFOptionPandasData(PandasData):# 新增两条数据线lines = ('rt',)# 新增数据在dataframe中的位置,分别是第6列和第7列params = (('rt', 6),)

调取数据,放入cerebro

cerebro = bt.Cerebro()
# 建立期权池
stk_pools = df_read['ts_code'].unique().tolist()
# 获取期权数据
for stk_code in stk_pools:df = df_read[df_read['ts_code'] == stk_code]df.index = pd.to_datetime(df['datetime'])#print(df.head())#data = ETFOptionPandasData(dataname=df)df = df[['ts_code', 'open', 'high', 'low', 'close', 'volume','rt']]#print(df.head())data = ETFOptionPandasData(dataname = df,datetime = -1)cerebro.adddata(data, name = str(stk_code))

运行策略,添加交易参数

cerebro.broker.setcash(10000000.0)
cerebro.broker.setcommission(commission=1.62,margin = 2000,mult= 10000 )
cerebro.addstrategy(BollStrategy)
cerebro.broker.set_coc(True)#设置以当天收盘价成交
cerebro.run()  #减少内存。此设置会自动禁止数据预加载(preload)和指标预计算(runonce),也禁止绘图plot,因为内存中数据不足以绘图了。
for d in cerebro.datas:d.plotinfo.plot =False
print('cash',cerebro.broker.getvalue())

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/449494.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

kong入门实战

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 安装kong-database docker run -d --name kong-database \-p 5432:5432 \-e "POSTGRES_USERkong" \-e "POSTGRES_DBkong&…

PAT A1048

示例思想中提到了二分以及two point概念&#xff0c;这个需要后面进行总结&#xff1b;这个示例也给出了一个新的思路。对于两个数字和m&#xff0c;查找两个加数&#xff0c;可以进行i和m-i的枚举&#xff0c;通过遍历数组查看两个加数是否存在&#xff0c;来进行遍历&#xf…

linux 32位平台,文件大小受限于2G的解决方法

公司的asterisk系统已经发生了两次crash&#xff0c;检查日志&#xff0c;都是在日志文件写满到2G后自动执行转储时&#xff0c;日志还在写继续写入而导致的。google以后&#xff0c;发现了下面这边文章&#xff0c;赞&#xff01;解决了文件大小限于2G的问题&#xff0c;转帖到…

【noip模拟赛4】Matrix67的派对 暴力dfs

【noip模拟赛4】Matrix67的派对描述 Matrix67发现身高接近的人似乎更合得来。Matrix67举办的派对共有N(1<N<10)个人参加&#xff0c;Matrix67需要把他们安排在圆桌上。Matrix67的安排原则是&#xff0c;圆桌上任意两个相邻人的身高之差不能超过K。请告诉Matrix67他共有多…

Backtrader多周期回测

获取数据 result pd.read_csv(11.csv) df pd.DataFrame(dataresult) df df.set_index([datetime]) df 策略 class MultiTFStrategy(bt.Strategy):params ((period, 20),)# states definationEmpty, M15Hold, H1Hold, D1Hold range(4)States [Empty, M15Hold, H1Hold, D…

CentOS 7 防火墙操作

导语 今天说下防火墙的操作。CentOS 6 的防火墙是 iptables&#xff0c;CentOS 7 默认的是 firewall&#xff0c;以前的操作不再适用。 查看、开启 服务器刚刚重启完毕&#xff0c;先来看下防火墙的状态&#xff0c;输入 systemctl status firewalld 进行查看 这里是关闭的&…

Centos安装nmon软件 ( 测试 )

安装 mkdir /usr/local/nmon cd /usr/local/nmon wget http://sourceforge.net/projects/nmon/files/nmon_linux_14i.tar.gz tar zxvf nmon_linux_14i.tar.gz chmod 777 nmon_x86_64_sles11 12345 启动 ./nmon_x86_64_sles11 1 说明&#xff1a; 按C显示CPU信息&#xff0c;再按…

阿里云安装Quantaxis

参考博客&#xff1a;https://github.com/QUANTAXIS/QUANTAXIS/issues/1395 之后进入阿里云中的Ubuntu界面 输入&#xff1a; sudo yum install apt-transport-https ca-certificates curl software-properties-common Sudo yum install curl service network restartcd qua…

sorted_一个函数秒杀冒泡排序算法和选择排序

sorted一招杀a [3,9,12,4,5,7,8,110]print(sorted(a,reverseTrue))# true为降序print(sorted(a,reverseFalse))# revers false为升序print(sorted(a))#默认是false升序排列Bubble_sort下面看看坑死人无数的冒泡排序内循环和外循环每次循环依次比较大小并来回挪坑,直到把目标值…

转载给ffmpeg入门级:我的第一个调用FFmpeg库的程序出炉

好消息&#xff0c;写了第一个使用了ffmpeg的库的小程序。看起来就是这么简单的一个消息&#xff0c;但是you have no idea how much work that I did before it works...废话少说&#xff0c;总结记录之。。。一、安装好Linux的虚拟机。我用的是FEDORA-16&#xff0c;当然别的…

runC爆严重安全漏洞,主机可被攻击!使用容器的快打补丁

容器的安全性一直是容器技术的一个短板。关于容器最大的安全隐患是攻击者可以使用恶意程序感染容器&#xff0c;更严重时可以攻击主机系统。 2月11日&#xff0c;安全研究员Adam Iwaniuk和BorysPopławski发现了容器运行时runC的一个安全漏洞&#xff0c;这个漏洞可以让上述情况…

pandas操作sql数据库

导包 import pymssql from sqlalchemy import create_engine import pandas as pd 连接数据库 #读数据 conn pymssql.connect(server.,user sa,password test,databasepos) sql select * from stock_data df0 pd.read_sql(sql,conn) 写入数据 df pd.read_csv(option_…

MongoDB Mobile Sync for iOS推出Beta版本

2019年2月11日&#xff0c;MongoDB官方博客发文称MongoDB Mobile Sync for iOS的Beta版本即将推出。MongoDB Mobile支持使用单一查询语言进行本地和远程数据访问&#xff0c;包含两个核心部分&#xff1a; MongoDB数据库的移动优化版本&#xff0c;运行在本地设备上&#xff0c…

gdb好文章:GDB十分钟教程

&#xff08;GUI调试器&#xff1a;insight和ddd&#xff09; list(l) &#xff1a;其作用就是列出程序的源代码&#xff0c;默认每次显示10行。 list 行号&#xff1a;将显示当前文件以“行号”为中心的前后10行代码&#xff0c;如&#xff1a;list 12 list 行号1,行号2: 将…

机器学习预测+akshare

import pandas as pd import akshare as ak import numpy as np import talib from datetime import datetime, timedelta import time 获取股票数据 from_date 2010-01-01 from_date datetime.strptime(from_date,"%Y-%m-%d") day_nums 1 current_dt time.st…

[python作业AI毕业设计博客]比Selenium IDE更好用的录制工具: Katalon Recorder

Selenium IDE(集成开发环境 Integrated Development Environment)是用于构建测试脚本的原型工具。 它是一个Firefox插件&#xff0c;提供了易于使用的界面&#xff0c;用于开发自动化测试。 但是最新的Selenium IDE总是弹出一系列如下的对话框&#xff0c;不能直接录制&#xf…

CentOS 7 : Docker私有仓库搭建和使用

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 系统环境&#xff1a; CentOS 7.2 192.168.0.179&#xff1a;docker仓库 192.168.0.60&#xff1a;客户端 安装并启动docker yum -y…

价值投资/指标选股(akshare)

利用akshare的数据源&#xff0c;可以获取所有的股票数据以及公开的财务数据&#xff0c;可以进行条件筛选&#xff0c;获取满足条件的股票。 这套模板可以用于价值投资&#xff0c;指标选股。选股周期为日线级别。然后结果可以邮箱发送。 import time import akshare as ak #…

gdb常用命令

[rootredhat home]#gdb 调试文件&#xff1a;启动gdb (gdb) l &#xff1a;&#xff08;字母l&#xff09;从第一行开始列出源码 (gdb) break n :在第n行处设置断点 (gdb) break func&#xff1a;在函数func()的入口处设置断点 (gdb) info break&#xff1a; 查看断点信息 (gdb…

有前途的人工智能大数据分析相关职业:Python数据科学入门之路

2019独角兽企业重金招聘Python工程师标准>>> 为什么学习Python数据科学&#xff1f; Python是数据科学职业所需的宝贵技能之一。Python是数据科学的首选编程语言。 2016年&#xff0c;它超越了R on Kaggle&#xff0c;这是数据科学竞赛的首选平台。2017年&#xff0…