布林带通道(Bollinger Bands)是非常经典的技术指标,常用于研判市场中长期运动趋势。
比如我们以[350, 2,2] 这组长线参数来绘制恒瑞医药、贵州茅台10年行情走势的布林带通道,如下所示:
不少星球学员向我发起了支持布林带通道策略的需求。其实在QTYX量化分析系统中支持这个策略还是非常容易的,于是我们升级了版本至V2.4.7来支持这个策略。
布林带通道的应用网上介绍了很多,比如股价突破上轨为超买,跌破上轨为超卖等等,此处不再赘述。这里主要介绍下如何在QTYX中添加布林带通道策略。
我们看到图上布林带通道由三条轨道线组成,分别是上轨 、中轨和下轨。中轨线是N日移动平均线(MA),上轨线和下轨线分别是中轨线的正负N倍标准差。
布林带通道的计算可以直接使用talib的接口:
upper, middle, lower = talib.BBANDS(close, timeperiod=20, nbdevup=2, nbdevdn=2, matype=0)
根据收盘数据可以计算出一个通道轨迹值,upper为上限,lower为下限,middle为平均位置。
调用参数:
close:收盘价
timeperiod:计算的周期,通常选择20天
nbdevup:上限价格相对于周期内标准偏差的倍数,取值越大,则上限越大,通道越宽
nbdevdn:下限价格相对于周期内标准偏差的倍数,取值越大,则下限越大,通道越宽
matype:平均值计算方法,用于设定哪种类型的MA。0=SMA, 1=EMA, 2=WMA, 3=DEMA, 4=TEMA, 5=TRIMA, 6=KAMA, 7=MAMA, 8=T3 (Default=SMA)
在/QTYX/StrategyGath/StrategyGath.py的Base_Strategy_Group类中添加策略代码,如下所示:
@staticmethod
def get_bbands_signal(stock_dat, period = 20, nup = 2, ndn = 2):
# 布林带通道突破 买入/卖出信号
stock_dat['H_line'], stock_dat['M_line'], stock_dat['L_line'] = talib.BBANDS(stock_dat.Close, timeperiod=period,
nbdevup=nup, nbdevdn=ndn, matype=0)
# 当天收盘价穿越昨天通道顶部 第二天买入股票
buy_index = stock_dat[stock_dat.Close > stock_dat.H_line].index
# 当天收盘价跌破昨天通道底部 第二天卖出股票
sell_index = stock_dat[stock_dat.Close < stock_dat.L_line].index
stock_dat.loc[buy_index, 'Signal'] = 1
stock_dat.loc[sell_index, 'Signal'] = -1
stock_dat['Signal'] = stock_dat.Signal.shift(1) # 当天出信号则第二天买入
# print(stock_dat[stock_dat['signal'].notna()])
stock_dat['Signal'].fillna(method='ffill', inplace=True) # 与前面元素值保持一致
stock_dat['Signal'].fillna(value=-1, inplace=True) # 序列最前面几个NaN值用-1填充
return stock_dat
策略的关键是得到买卖信号序列。比如将买入当天的 Signal 值设置为 1,将卖出当天的 Signal设置为−1。
然后在QTYX/MainlyGui/ElementGui/DefTreelist.py的colleges中注册接口:
colleges = {
u'经典策略': [
{u'名称': u'N日突破', u'标识': u'趋势', '函数': u'已定义', 'define': "get_ndays_signal"},
{u'名称': u'ATR止盈止损', u'标识': u'趋势', '函数': u'已定义', 'define': "get_ndays_atr_signal"},
{u'名称': u'布林带突破', u'标识': u'趋势', '函数': u'已定义', 'define': "get_bbands_signal"}],
u'自定义策略': [
{u'名称': u'yx-zl-1', u'标识': u'综合', '函数': u'未定义'},
{u'名称': u'yx-zl-2', u'标识': u'趋势', '函数': u'未定义'},
{u'名称': u'yx-zl-3', u'标识': u'波动', '函数': u'未定义'}],
u'衍生指标': [
{u'名称': u'均线交叉', u'标识': u'cross', '函数': u'已定义'},
{u'名称': u'跳空缺口', u'标识': u'jump', '函数': u'已定义'},
{u'名称': u'黄金分割', u'标识': u'fibonacci', '函数': u'已定义'}],
u'K线形态': [
{u'名称': u'乌云盖顶', u'标识': u'CDLDARKCLOUDCOVER', '函数': u'已定义'},
{u'名称': u'三只乌鸦', u'标识': u'CDL3BLACKCROWS', '函数': u'已定义'},
{u'名称': u'十字星', u'标识': u'CDLDOJISTAR', '函数': u'已定义'},
{u'名称': u'锤头', u'标识': u'CDLHAMMER', '函数': u'已定义'},
{u'名称': u'射击之星', u'标识': u'CDLSHOOTINGSTAR', '函数': u'已定义'}
]
}
这样就把策略添加到QTYX系统中了,可以看到布林带策略已经在界面的策略列表中了。
回测时只要点击左边树形控件的策略名称,选中的策略就生效了!
使用talib库设计择时策略原来这么方便!
同样地,按这个思路我们可以基于均线、MACD、KDJ、RSI、OBV……以及多指标组合,设计出各式各样的策略。
因为我们直接在本地的Python环境下编程,只要生成出买卖信号序列即可,编写的逻辑过程可以任意发挥,非常灵活,而且不存在黑盒子!
说明
1. 我们会把完整的源码上传到知识星球《玩转股票量化交易》中,帮助小伙伴们更好地掌握这个方法。
2. 想要加入知识星球《玩转股票量化交易》的小伙伴记得先微信call我获取福利!
添加布林带择时策略有多便捷!股票量化分析工具QTYX-V2.4.7