WeQuant交易策略—BOLL
BOLL(布林线指标)策略
简介
BOLL(布林线)指标是技术分析的常用工具之一,由美国股市分析家约翰•布林根据统计学中的标准差原理设计出来的一种非常简单实用的技术分析指标。一般而言,价格的运动总是围绕某一价值中枢(如均线、成本线等)在一定的范围内变动,布林线指标正是在上述条件的基础上,引进了“价格通道”的概念,通过计算一段时间价格的“标准差”,再由均线加/减某一倍数的标准差,求出价格的“信赖区间”。该指标在图形上画出三条线,其中上下两条线可以分别看成是价格的压力线和支撑线,而在两条线之间还有一条价格平均线。一般来说,股价会运行在压力线和支撑线所形成的通道中。
计算方法
(1) 中轨线 = SMA(N) (2) 上轨线 = 中轨线 + 宽度倍数 * SD(N) (3) 下轨线 = 中轨线 – 宽度倍数 * SD(N)
其中,SMA(N)代表N个时间周期的简单移动平均;宽度倍数表示布林线上下轨偏离均线标准差的倍数,一般为2倍;SD(N)表示N个时间周期内的价格标准差。
由于采用了标准差的概念,使得布林通道的宽度会根据近期价格的波动而做出动态调整。波动小,布林通道会变窄;波动大,布林通道会变宽。
使用方法
布林线的使用方法有很多,可以单独使用,也可以和其他指标结合在一起使用。 本文中我们采用布林线一种最简单的使用方法。当价格自下而上突破上轨,即突破上方压力线时,我们认为多方力量正在走强,一波上涨行情已经形成,买入信号产生;当价格自上而下跌破下轨,即跌破支撑线时,我们认为空方力量正在走强,一波下跌趋势已经形成,卖出信号产生。
如上图所示,在比特币价格一路上涨,当价格向上突破了上轨,产生了买入信号。捕捉到了之后价格的大幅攀升,收益不断增加。之后开始回落,当价格突破下轨的时候,产生卖出信号。提前离场,避免了后面更大的损失。
布林线还有另一种用法,当价格突破上轨时,是超买信号,应当卖出而不是买入;当价格跌破下轨时,是超卖信号,应当买入而不是卖出。这种做法与上一种完全反向。它的思路是认为价格会在上下轨内波动,高了就会跌下去,低了就会涨起来,用上下轨来判断高与低。实盘操作见下图:
在这种震荡的行情中,基本做到的高抛低吸。
一种是追涨杀跌,一种是高抛低吸,这两种观点虽然操作相反,但都有道理,只是适用于不同的行情。趋势行情中,适合追涨杀跌;而震荡行情中,适合高抛低吸。
优点
布林线本身既包括了趋势指标,也包括了震荡指标,能帮助我们快速的认清市场的走势,是非常常用的技术指标。一般情况下,使用布林线操作的胜率要高于KDJ和RSI等指标。因为这些指标通常会在价格盘整的时候失去作用,产生很多错误信号。而布林线可以很好的帮我们寻找盘整阶段,以及在盘整结束时及时入场。
回测
- 参数设置:
时间段 | 2014-06-01至2016-10-01 |
---|---|
回测频率(context.frequency) | 1d |
标准差倍数 | 2 |
回看时间窗口 | 14(天) |
通过回看14天来构造布林通道的上下轨。当价格突破上轨时,买入;当价格突破下轨时,卖出。对于标准差倍数的设置,如果比较大,就会比较难触发到信号;如果比较小,又会信号频发。所以这个倍数设置也比较讲究。我们这里是以天为单位回测,而且用布林轨道作为突破的指标,追踪大的趋势。所以倍数不应设置太小,否则会产生很多干扰信号。
- 回测结果:
策略比较成功,在基准处于慢熊的过程中大部分时间处于空仓,而在基准反弹时也能成功加仓。当然,有些过于快速的暴跌还是很难避开,这也是做这种中长期趋势的通病。
总结
布林线指标利用统计学原理,通过对过去一段时间价格的波动,来构造一个当前价格的信赖区间。通过对布林线上下轨以及布林通道的宽度的研究,可以帮助我们更好的认清市场。
代码
# !/usr/bin/env python # -*- coding: utf-8 -*- # 策略代码总共分为三大部分,1)PARAMS变量 2)initialize函数 3)handle_data函数 # 请根据指示阅读。或者直接点击运行回测按钮,进行测试,查看策略效果。 # 策略名称:BOLL指标策略 # 策略详细介绍:https://wequant.io/study/strategy.boll.html # 关键词:价格通道、价格突破。 # 方法: # 1)利用均值和标准差构建价格区间 # 2)以价格超越轨道作为突破信号,向上突破买入,向下突破卖出 import numpy as np import talib # 阅读1,首次阅读可跳过: # PARAMS用于设定程序参数,回测的起始时间、结束时间、滑点误差、初始资金和持仓。 # 可以仿照格式修改,基本都能运行。如果想了解详情请参考新手学堂的API文档。 PARAMS = { "start_time": "2017-02-01 00:00:00", "end_time": "2017-08-01 00:00:00", "slippage": 0.003, "account_initial": {"huobi_cny_cash": 100000, "huobi_cny_btc": 0}, } # 阅读2,遇到不明白的变量可以跳过,需要的时候回来查阅: # initialize函数是两大核心函数之一(另一个是handle_data),用于初始化策略变量。 # 策略变量包含:必填变量,以及非必填(用户自己方便使用)的变量 def initialize(context): # 设置回测频率, 可选:"1m", "5m", "15m", "30m", "60m", "4h", "1d", "1w" context.frequency = "30m" # 设置回测基准, 比特币:"huobi_cny_btc", 莱特币:"huobi_cny_ltc", 以太坊:"huobi_cny_eth" context.benchmark = "huobi_cny_btc" # 设置回测标的, 比特币:"huobi_cny_btc", 莱特币:"huobi_cny_ltc", 以太坊:"huobi_cny_eth" context.security = "huobi_cny_btc" # 设置计算布林线的参数 # 布林线的长度(回看时间窗口为20个bar) context.user_data.period_window = 20 # 布林线的宽度(2倍标准差) context.user_data.standard_deviation_range = 2 context.user_data.bbands_opt_width_m = 60 # 阅读3,策略核心逻辑: # handle_data函数定义了策略的执行逻辑,按照frequency生成的bar依次读取并执行策略逻辑,直至程序结束。 # handle_data和bar的详细说明,请参考新手学堂的解释文档。 def handle_data(context): # 获取历史数据 hist = context.data.get_price(context.security, count=context.user_data.period_window + context.user_data.bbands_opt_width_m + 1, frequency=context.frequency) if len(hist.index) < (context.user_data.period_window + context.user_data.bbands_opt_width_m + 1): context.log.warn("bar的数量不足, 等待下一根bar...") return # 获取收盘价 prices = np.array(hist["close"]) # 初始化做多/做空信号 long_signal_triggered = False short_signal_triggered = False # 使用talib计算布林线的上中下三条线 upper, middle, lower = talib.BBANDS(prices, timeperiod=context.user_data.period_window, nbdevup=context.user_data.standard_deviation_range, nbdevdn=context.user_data.standard_deviation_range, matype=talib.MA_Type.SMA) # 获取最新价格 current_price = context.data.get_current_price(context.security) # 生成交易信号 if current_price > upper[-1]: # 穿越上轨,买入信号 long_signal_triggered = True if current_price < lower[-1]: # 穿越下轨,卖出信号 short_signal_triggered = True context.log.info("当前 价格为:%s, 上轨为:%s, 下轨为: %s" % (current_price, upper[-1], lower[-1])) # 根据信号买入/卖出 if short_signal_triggered: context.log.info("价格穿越下轨,产生卖出信号") if context.account.huobi_cny_btc >= HUOBI_CNY_BTC_MIN_ORDER_QUANTITY: # 卖出信号,且不是空仓,则市价单全仓清空 context.log.info("正在卖出 %s" % context.security) context.log.info("卖出数量为 %s" % context.account.huobi_cny_btc) context.order.sell(context.security, quantity=str(context.account.huobi_cny_btc)) else: context.log.info("仓位不足,无法卖出") elif long_signal_triggered: context.log.info("价格穿越上轨,产生买入信号") if context.account.huobi_cny_cash >= HUOBI_CNY_BTC_MIN_ORDER_CASH_AMOUNT: # 买入信号,且持有现金,则市价单全仓买入 context.log.info("正在买入 %s" % context.security) context.log.info("下单金额为 %s 元" % context.account.huobi_cny_cash) context.order.buy(context.security, cash_amount=str(context.account.huobi_cny_cash)) else: context.log.info("现金不足,无法下单") else: context.log.info("无交易信号,进入下一根bar")
回测
30m
60m
4h
1d
WeQuant交易策略—BOLL的更多相关文章
- WeQuant交易策略—网格交易
网格交易策略(Grid Trading) 策略介绍 网格策略本质上是一种低吸高抛的策略.标的物价格越低,吸纳的头寸越多:标的物价格越高,卖出的头寸越多.网格策略巧妙地借鉴了日常生活中渔翁撒网扑鱼的思路 ...
- WeQuant交易策略—Dual Thrust
Dual Thrust策略 策略介绍 Dual Thrust是一个趋势跟踪系统,由Michael Chalek在20世纪80年代开发,曾被Future Thruth杂志评为最赚钱的策略之一. Dual ...
- WeQuant交易策略—ATR
ATR(真实波幅均值)策略 策略介绍 ATR(average true range,真实波幅均值),是用来衡量一段时间内价格的真实的平均波动范围,ATR不是一个领先指标,但是它测量最重要的市场参数之一 ...
- WeQuant交易策略—RSI
RSI指标策略 策略介绍 RSI(相对强弱指标),是通过一段时期内的平均收盘上涨和下跌数,计算价格上涨所产生的波动占整个波动的百分比,来分析市场买卖盘的意向和实力. 计算公式(以日为单位举例) RSI ...
- WeQuant交易策略—KDJ
KDJ随机指标策略策略介绍KDJ指标又叫随机指标,是一种相当新颖.实用的技术分析指标,它起先用于期货市场的分析,后被广泛用于股市的中短期趋势分析,是期货和股票市场上最常用的技术分析工具.随机指标KDJ ...
- WeQuant交易策略—MACD
MACD(指数平滑异同平均线)策略简介MACD指标应该是大家最常见的技术指标,在很多股票.比特币的软件中都是默认显示的.MACD是从双指数移动平均线发展而来的.意义和双移动平均线基本相同,即由快.慢均 ...
- WeQuant交易策略—简单均线
简单双均线策略(Simple Moving Average) 策略介绍简单双均线策略,通过一短一长(一快一慢)两个回看时间窗口收盘价的简单移动平均绘制两条均线,利用均线的交叉来跟踪价格的趋势.这里说的 ...
- WeQuant交易策略—EMV
EMV指标策略 简介 EMV(Ease of Movement Value, 简易波动指标),它是由RichardW.ArmJr.根据等量图和压缩图的原理设计而成, 目的是将价格与成交量的变化结合成一 ...
- WeQuant交易策略—Chaikin A/D
策略名称:AD指标策略 多空双方力量浮标- AD(Chaikin A/D线)策略关键词:ChaikinA/D线.多空对比.AD指标是一种非常流行的平横交易量指标, 用于估定一段时间内该证券累积的资金流 ...
随机推荐
- PHP获取文件夹中的所有文件(包括子目录)
方法一: 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 function tree($directory) ...
- StringBuilder类中的重要方法
下面的API注解包含了StringBuilder类中的重要方法 append(boolean b):将 boolean 参数的字符串表示形式追加到序列. append(char c):将 char 参 ...
- 2017年1月1日 App Store中的所有应用都必须启用 App Transport Security安全功能
2017年1月1日 App Store中的所有应用都必须启用 App Transport Security安全功能,否则极有可能被拒! 在WWDC 2016开发者大会上,苹果宣布了一个最后期限:到20 ...
- (转)HTTP协议漫谈
HTTP协议漫谈 简介 园子里已经有不少介绍HTTP的的好文章.对HTTP的一些细节介绍的比较好,所以本篇文章不会对HTTP的细节进行深究,而是从够高和更结构化的角度将HTTP协议的元素进行分类讲 ...
- (转)B-树和B+树的应用:数据搜索和数据库索引
B-树 1 .B-树定义 B-树是一种平衡的多路查找树,它在文件系统中很有用. 定义:一棵m 阶的B-树,或者为空树,或为满足下列特性的m 叉树: ⑴树中每个结点至多有m 棵子树: ⑵若根结点不是叶子 ...
- (转)生产者/消费者问题的多种Java实现方式 (待整理)
实质上,很多后台服务程序并发控制的基本原理都可以归纳为生产者/消费者模式,而这是恰恰是在本科操作系统课堂上老师反复讲解,而我们却视而不见不以为然的.在博文<一种面向作业流(工作流)的轻量级可复用 ...
- 【CSS】background 的覆盖
1. 样式覆盖问题描述 现象:class1 为dom节点默认样式,class2为dom节点后增加样式,发现class2的background 被class1的覆盖 解决办法:在class2 的back ...
- kibana 常用查询方法
下面直接通过实例演示常用的搜索方法 转义特殊字符 + - && || ! () {} [] ^" ~ * ? : \ 注意:以上字符当作值搜索的时候需要用 \ 转义 1.在任 ...
- hadoop以及相关组件介绍以及个人理解
前言 本人是由java后端转型大数据方向,目前也有近一年半时间了,不过我平时的开发平台是阿里云的Maxcompute,通过这么长时间的开发,对数据仓库也有了一定的理解,ETL这些经验还算比较丰富.但是 ...
- ECMAScript6新特性之let、const
第一次在博客园写博客,想把自己每一天学习到的知识点记录下来,心里有点紧张(PS:不知道自己能不能写好......嘿嘿).言归正传,咱们先来说说"ECMAScript"这到底是啥玩意 ...