backtrader股票技术指标自定义与量化回测
01
引言
股票市场自交易以来,人们就开始孜孜不倦地探索各种各样的投资理论,其中技术分析是重要的理论之一。实际上,技术分析是100多年前创建的股票投资理论,是投资者对股票量价变化长期观察归纳总结的若干“规律”。技术分析以市场行为(价格和成交量)为研究对象,以判断市场趋势并跟随趋势的周期性变化来指导交易,认为市场行为包容一切信息、价格以趋势方式波动、历史会重演。目前,股票分析的技术指标超过1000多种,从功能角度而言,总体可以分为趋势类、摆动类和能量类指标。趋势类指标结合均线特征,根据股价与指标之间的关系分析股价趋势强弱,如MACD指标。摆动类指标根据股票的成交量、价格和时空,通过公式得出一个数值,通过该数值波动规律指导交易,如KDJ、RSI指标。能量类指标通过分析成交量变化来预测股价波动,如OBV、VOL指标等。本文主要介绍backtrader回测框架中技术分析指标(indicators)的调用方法、自定义指标的编写以及技术指标的历史回测。
关于backtrader的入门和进阶见公众号系列推文:
(1)【手把手教你】入门量化回测最强神器backtrader(一)
(2)【手把手教你】入门量化回测最强神器backtrader(二)
(3)【手把手教你】入门量化回测最强神器backtrader(三)
(4)backtrader如何加载股票因子数据?以换手率、市盈率为例进行回测【附Python代码】
(5)如何用backtrader对股票组合进行量化回测?
(6)【手把手教你】用backtrader量化回测海龟交易策略
02
Indicators指标调用
backtrader回测框架内置了很多技术分析指标,封装在indicators中。打开backtrader安装路径,以Anaconda为例,打开\Lib\site-packages\backtrader\,进入indicators文件夹,可以看到里面有48个py文件,文件名是各个技术指标或公示的简称,打开这些文件可以进一步了解包含的具体指标,以及调用的函数名和参数等。
以MACD指标为例,使用Notepad++软件打开macd.py文件,可以看到MACD和MACDHisto两个类,其中MACD是计算MACD指标的类,而MACDHisto则是MACD的子类,增加了macd和信号线之间差异的“直方图”,调用的时候直接使用bt.ind.MACD(参数)。下面以常用的MACD、RSI、布林带指标为例,为大家展示其调用方法。
使用tushare获取数据,并设置为backtrader的数据格式。
import backtrader as bt
import pandas as pd
import numpy as np
import tushare as ts
def get_data(code,start='2010-01-01',end='2020-08-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 df
dataframe=get_data('600000',start='2015-01-01')
dataframe.head()
写一个测试策略,在输出图形中呈现MACD、MACD带柱、RSI和布林带技术指标。
class TestStrategy(bt.Strategy):
def __init__(self):
bt.ind.MACD(self.data)
bt.ind.MACDHisto(self.data)
bt.ind.RSI(self.data,period=14)
bt.ind.BBands(self.data)
将回测系统设置封装成main函数,后面还会反复用到。
def main(data,strategy,pf=False):cerebro = bt.Cerebro()feed = bt.feeds.PandasData(dataname=data)cerebro.adddata(feed) #加载策略cerebro.addstrategy(strategy)# 设置初始资本为10,000startcash = 100000cerebro.broker.setcash(startcash) # 设置交易手续费为 0.1%cerebro.broker.setcommission(commission=0.001) cerebro.run()#获取回测结束后的总资金portvalue = cerebro.broker.getvalue()pnl = portvalue - startcashif pf:print(f'总资金: {round(portvalue,2)}')print(f'净收益: {round(pnl,2)}')%matplotlib inlinecerebro.plot()
回测结果如下图所示。
data=get_data('601318','2020-03-01')
main(data,TestStrategy)
上述策略只是调用了技术指标用于画图,下面以MACD指标为例,调用该指标计算MACD柱,当MACD柱大于0(金叉)时发出买入信号,当MACD柱小于0(死叉)时发出卖出信号。
class TradeStrategy(bt.Strategy):params=(('p1',12),('p2',26),('p3',9),)def __init__(self):self.order = None#获取MACD柱self.macdhist = bt.ind.MACDHisto(self.data,period_me1=self.p.p1, period_me2=self.p.p2, period_signal=self.p.p3)def next(self):if not self.position:# 得到当前的账户价值total_value = self.broker.getvalue()#1手=100股,满仓买入ss=int((total_value/100)/self.datas[0].close[0])*100#当MACD柱大于0(红柱)且无持仓时满仓买入if self.macdhist > 0:self.order=self.buy(size=ss)else:#当MACD柱小于0(绿柱)且持仓时全部清仓if self.macdhist < 0:self.close()
以中国平安股票为例,使用MACD指标对2010.1-2020.9年数据进行历史回测。
data=get_data('601318','2010-03-01')
main(data,TradeStrategy,pf=True)#期初资金:100000
#期末资金: 225440.47
#净收益: 125440.47
03
自定义指标
backtrader的可扩展性很强,除了内置的技术分析指标外,可以通过类的扩展进行自定义指标。20日均线在实战中具有一定的指导意义,可以根据价格偏离20日均线的某个阈值构建类似于布林带的通道线指标。
定义一个指标的类,该类继承bt.Indicator,均线采用20日周期,上下限阈值分别为20%和15%。
class TrendBand(bt.Indicator):lines = ('mid','top','bot',)params = (('maperiod',20),('period',3),('highRate',1.2),('lowRate',0.85),)#与价格在同一张图plotinfo = dict(subplot=False)def __init__(self):ema = bt.ind.EMA(self.data, period=self.p.maperiod)#计算上中下轨线self.l.mid=bt.ind.EMA(ema,period=self.p.period)self.l.top=bt.ind.EMA(self.mid*self.p.highRate,\period=self.p.period)self.l.bot=bt.ind.EMA(self.mid*self.p.lowRate,\period=self.p.period)super(TrendBand, self).__init__()
首先看一下该指标的图形。
class TestStrategy2(bt.Strategy):def __init__(self):TrendBand(self.data)
回测结果:
data=get_data('601318','2010-01-01')
main(data,TestStrategy2)
下面基于该指标构建交易策略并回测,当价格站在中轨线上,且成交量突破20日新高时买入,当价格突破上轨线时卖出。
class MyStrategy(bt.Strategy):params=(('period',20),)def __init__(self):self.order = Noneself.mid = TrendBand(self.data).mid self.top = TrendBand(self.data).topself.bot = TrendBand(self.data).bot#设置买入信号self.buy_sig=bt.And(\self.data.close>self.mid,\self.data.volume==bt.ind.Highest(\self.data.volume,period=self.p.period))#卖出信号self.sell_sig=self.data.close>self.topdef next(self):if not self.position:# 得到当前的账户价值total_value = self.broker.getvalue()#1手=100股,满仓买入ss=int((total_value/100)/self.datas[0].close[0])*100if self.buy_sig:self.order=self.buy(size=ss)else:if self.sell_sig:self.close()
仍然以中国平安为例,回测结果如下图所示:
data=get_data('601318','2010-01-01')
main(data,MyStrategy,True)#期初资金:100000.00
#期末资金: 398949.39
#净收益: 298949.39
04
结语
本文主要介绍了backtrader回测框架中indicators的调用、自定义指标的编写以及历史回测。其中自定义指标主要是示例作用,不构成任何投资建议。历史回测中仅以中国平安个股为例,具有一定的局限性,感兴趣的读者可以参考组合回测那篇推文,对全市场股票进行组合回测以进一步判断自定义指标的实用性。最后再强调一句,学习没有捷径,要想全面而深入地学习backtrader回测框架,最好的方法是研读其官方文档。公众号后台回复“backtrader”可获取《backtrader入门指南》的中文文档。
参考资料:
backtrader官方文档和安装包原生代码
https://www.backtrader.com/docu/
关于Python金融量化
专注于分享Python在金融量化领域的应用。加入知识星球,可以免费获取量化投资视频资料、量化金融相关PDF资料、公众号文章Python完整源码、量化投资前沿分析框架,与博主直接交流、结识圈内朋友等。
backtrader股票技术指标自定义与量化回测相关推荐
- 【手把手教你】获取股票数据并进行量化回测——基于ADX和MACD趋势策略
01 引言 不少喜欢量化的读者向我反馈,虽然已经掌握了Python的编程基础,但仍不知道如何切入到股票量化分析上,一是对如何获取股票数据还不太熟悉:二是拿到股票数据后不知道怎么做量化回测.实际上公众号 ...
- 【手把手教你】用backtrader量化回测海龟交易策略
01 引言 海龟交易策略是比较经典的趋势交易系统之一,涵盖了从入场交易(品种选择).仓位管理(基于ATR加减仓).离场(触发条件)的整个过程.机械套用海龟交易法则在A股上进行交易可能效果不佳,但其交易 ...
- 股票平台突破策略聚宽量化回测
股票平台突破策略量化回测 策略逻辑: 在振幅为15%以内(20cm的在30%以内),横盘60天左右.昨日涨停并且收盘价突破盘整平台最高价.次日以开盘价买入. 买卖点: 买入次日开盘价低开3%以上的直接 ...
- 小散量化炒股记|说某个指标能赚钱?不盲从,先量化回测一番!
前言 相信大家都听说了量化交易这个东西了吧!量化交易是一种新兴的系统化金融投资方法. 那么,什么才是普通股民所适合的量化交易打开方式呢? 本文就用一个接地气的股票分析场景 -- 用量化回测来识别技术指 ...
- 如何用backtrader对股票组合进行量化回测?
01 引言 backtrader是功能非常强大的量化回测框架之一,得到欧洲很多银行.基金等金融机构的青睐,并应用于实盘交易中.公众号Python金融量化针对backtrader的入门和应用已连续发布了 ...
- vnpy怎么创建策略并回测_【手把手教你】入门量化回测最强神器backtrader(一)
1 引言 目前基于Python的量化回测框架有很多,开源框架有zipline.vnpy.pyalgotrader和backtrader等,而量化平台有Quantopian(国外).聚宽.万矿.优矿.米 ...
- backtrader量化回测,基础篇,附MACD交易回测代码
backtrader由德国工程师开发,拥有股票的回测,检测交易策略,支持期货实时交易,对于股票交易还在完善,我尝试了pylagotrade,vn.py,发现backtrader功能强大,交易策略全面, ...
- 量化回测平台Backtrader实战-陆一潇-专题视频课程
量化回测平台Backtrader实战-240人已学习 课程介绍 课程通过学习Backtrader这一功能丰富的开源回测平台来逐步实现多个量化cta策略的回测实现.Backtrader是 ...
- 量化回测框架Backtrader【2】-数据导入(附:Tushare介绍)
目录 一,通用参数 二,通用CSV格式数据导入 三,panda数据导入 四,导入扩展数据类别 量化回测的第一步就是导入数据,Backtrader中称这个为data feeds,支持多种数据导入方式 通 ...
最新文章
- 基于上下文的访问控制——CBAC的配置
- 3d查看器无法加载三维模型_珠峰登顶成功,送套三维模型给你
- 评价指标:目标检测的评价指标 - mAP
- 洛谷P1937 [USACO10MAR]仓配置Barn Allocation
- 如何从控制台测试AngularJS服务?
- golang log模块之log4go使用介绍
- HDOJ-1201 18岁生日
- linux系统工程师修改打开文件数限制代码教程。服务器运维技术
- 初窥QuickTest脚本录制
- Google提供的超强圆角效果
- 【机器学习-周志华】学习笔记-第九章
- python基础-读写txt文件
- tex常用函数 上下行对齐_latex 部分右对齐
- MTF 曲线图应该怎么看?
- 100层楼,2个鸡蛋,最少要几次才能测试出鸡蛋能承受的最大楼层?
- 勇敢做自己,女神节快乐!
- PostgreSQL AUTO INCREMENT(自动增长)
- 电影《乌云背后的幸福线》观后感
- edb的安装与使用计统第二次实验
- Rocky Linux 国内镜像源列表
热门文章
- 怎样为孩子30年后做打算。
- 水鱼五笔编码练习系统
- ff14服务器稳定,开服必备 FF14电信一区服务器特色总结
- 愚人节整人软件测试自学,愚人节被玩坏的五大整人APP 帮你问鼎愚人节最佳损友...
- 区块链到底能做什么?这506个备案项目告诉你
- 综述:利用深度学习实现的虚拟试衣技术(基于图像)
- 递推算法与递推套路(算法基础篇)
- 【LeetCode】417. Pacific Atlantic Water Flow 太平洋大西洋水流问题
- 001我和Python的第一次亲密接触(根据小甲鱼视频编写)
- Linux内核分析 笔记六 进程的描述和进程的创建 ——by王玥