本文将探索新的策略回测程序,主要是为了尝试不同的技术指标在backtrader平台上的应用,为后续复杂策略的实现做准备。

本文将实现的策略是,当股票放量突破布林线中轨时进行买入,当股票收盘价低于短期均线时卖出。

买入条件中,放量突破布林线中轨具体指的是,当日股票开盘价在布林线中轨下方,收盘价在布林线中轨上方,当日成交量为10日以来的最高量。卖出条件中,短期均线选取为5日线。回测初始资金100000元,单笔操作单位1000股,佣金千分之一,回测时间自2018年1月1日至2020年3月20日。

策略核心代码还是位于策略类的init方法中:

    def __init__(self):self.inds = dict()for i, d in enumerate(self.datas):self.inds[d] = dict()# 布林线中轨boll_mid = bt.ind.BBands(d.close).mid# 买入条件self.inds[d]['buy_con'] = bt.And( \# 突破中轨d.open < boll_mid, d.close > boll_mid, \# 放量d.volume == bt.ind.Highest(d.volume, period = self.p.p_period_volume, plot = False))# 卖出条件self.inds[d]['sell_con'] = d.close < bt.ind.SMA(d.close, period = self.p.p_sell_ma)

这里需要注意的是,技术指标在backtrader里是lines对象,而非数值,所以在使用与或操作时,不能使用python自带的and和or操作符,而只能调用backtrader的And和Or函数。对技术指标做比较时可以使用大于号、小于号等符号,这是因为backtrader对这些符号进行了重写。

回测000001后的最终资产为101107.35元:

可以看到,该策略并非每笔交易都会盈利,但是盈利额度较大,亏损额度较小。由于我们选取的交易单位是1000股,而000001的股价只是10元左右,相当于我们只动用了不到20%的资金,因此总盈利额显得较小,如果提高交易手数,盈利总额也会随之提升。

同时回测000001、000002后的最终资产为100082.86元:


同时回测000001、000002、000004后的最终资产为100247.27元:

回测603999后的最终资产为98871.44元:

可以看到该策略也有总体亏损的情况,直觉上判断,该策略可能比较适合大盘股,对小盘股而言,放量的条件比较容易达到,策略缺乏稳定性。

我们进一步尝试将放量突破的标准选为20日以来的最高值时,回测000001的最终资产为100613.27元,可以看到3笔盈利交易,1笔亏损交易。

当我们把回测起始时间改为2008年1月1日后,回测0000001的最终资产为103137.30元,可以看到也存在大量的亏损交易,但是亏损值都较小。

友情提示:本系列学习笔记只做数据分析,记录个人学习过程,不作为交易依据,盈亏自负。

放量突破布林线中轨买入策略代码:

from __future__ import (absolute_import, division, print_function, unicode_literals)
import datetime  # 用于datetime对象操作
import os.path  # 用于管理路径
import sys  # 用于在argvTo[0]中找到脚本名称
import backtrader as bt # 引入backtrader框架
import pandas as pdstk_num = 1  # 回测股票数目
# 创建策略
class BollStrategy(bt.Strategy):# 可配置策略参数params = dict(p_period_volume = 10,   # 前n日最大交易量p_sell_ma = 5,          # 跌破该均线卖出p_oneplot = False,      # 是否打印到同一张图pstake = 1000,          # 单笔交易股票数)def __init__(self):self.inds = dict()for i, d in enumerate(self.datas):self.inds[d] = dict()# 布林线中轨boll_mid = bt.ind.BBands(d.close).mid# 买入条件self.inds[d]['buy_con'] = bt.And( \# 突破中轨d.open < boll_mid, d.close > boll_mid, \# 放量d.volume == bt.ind.Highest(d.volume, period = self.p.p_period_volume, plot = False))# 卖出条件self.inds[d]['sell_con'] = d.close < bt.ind.SMA(d.close, period = self.p.p_sell_ma)# 跳过第一只股票data,第一只股票data作为主图数据if i > 0:if self.p.p_oneplot:d.plotinfo.plotmaster = self.datas[0]def next(self):for i, d in enumerate(self.datas):dt, dn = self.datetime.date(), d._name           # 获取时间及股票代码pos = self.getposition(d).sizeif not pos:                                      # 不在场内,则可以买入if self.inds[d]['buy_con']:                # 如果金叉self.buy(data = d, size = self.p.pstake) # 买买买elif self.inds[d]['sell_con']:                  # 在场内,且死叉self.close(data = d)                         # 卖卖卖def notify_trade(self, trade):dt = self.data.datetime.date()if trade.isclosed:print('{} {} Closed: PnL Gross {}, Net {}'.format(dt, trade.data._name, round(trade.pnl, 2), round(trade.pnlcomm, 2)))
cerebro = bt.Cerebro()  # 创建cerebro
# 读入股票代码
stk_code_file = '../TQDat/data/tq_stock_code.csv'
stk_pools = pd.read_csv(stk_code_file, encoding = 'gbk')
if stk_num > stk_pools.shape[0]:print('股票数目不能大于%d' % stk_pools.shape[0])exit()
for i in range(stk_num):stk_code = stk_pools['code'][stk_pools.index[i]]stk_code = '%06d' % stk_code# 读入数据datapath = '../TQDat/day/stk/' + stk_code + '.csv'# 创建价格数据data = bt.feeds.GenericCSVData(dataname = datapath,fromdate = datetime.datetime(2018, 1, 1),todate = datetime.datetime(2020, 3, 31),nullvalue = 0.0,dtformat = ('%Y-%m-%d'),datetime = 0,open = 1,high = 2,low = 3,close = 4,volume = 5,openinterest = -1)# 在Cerebro中添加股票数据cerebro.adddata(data, name = stk_code)
# 设置启动资金
cerebro.broker.setcash(100000.0)
# 设置佣金为千分之一
cerebro.broker.setcommission(commission=0.001)
cerebro.addstrategy(BollStrategy, p_oneplot = False)  # 添加策略
cerebro.run()  # 遍历所有数据
# 打印最后结果
print('Final Portfolio Value: %.2f' % cerebro.broker.getvalue())
cerebro.plot()  # 绘图

