【量化小讲堂-Python&Pandas系列16】布林带策略在A股的实证

引言:
本系列“量化小讲堂”,通过实际案例教初学者使用python、pandas进行金融数据处理,希望能对大家有帮助。

【必读文章】:《10年400倍策略分享-附视频逐行讲解代码》
【所有系列文章汇总】:【量化小讲堂 – Python、Pandas系列】目录汇总


布林带策略在A股的实证

上一期量化小讲堂以均线策略为例,向大家介绍了如何构建一个完整策略的框架,主要分为以下几步:

  1. 产生买卖信号的策略。
  2. 根据买卖信号生成资金曲线。
  3. 根据资金曲线计算策略评价指标。

本期将以布林带(Bbands)策略为例,实证检验一下布林带策略在A股的实际效果。

—策略简介—

布林带指标,即BOLL指标,其英文全称是“Bollinger Bands”,该指标由约翰布林先生创造,方法就是利用统计原理,求出股价的标准差及其信赖区间,从而确定股价的波动范围及未来走势。具体来说就是,利用股价一段时间的均值和标准差可以得到股价运行的上、中、下轨线,而由上、中、下轨线形成的股价信道的移动范围是不确定的,信道的上下限随着股价的上下波动而变化。股价涨跌幅度加大时,带状区变宽,涨跌幅度狭小盘整时,带状区则变窄。在正常情况下,股价应始终处于股价信道内运行,如果股价突破了布林带的上下限,则意味着价格处于较极端的状态,可以以此作为择时的判断依据。

 

本文采用的布林带策略的具体规则为:

第一步:计算股票的日平均价格TP_i=(H_i+C_i+L_i)/3,其中,H_i C_i L_i分别是第i日股票的最高价、收盘价和最低价。

第二步:计算中轨线、上轨线和下轨线。

中轨线 = N日TP的移动平均线

上轨线 = 中轨线+M倍的标准差

下轨线 =中轨线-M倍的标准差(M一般取值为2,本文中M也取2)

第三步:当股票收盘价上穿上轨线,买入,信号为1;当股票收盘价下穿下轨线,卖出,信号为-1。


—实战—

为了检验布林带策略在A股的实际效果,本文将该策略在所有A股都运行一遍。由于策略用不同的参数回测结果也不一样,因此对每只股票回测时都遍历一遍参数,选择使超额收益率最大的参数作为该股票的最优参数。具体步骤如下:

一、遍历数据文件夹中所有股票文件的文件名,得到股票代码列表

用python提取股票历史数据文件夹下每个股票对应的文件名(即股票代码)并存放到一个列表里,这样就得到了所有A股的代码列表。

接着遍历股票代码的列表,读取每只股票的历史数据。

二、计算股票的后复权价格

在读取某只股票的历史数据后,为了回测结果的可靠性,本文重新计算了复权后的开盘价、收盘价、最高价和最低价,后面计算布林带和涨跌幅都以复权后的数据为基础。有些上市不久的股票由于时间太短可能不具有代表性,因此本文在运行策略之前会先判断该股票上市至今的交易天数,剔除掉上市不到1年半的股票。

三、遍历参数进行回测

接着就是计算布林带的上中下轨线并给出每天的信号了,在计算布林带时本文用到参数范围是N取10到30,间隔为2,即遍历该范围内的所有参数,每一参数都会输出对应的每天的信号,根据买卖信号,可以得到每天的仓位,进而可以得到资金曲线及相关的回测指标(相关内容可参考上一期量化小讲堂)。在得到所有参数的回测结果后,根据超额收益率大小进行排序,选择使超额收益最大的参数作为该股票的最优参数,并将相应数据存入csv文件。

最后,在遍历完所有A股后,我们可以得到每只股票在最优参数下使用布林带策略的回测结果,并和股票的年化收益及最大回撤做了一下对比。

本文希望通过对布林带策略的实际操作,向大家介绍pandas的以下几个功能的运用:

1. 移动标准差函数rolling_std()函数的用法

2. 时间序列超前滞后函数shift()函数的用法

3. 空值填充函数fillna()函数的用法


—程序—

要运行布林带策略,需要所有A股的历史交易数据,在www.yucezhe.com可以下载到所有股票历史至今的数据。如下图所示,每一行是每一天的数据:

数据有以下的字段:

  • 【code】股票的代码,上证股票以sh开头,深证股票以sz开头
  • 【date】交易日期
  • 【open】开盘价
  • 【high】最高价
  • 【low】最低价
  • 【close】收盘价
  • 【change】涨跌幅,复权之后的真实涨跌幅,保证准确
  • 【volume】成交量
  • 【money】成交额
  • 【traded_market_value】流通市值
  • 【market_value】总市值
  • 【turnover】换手率,成交量/流通股本
  • 【adjust_price】后复权价,复权开始时间为股票上市日,精确到小数点后10位
  • 【report_date】最近一期财务报告实际发布的日期
  • 【report_type】最近一期财务报告的类型,3-31对应一季报,6-30对应半年报,9-30对应三季报,12-31对应年报
  • 【PE_TTM】最近12个月市盈率,股价 / 最近12个月归属母公司的每股收益TTM
  • 【PS_TTM】最近12个月市销率, 股价 / 最近12个月每股营业收入
  • 【PC_TTM】最近12个月市现率, 股价 / 最近12个月每股经营现金流
  • 【PB】市净率,股价 / 最近期财报每股净资产

下面是代码的截图,代码里面有详细的注释,有问题可以留言,附件中有程序的源码,回复即可下载。

这是最后回测结果的部分截图:

运行该策略的一共有2607只股票,其中,策略年化收益大于股票本身年化收益的有1706只个股,占比大概为65.4%,而年化收益除以最大回撤绝对值能超过股票本身的有2043只个股,大概占78.4%,总的来说布林带策略的效果应该还可以。大家有其他一些技术指标也可以尝试一下,看看效果如何,只需要将第一部分信号产生方式改成自己的策略逻辑就可以了。

猜你喜欢

转载自blog.csdn.net/xingbuxing_py/article/details/78545467