backtrader股票技术指标自定义与量化回测

article/2025/9/18 20:29:41

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完整源码、量化投资前沿分析框架,与博主直接交流、结识圈内朋友等。


http://chatgpt.dhexx.cn/article/VNrkBpQO.shtml

相关文章

TradingView--自定义技术指标

TradingView 支持自定义指标&#xff0c;不过是把你要定义的指标写成一个 JS&#xff08;customIndex.js&#xff09; 源文件&#xff0c;放在图表库 static 文件夹下。自定义指标 JS 源代码官网模板如下&#xff1a; {// 将<study name>替换为您的指标名称// 它将由图表…

图表背后的秘密 | 技术指标讲解:ATR指标

ATR&#xff08;Average True Range&#xff09;被称为平均真实波幅。起初应用于股票市场分析&#xff0c;主要用于研判买卖时机&#xff0c;是显示市场变化率的反趋向指标&#xff0c;由威尔德1978年在其书中提出&#xff0c;目前已成为众多指标经常引用的技术量。 ATR指标的计…

PLC系统中的5个技术指标

在工业自动化控制中&#xff0c;经常会遇到开关量、数字值、模拟值、离散值、脉冲值等各种概念&#xff0c;人们在实际应用中很容易混淆这些概念。各种概念如下: 1.开关量:一般指触点的“开”和“关”状态&#xff0c;计算机设备中也常用“0”或“1”来表示开关量的状态。开关量…

传统技术指标有效性的量化分析

投资要点 技术分析源远流长&#xff0c;最早可追溯到查尔斯.亨利.道对股票移动平均数&#xff08;MA&#xff09;的研究&#xff0c;至今已走过100多年的发展历程。这些技术指标尤其是那些常见的、经典的、传统的指标&#xff0c;已经成为普通投资者普遍熟知和使用的研判工具&…

性能测试指标之业务指标和技术指标如何进行区别

通过业务指标 转化我们的技术指标&#xff0c;用户 第三方客户&#xff0c; 公司内部产品经理 产品经理 会提出产品业务指标&#xff0c;需要对业务指标进行挖掘&#xff0c;提出测试场景 业务指标会转化成相对应的技术指标 时间指标 平均响应时间 最大响应时间 最小的响…

用Python绘制MACD、KDJ、布林线技术指标图

背景介绍&#xff1a; 搭建程序化交易平台的过程需要研究技术指标。 环境&#xff1a; OS&#xff1a;mac PYTHON: 3.8 IDE: pycharm 步骤&#xff1a; 第一步&#xff1a;加载库 import pandas as pd import pandas_datareader as web from datetime import datetime, …

计算机硬件的主要技术指标

计算机硬件的主要技术指标 机器字长&#xff1a;CPU一次能处理数据的二进制位数。存储容量&#xff1a;存放二进制信息的总位数运算速度运算速度&#xff08;吉普森法&#xff09;图片来源&#xff1a;老师授课PPT 机器字长&#xff1a;CPU一次能处理数据的二进制位数。 1.由运…

技术分析中的五种常见指标

目录 相对强弱指数&#xff08;RSI&#xff09;移动平均线&#xff08;MA&#xff09;平滑异同移动平均线&#xff08;MACD&#xff09;随机相对强弱指数&#xff08;StochRSI&#xff09;布林线指标&#xff08;BB&#xff09; 简介 市场交易者通过对技术指标的分析来确定资…

数字证书是什么?

数字证书作为一种虚拟证书在互联网的传输过程起着至关重要的作用&#xff0c;人们都知道在数字证书作用下&#xff0c;我们的信息隐私得已保护&#xff0c;但是对于数字证书概念&#xff0c;相信大部分都还是一知半解的。接下来&#xff0c;小编将给大家介绍一下数字证书是什么…

数字证书有什么作用?

数字证书是指 CA 机构发行的一种电子文档&#xff0c;是一串能够表明网络用户身份信息的数字&#xff0c;提供了一种在计算机网络上验证网络用户身份的方式&#xff0c;因此数字证书又称为数字标识。CA 中心采用的是以数字加密技术为核心的数字证书认证技术&#xff0c;通过数字…

