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股票技术指标自定义与量化回测相关推荐

  1. 【手把手教你】获取股票数据并进行量化回测——基于ADX和MACD趋势策略

    01 引言 不少喜欢量化的读者向我反馈,虽然已经掌握了Python的编程基础,但仍不知道如何切入到股票量化分析上,一是对如何获取股票数据还不太熟悉:二是拿到股票数据后不知道怎么做量化回测.实际上公众号 ...

  2. 【手把手教你】用backtrader量化回测海龟交易策略

    01 引言 海龟交易策略是比较经典的趋势交易系统之一,涵盖了从入场交易(品种选择).仓位管理(基于ATR加减仓).离场(触发条件)的整个过程.机械套用海龟交易法则在A股上进行交易可能效果不佳,但其交易 ...

  3. 股票平台突破策略聚宽量化回测

    股票平台突破策略量化回测 策略逻辑: 在振幅为15%以内(20cm的在30%以内),横盘60天左右.昨日涨停并且收盘价突破盘整平台最高价.次日以开盘价买入. 买卖点: 买入次日开盘价低开3%以上的直接 ...

  4. 小散量化炒股记|说某个指标能赚钱?不盲从,先量化回测一番!

    前言 相信大家都听说了量化交易这个东西了吧!量化交易是一种新兴的系统化金融投资方法. 那么,什么才是普通股民所适合的量化交易打开方式呢? 本文就用一个接地气的股票分析场景 -- 用量化回测来识别技术指 ...

  5. 如何用backtrader对股票组合进行量化回测?

    01 引言 backtrader是功能非常强大的量化回测框架之一,得到欧洲很多银行.基金等金融机构的青睐,并应用于实盘交易中.公众号Python金融量化针对backtrader的入门和应用已连续发布了 ...

  6. vnpy怎么创建策略并回测_【手把手教你】入门量化回测最强神器backtrader(一)

    1 引言 目前基于Python的量化回测框架有很多,开源框架有zipline.vnpy.pyalgotrader和backtrader等,而量化平台有Quantopian(国外).聚宽.万矿.优矿.米 ...

  7. backtrader量化回测,基础篇,附MACD交易回测代码

    backtrader由德国工程师开发,拥有股票的回测,检测交易策略,支持期货实时交易,对于股票交易还在完善,我尝试了pylagotrade,vn.py,发现backtrader功能强大,交易策略全面, ...

  8. 量化回测平台Backtrader实战-陆一潇-专题视频课程

    量化回测平台Backtrader实战-240人已学习 课程介绍         课程通过学习Backtrader这一功能丰富的开源回测平台来逐步实现多个量化cta策略的回测实现.Backtrader是 ...

  9. 量化回测框架Backtrader【2】-数据导入(附:Tushare介绍)

    目录 一,通用参数 二,通用CSV格式数据导入 三,panda数据导入 四,导入扩展数据类别 量化回测的第一步就是导入数据,Backtrader中称这个为data feeds,支持多种数据导入方式 通 ...

最新文章

  1. 基于上下文的访问控制——CBAC的配置
  2. 3d查看器无法加载三维模型_珠峰登顶成功,送套三维模型给你
  3. 评价指标:目标检测的评价指标 - mAP
  4. 洛谷P1937 [USACO10MAR]仓配置Barn Allocation
  5. 如何从控制台测试AngularJS服务?
  6. golang log模块之log4go使用介绍
  7. HDOJ-1201 18岁生日
  8. linux系统工程师修改打开文件数限制代码教程。服务器运维技术
  9. 初窥QuickTest脚本录制
  10. Google提供的超强圆角效果
  11. 【机器学习-周志华】学习笔记-第九章
  12. python基础-读写txt文件
  13. tex常用函数 上下行对齐_latex 部分右对齐
  14. MTF 曲线图应该怎么看?
  15. 100层楼,2个鸡蛋,最少要几次才能测试出鸡蛋能承受的最大楼层?
  16. 勇敢做自己,女神节快乐!
  17. PostgreSQL AUTO INCREMENT(自动增长)
  18. 电影《乌云背后的幸福线》观后感
  19. edb的安装与使用计统第二次实验
  20. Rocky Linux 国内镜像源列表

热门文章

  1. 怎样为孩子30年后做打算。
  2. 水鱼五笔编码练习系统
  3. ff14服务器稳定,开服必备 FF14电信一区服务器特色总结
  4. 愚人节整人软件测试自学,愚人节被玩坏的五大整人APP 帮你问鼎愚人节最佳损友...
  5. 区块链到底能做什么?这506个备案项目告诉你
  6. 综述:利用深度学习实现的虚拟试衣技术(基于图像)
  7. 递推算法与递推套路(算法基础篇)
  8. 【LeetCode】417. Pacific Atlantic Water Flow 太平洋大西洋水流问题
  9. 001我和Python的第一次亲密接触(根据小甲鱼视频编写)
  10. Linux内核分析 笔记六 进程的描述和进程的创建 ——by王玥