Backtrader多周期回测

获取数据

result = pd.read_csv('11.csv')
df = pd.DataFrame(data=result)
df = df.set_index(['datetime'])
df

策略


class MultiTFStrategy(bt.Strategy):params = (('period', 20),)# states definationEmpty, M15Hold, H1Hold, D1Hold = range(4)States = ['Empty', 'M15Hold', 'H1Hold', 'D1Hold',]def log(self, txt):''' Logging function for this strategy'''dt = self.datas[0].datetime.datetime(0)print('%s, %s' % (dt.isoformat(), txt))def __init__(self):self.ma15m = bt.talib.SMA(self.dnames.hs15m, timeperiod=self.p.period)self.ma1h = bt.talib.SMA(self.dnames.hs1h, timeperiod=self.p.period)self.ma1d = bt.talib.SMA(self.dnames.hs1d, timeperiod=self.p.period)self.c15m = bt.indicators.CrossOver(self.dnames.hs15m, self.ma15m, plot=False)self.c1h = bt.indicators.CrossOver(self.dnames.hs1h, self.ma1h, plot=False)self.c1d = bt.indicators.CrossOver(self.dnames.hs1d, self.ma1d, plot=False)self.bsig15m = self.c15m==1self.bsig1h = self.c1h==1self.bsig1d = self.c1d==1self.sell_signal = self.c1d==-1self.st = self.Emptyself.st_map = {self.Empty : self._empty,self.M15Hold : self._m15hold,self.H1Hold : self._h1hold,self.D1Hold : self._d1hold,}# To keep track of pending ordersself.order = Nonedef notify_order(self, order):if order.status in [order.Submitted, order.Accepted]:# Buy/Sell order submitted/accepted to/by broker - Nothing to doreturn# Check if an order has been completed# Attention: broker could reject order if not enough cashif order.status == order.Completed:if order.isbuy():self.log('BUY EXECUTED, St: %s, Size: %d, Price: %.2f, Cost: %.2f, Comm %.2f' %(self.States[self.st],order.executed.size,order.executed.price,order.executed.value,order.executed.comm,))else:  # Sellself.log('SELL EXECUTED, St: %s, Size: %d, Price: %.2f, Cost: %.2f, Comm %.2f' %(self.States[self.st],order.executed.size,order.executed.price,order.executed.value,order.executed.comm))elif order.status in [order.Canceled, order.Margin, order.Rejected]:self.log('Order Canceled/Margin/Rejected')# Write down: no pending orderself.order = Nonedef notify_trade(self, trade):if not trade.isclosed:returnself.log('OPERATION PROFIT, GROSS %.2f, NET %.2f' %(trade.pnl, trade.pnlcomm))def next(self):# Check if an order is pending ... if yes, we cannot send a 2nd oneif self.order:return# just call state_map functionself.order = self.st_map[self.st]()# Check if we are in the market and no buy order issuedif self.position and not self.order:# Already in the market ... we might sellif self.sell_signal:self.st = self.Empty# Keep track of the created order to avoid a 2nd orderself.order = self.close()def _empty(self):if self.bsig15m:price = self.data0.close[0]cash = self.broker.get_cash()# 20% of the cashshare = int(math.floor((0.2*cash)/price))# set stateself.st = self.M15Holdreturn self.buy(size=share)def _m15hold(self):if self.bsig1h:price = self.data0.close[0]cash = self.broker.get_cash()# half of the remain cash ( 60% )share = int(math.floor((0.5*cash)/price))# set stateself.st = self.H1Holdreturn self.buy(size=share)def _h1hold(self):if self.bsig1d:price = self.data0.close[0]cash = self.broker.get_cash()# half of the remain cash (80%)share = int(math.floor((0.5*cash)/price))# set stateself.st = self.D1Holdreturn self.buy(size=share)def _d1hold(self):return None

cerebro存入数据

