『期货策略』-布林带突破策略


(caoxiyang) #1

期货策略-布林带(Bollinger Bands)突破策略

策略介绍

布林带(Bollinger Bands,BBands) 也称为布林通道、包宁杰带状、保力加通道或布历加通道,是由约翰·包宁杰(John Bollinger)在1980年代发明的技术分析工具。应用上结合了移动平均和标准差的概念,其基本的型态是由三条轨道线组成的带状通道(中轨和上、下轨各一条)。中轨为股价的平均成本,上轨和下轨可分别视为股价的压力线和支撑线。

策略思路

布林带”是这样定义的:

  • 中轨 = N时间段的简单移动平均线
  • 上轨 = 中轨 + K × N时间段的标准差
  • 下轨 = 中轨 − K × N时间段的标准差

一般情况下,设定N=20和K=2,这两个数值也是在布林带当中使用最多的。在日线图里,N=20其实就是“月均线”(MA20)。依照正态分布规则,约有95%的数值会分布在距离平均值有正负2个标准差的范围内。

策略指标

在2010年春天,Bollinger引入了基于Bollinger波段的新指标,根据波段来测量价格变化:

%b 指标(Percent b,PB)

以数字形式呈现收盘价在布林带中的位置,做为交易决策时的关键指标。
例如:当%b值为0.5(或以百分比表示50%),代表收盘价处于布林带的中间位置。用last表示收盘价,upper表示上轨值,lower表示下轨值:
$$ \% b =(last−lower)/(upper−lower) $$

由于收盘价会在上、下轨道震荡游走,幅度甚至大于轨道范围(0~1),因此%b值没有上下限。当走势向上突破,收盘价落于上轨上方时,%b值> 1;而走趋向下突破,收盘价落在下轨下方时,%b值< 0。
借由观察分析“%b指标”可以提供投资时的参考,依据指标的强弱走势,作出买卖决策。

带宽指标(Bandwidth,BW)

是由布林带中轨及上、下轨衍生出的指标,利用股价波动范围以判断趋势的强度与转折。用middle表示中轨值:
$$Bandwidth=(upper−lower)/ middle$$
布林带中轨为股价的移动平均值(平均成本),所以带宽指标值可视为通道上、下轨幅度与股价平均成本的比率(例如:当带宽指标值为0.3,代表通道上、下轨幅度为股价平均成本的30%)。
“带宽指标”值越高,代表幅度相对平均成本比率越大;值越低,代表幅度相对平均成本比率越小。%b的用途包括系统构建和模式识别。带宽的使用包括识别波动相对极端的机会和趋势识别。

布林带图形

【S&P500指数】 上图:为布林带轨道图,红色为上轨、蓝色为中轨、绿色为下轨; 中图:为%b值(收盘价的相对位置); 下图:为带宽指标(上、下轨间宽度)。

策略实现

设置K=2 , N=20
交易标的:‘RU1809.SHF’
策略开始时间:2017-11-01
策略结束时间:2018-06-01

交易逻辑

  • 价格突破上轨(%b大于等于1),买入开仓
  • 价格突破下轨(%b小于等于0),卖出开仓

策略代码如下

克隆策略
In [6]:
import numpy as np
def initialize(context):
    # 设置是否是结算模式
    context.set_need_settle(False)
    # 设置最大杠杆
    context.set_max_leverage(1,'fill_amap')
    # 设置参数 N、K值
    context.window = 20
    context.width = 2
def handle_data(context, data):
    
    if context.trading_day_index < context.window : # 在形成均线后才开始交易
        return
    
    today = data.current_dt.strftime('%Y-%m-%d') # 当前交易日期
    instrument = context.future_symbol(context.instruments[0]) # 交易标的
    curr_po = context.portfolio.positions[instrument] # 组合持仓
    curr_position = curr_po.amount # 持仓数量
    price = data.current(instrument, 'price') # 当前价格
    
    # 计算20天内均值、标准差
    mean = data.history(instrument, 'price', context.window, '1d').mean()
    std = data.history(instrument, 'price', context.window, '1d').std()
    # 计算上下轨
    upper = mean + context.width*std
    lower = mean - context.width*std
    # 计算%b
    percent_b = (price - lower)/(upper - lower)
    
    # 交易逻辑
    if percent_b >= 1 and data.can_trade(instrument):
        context.order_target(instrument, 20) # 买入开仓
    elif percent_b <= 0 and data.can_trade(instrument):
        context.order_target(instrument, -20) # 卖出开仓
        
#启动回测
#策略回测接口: https://bigquant.com/docs/module_trade.html
m = M.trade.v3(
    instruments= ['RU1809.SHF'],
    start_date='2017-11-01',
    end_date='2018-06-01',
    initialize=initialize,
    handle_data=handle_data,
    # 买入订单以开盘价成交
    order_price_field_buy='open',
    # 卖出订单以开盘价成交
    order_price_field_sell='open',
    capital_base=1000000,
    benchmark='RU1809.SHF',
    m_deps=np.random.rand()
)
[2018-08-01 17:49:32.912336] INFO: bigquant: backtest.v7 开始运行..
[2018-08-01 17:49:32.935793] INFO: bigquant: biglearning backtest:V7.1.2
[2018-08-01 17:49:33.105007] INFO: algo: TradingAlgorithm V1.2.2
[2018-08-01 17:49:34.209154] INFO: Performance: Simulated 143 trading days out of 143.
[2018-08-01 17:49:34.210351] INFO: Performance: first open: 2017-10-31 21:00:00+00:00
[2018-08-01 17:49:34.211153] INFO: Performance: last close: 2018-06-01 15:00:00+00:00
  • 收益率19.46%
  • 年化收益率36.8%
  • 基准收益率-16.99%
  • 阿尔法0.19
  • 贝塔-0.67
  • 夏普比率0.81
  • 胜率0.5
  • 盈亏比1.76
  • 收益波动率50.32%
  • 信息比率0.07
  • 最大回撤27.04%
[2018-08-01 17:49:35.147476] INFO: bigquant: backtest.v7 运行完成[2.235152s].

还不支持期货吗