数字证书再理解

1.基础知识 1.1.公钥密码体制(public-key cryptography) 公钥密码体制分为三个部分&#xff0c;公钥、私钥、加密解密算法&#xff0c;它的加密解密过程如下&#xff1a; 加密&#xff1a;通过加密算法和公钥对内容(或说明文)进行加密&#xff0c;得到密文。加密过程需要用到…

数字证书(CA)的理解

数字证书的理解 前言 「公开密钥加密」和「数字签名」无法保证公开密钥确实来自信息的发送者。因此&#xff0c;就算公开密钥被第三者恶意替换&#xff0c;接收方也不会注意到。数字证书可以完美的解决这一问题&#xff0c;保证公开密钥的正确性。 处理流程图解 A持有公开密…

CA和数字证书

文章目录 1. 什么是CA2. 数字证书能做什么3. 非对称密钥运算原理4. PKCS系列标准4.1 PKCS#14.2 PKCS#74.2 .1 SignedData的结构分析4.2 .2 envelopedData的结构 4.3 数字信封4.4 PKCS#104.4.1 证书请求过程4.4.2 证书验证过程 5. X.509证书简介5.1 证书文件扩展名5.2 证书链和交…

数字证书原理

证书&#xff0c;也叫做数字证书&#xff0c;是网络世界中的“身份证”。证书将持有者的身份信息和公钥关联到一起&#xff0c;保证公钥确实是这个证书持有者的&#xff0c;通过证书就可以确认持有者的身份。证书由权威的、公正的、可信任的第三方机构颁发&#xff0c;我们把证…

数字证书介绍

1.数字证书的分类 1.1按持有者分类 通常依照证书持有者的类型可将证书分为三类&#xff1a;个人证书、单位证书和系统证书。 个人证书&#xff1a;CA中心给个人颁发的证书&#xff0c;仅代表个人身份&#xff0c;证书包含个人信息和个人公钥。 单位证书&#xff1a;CA中心给…

数字证书相关

概念 数字证书 数字身份&#xff08;digital identity&#xff09;是身份标识方式的一种&#xff0c;是一对“钥匙”&#xff0c;其中一个只有她/他本人知道&#xff08;即私钥&#xff09;&#xff0c;另一个是公开的&#xff08;公钥&#xff09;。把数字身份比喻成一个证件…

网站上数字证书原理你知道么?

前言&#xff1a;文中首先解释了加密解密的一些基础知识和概念&#xff0c;然后通过一个加密通信过程的例子说明了加密算法的作用&#xff0c;以及数字证书的出现所起的作用。接着对数字证书做一个详细的解释&#xff0c;并讨论一下windows中数字证书的管理&#xff0c;最后演示…

CA证书(数字证书的原理)

转自&#xff1a;http://www.cnblogs.com/JeffreySun/archive/2010/06/24/1627247.html&#xff08;感谢&#xff09; 文中首先解释了加密解密的一些基础知识和概念&#xff0c;然后通过一个加密通信过程的例子说明了加密算法的作用&#xff0c;以及数字证书的出现所起的作用。…

数字签名和数字证书的区别与联系

前言 最近在开发关于PDF合同文档电子签章的功能&#xff0c;大概意思就是在一份PDF合同上签名&#xff0c;盖章&#xff0c;使其具有法律效应。签章有法律效应必须满足两个条件&#xff1a; 能够证明签名&#xff0c;盖章者是谁&#xff0c;无法抵赖PDF合同在签章后不能被更改…

什么是数字证书

整理了几篇关于CA证书的经典文章&#xff1a; 文章目录 一、数字证书二、数字证书原理的形象理解 一、数字证书 什么是数字证书 一文看懂HTTPS、证书机构&#xff08;CA&#xff09;、证书、数字签名、私钥、公钥 二、数字证书原理的形象理解 数字证书原理与自建CA证书 第一…