cerebro = bt.Cerebro(oldtrades=True)feed = bt.feeds.PandasData(dataname=df, openinterest=None, compression=15, timeframe=bt.TimeFrame.Minutes)cerebro.adddata(feed, name='hs15m')
cerebro.resampledata(feed, name='hs1h', timeframe=bt.TimeFrame.Minutes, compression=60)
cerebro.resampledata(feed, name='hs1d', timeframe=bt.TimeFrame.Days)cerebro.addstrategy(MultiTFStrategy)# 小场面1万起始资金
cerebro.broker.setcash(10000.0)# 手续费万5
cerebro.broker.setcommission(0.0005)print('Starting Portfolio Value: %.2f' % cerebro.broker.getvalue())result = cerebro.run()print('Final Portfolio Value: %.2f' % cerebro.broker.getvalue())

绘图:


cerebro.plot(iplot=False,start=datetime.date(2019, 11, 1),end=datetime.date(2020, 1, 1),style='bar',barup='red',bardown='green',
)

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

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

相关文章

CentOS 7 防火墙操作

导语 今天说下防火墙的操作。CentOS 6 的防火墙是 iptables,CentOS 7 默认的是 firewall,以前的操作不再适用。 查看、开启 服务器刚刚重启完毕,先来看下防火墙的状态,输入 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 说明: 按C显示CPU信息,再按…

阿里云安装Quantaxis

参考博客:https://github.com/QUANTAXIS/QUANTAXIS/issues/1395 之后进入阿里云中的Ubuntu界面 输入: 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库的程序出炉

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

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

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

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日,MongoDB官方博客发文称MongoDB Mobile Sync for iOS的Beta版本即将推出。MongoDB Mobile支持使用单一查询语言进行本地和远程数据访问,包含两个核心部分: MongoDB数据库的移动优化版本,运行在本地设备上&#xff0c…

gdb好文章:GDB十分钟教程

(GUI调试器:insight和ddd) list(l) :其作用就是列出程序的源代码,默认每次显示10行。 list 行号:将显示当前文件以“行号”为中心的前后10行代码,如: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插件,提供了易于使用的界面,用于开发自动化测试。 但是最新的Selenium IDE总是弹出一系列如下的对话框,不能直接录制&#xf…

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

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

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

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

gdb常用命令

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

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

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

遍历Map key-value的两种方法、遍历Set方法

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 第一种遍历方法 : 先获取Map中的所有key值&#xff0c;然后根据key&#xff0c;依次从Map中去数据 Map<String,String> test…

STL 容器简介:C++ 容器:顺序性容器、关联式容器和容器适配器

STL标准容器类简介 标准容器类说明顺序性容器vector从后面快速的插入与删除&#xff0c;直接访问任何元素deque从前面或后面快速的插入与删除&#xff0c;直接访问任何元素list双链表&#xff0c;从任何地方快速插入与删除关联容器set快速查找&#xff0c;不允许重复值multise…

用友云开发者中心助你上云系列之在线调试

现在&#xff0c;大家开始越来越多的谈论到高可用架构的互联网应用。什么是高可用&#xff1f;高可用HA&#xff08;High Availability&#xff09;是分布式系统架构设计中必须考虑的因素之一&#xff0c;它通常是指&#xff0c;通过设计减少系统不能提供服务的时间。当我们谈论…

python根据财务指标寻找价值股票

确定股票池 from concurrent.futures import ThreadPoolExecutor import urllib import os from time import sleep import pandas as pd # 上证代码 shanghaicode [] for i in range(600000, 606000, 1):shanghaicode.append(str(i))# 深证代码 shenzhencode [] for i in r…

WPF Bitmap转BitmapSource,Image

//引用&#xff1a;using System.Windows.Interop; //Imagingusing System.Drawing; //Bitmap public static Imaging.BitmapSource ConvertToBitmapSource(Bitmap btmap) { return Imaging.CreateBitmapSourceFromHBitmap(btmap.GetHbitmap(), IntPtr.Zero, Int32Rect.Empt…