为了便于相互交流学习,新建了微信群,感兴趣的读者请加微信。

Python量化交易学习笔记(18)——放量突破布林线中轨买入策略相关推荐

  1. Python量化交易学习笔记(20)——保护点卖出策略

    本文主要记录保护点卖出策略,给买入的股票设立保护点,随着股票收盘价的提升,保护点不断提高,股价一旦跌破保护点,即卖出股票. 示例的买入条件为,5日线金叉60日线,且股价进行小幅回踩(较金叉日收盘价下跌 ...

  2. Python量化交易学习笔记(1)

    Python量化交易学习笔记(1) http://zwpython.com/ http://www.topquant.vip/?p=2275 [更多参见] <zwPython,目前最好的py开发 ...

  3. Python量化交易学习笔记(2)——A股数据下载

    由于笔者只接触过A股交易,因此本系列笔记仅针对A股交易展开.笔者的计算机为Windows 10 64位操作系统. TOP极宽量化总群(124134140)群文件中提供了大量的学习资料,一眼看去有点懵圈 ...

  4. Python量化交易学习笔记(25)——Data Feeds扩展

    背景:需要扩展data feeds的场景 在backtrader中,data feeds中包含了被普遍认为是业界标准的几个字段: datetime open high low close volume ...

  5. Python量化交易学习笔记(33)——backtrader仓位管理

    本文将对backtrader的仓位管理进行介绍,具体以同时回测交易3只股票为例,查看每日仓位情况. 策略 买入条件:5日线金叉60日线 卖出条件:5日线死叉60日线 示例 仓位信息输出的核心代码位于策 ...

  6. Python量化交易学习笔记(21)——A股股票列表更新

    在zwPython2020中,股票数据下载更新时,所读取的股票列表文件的目录位置为"zwPython\TQDat\TQDown2020v1\data\tq_wrk_code.csv" ...

  7. Python量化交易学习笔记(46)——通达信日线数据获取

    序 从2020年初开始接触量化,马上就要满一年了.在这一年里,想过去做量化,想过去做机器学习,想过去做少儿编程教育.就这样大概折腾了小半年时间,最后在CSDN上看到这样一句话:"你把时间投在 ...

  8. Python量化交易学习笔记(19)——连续下跌买入止盈止损卖出策略

    好友提出要验证连续下跌买入止盈止损卖出策略,本文对该策略回测和实现做分析记录. 买入条件中,连续下跌定义为收盘价连续4日低于前1日的收盘价.卖出条件中,止盈率设置为10%,止损率设置为5%.回测初始资 ...

  9. Python量化交易学习笔记(36)——backtrader多股回测避坑3

    本文继续记录多股回测时可能遇到的异常情况. 坑描述 多股回测时,当日期达到所有股票的技术指标都能够计算出有效值后,backtrader才开始进行回测.由于这种逻辑的存在,如果某些股票在回测周期的最后几 ...

最新文章

  1. 如何用Dart写一个单例
  2. linux存储--共享内存机制shm(十四)
  3. Linux--内存结构
  4. Lodash 中文文档 (v3.10.1) - “Number” 方法
  5. TIJ摘要:访问控制权限
  6. C语言有符号和无符号数
  7. 中国新材料产业应用前景与十四五运营方向分析报告2021年版
  8. EasyDarwin EasyCamera支持海康摄像机接入了
  9. 阿里云图片服务器OSS对象存储器使用方法(附详细步骤)
  10. C#窗体加标尺的两种方式及显现效果
  11. 商城后台管理系统学习日志-02
  12. glibc-2.15.tar.gz
  13. 关于电脑磁盘消失的解决方法
  14. html来自网页的消息,win7系统ie浏览器提示:来自网页的消息的解决方法
  15. 【渝粤题库】陕西师范大学151104中级财务会计作业(高起专)
  16. 【商业信息】GB 11643—1999 公民身份号码
  17. 快解析结合友加畅捷通t1飞跃版
  18. android 自动语音,在Android上自动下载离线语音识别语言
  19. 360 网站漏洞检测
  20. 三国志战略版:许攸阵容初尝试,官渡之战

热门文章

  1. 29.97帧/秒 与 30帧/秒 的区别
  2. 联想笔记本打开虚拟机服务器,联想thinkpad笔记本如何开启虚拟化技术
  3. 如何从IT外包中获得最大的商业价值?
  4. php企业官网源码 响应式,基于ThinkPHP5框架开发的响应式企业官网PHP源码_PC端+WAP手机端自适应+TP企业官网建站系统...
  5. ES中mapping是什么,es中的数据类型
  6. Springboot项目自动打包部署插件 (wagon-maven-plugin)
  7. python喜马拉雅FM(赵海洋钢琴曲)
  8. nginx+lua 实现的免费网站站长工具-防网络爬虫,自动推送百度,批量添加站长统计
  9. Genio 500核心板,MT8385安卓核心板定制方案
  10. 迅雷100万G离线空间免费了,快来抢啦,再也不用担心流量不够了