布林带(Bollinger Bands)指标是股市技术分析的常用工具之一。该指标由约翰 布林提出,基于K线图画出三条线,其中上下两条线可以分别看成是股价的压力线和支撑线,而在两条线之间还有一条股价平均线。布林线的交易规则比较复杂,可适用于震荡行情、单边行情、开口和缩口等不同情况,熟练运用需要结合行情进行分析。

不过笔者更乐意从统计的角度进行分析,布林带的上下线相当于围绕均值的置信区间带,只要是震荡行情,可以根据上限买下限卖,容易获利;但在趋势市场中,考虑到指标的滞后性,会出现K线一直位于布林线的上限或下限情况,因此,对于单边行情,感觉有悖统计学原理,笔者不喜欢用布林线进行单边行情的交易。

布林线虽然能够适合不同的行情,实际运用过程中,需要预先对市场行情进行预判,才会得到合理的运用。但并不是说布林线万能,布林带与大多数技术性指标一样,存在的问题就是滞后性和带宽的不对称性,当震荡(或波动)增加时,带宽会随之增加,但波动减少时,带宽会缓慢缩小。也就是说,带宽增加和减少具有不对称性。考虑到这个特点,实际分析中,有人对布林带指标进行修正。其中布林线均线、上限和下限对应的公式分别为:

为了对布林线和修正布林线指标有直观的理解,如下图6.1是以中国银行2017年度数据为例,其中红色虚线为原始布林线上下限,蓝色实线为修正的布林线上下限,可以看出,修正布林线带宽收缩比较快,如2018年上涨过程中,原始布林线下限大幅远离K线,而修正布林线下限的偏离程度很大程度上得到修正。

图6.1 布林线(虚线)与调整布林线(实线)指标在中国银行股票上的表现

下面基于修正布林带指标建立策略,分析布林带策略的有效性。此处仅考虑在震荡行情的运用,即布林线下限时买入,上限时卖出。此处把此指标运用于震荡市场中。同时为了防止趋势市场中这种策略的失效,附加止损5%。对应的策略设定见表6.1。

表6.1 修正布林带策略

在此基础上,利用quantstrat工具包系统,构建布林带指标,并建立相应信号和交易规则,并验证策略的有效性。对应的策略代码如下:

#----------------------------------------加载工具包并获取数据-----------------------------------------

加载相关工具包:

>library(quantstrat)

>library(data.table)

运用本地自建函数,用于读取本地下载好的股票数据并把数据转换时间序列格式:

>source('read.local.xts.R')

设置起止时间:

>startDate

获取股票代码,考虑到对数字开头变量的引用会带来较大的麻烦,在股票代码前面加个X,从而方便后续的引用:

>symbols='X601988'

>X601988

#-----------------------------创建修正布林带指标-------------------------------------

由于系统工具包只有布林带指标,现在需要的是修正布林带指标,因此自建修正布林线函数,根据上述修正布林线公式,创建修正布林线函数,对应命令如下:

>MBbands

> a

> Mt

> Ut

> Dt

> mt

> ut

> dt

> bu

> bl

> result

> colnames(result)

> reclass(result, x)

>}

#---------------------------策略初始化------------------------------------------

设置初始资产:

>initEq=10000*length(symbols)

设置初始策略、组合和账户,为了引用方便,都命名为'bbands':

>strategy.st

初始化策略和基础框架环境空间,这个一定要有,否则后续出现问题:

>.blotter

为了保持策略的重复可用性,删除历史投资组合和策略

>rm.strat(portfolio.st)

>rm.strat(strategy.st)

设置市场类型和时区:

>currency('CNY')

>Sys.setenv(TZ="UTC")

>stock(symbols,currency='CNY',multiplier=1)

依顺序初始化投资组合、账户和委托单:

>initPortf(portfolio.st,symbols=symbols,initDate=initDate,currency='CNY')

>initAcct(account.st,portfolio.st,initDate,initEq,currency='CNY')

>initOrders(portfolio.st,initDate=initDate)

设置每次交易头寸:

>for (symbol in symbols){

> addPosLimit(portfolio.st, symbol, startDate, 10000, 1 )

>} #set max pos

设置参数:

>n = 20 #布林带均线参数

>sdp = 2 #带宽参数

>.stoploss=0.05 # 止损参数8%

保存策略:

>strategy(strategy.st, store=TRUE)

#-----------------------------增加指标-------------------------------------------

增加布林带指标

>add.indicator(strategy = strategy.st, name = "MBbands",

> arguments = list(x = quote(Cl(mktdata)),n=20, sd=2 ),

> label='mbbands')

#-----------------------------------增加信号-------------------------------------------

依据布林线与收盘价关系增加交易信号,包括买入信号和卖出信号,分别如下:

>add.signal(strategy = strategy.st,name="sigCrossover",

> arguments = list(columns=c("Close","dn"),relationship="gt"),

> label="Cl.gt.LowerBand")

>add.signal(strategy = strategy.st,name="sigCrossover",

> arguments = list(columns=c("Close","up"),relationship="gt"),

> label="Cl.gt.UpperBand")

#------------------------增加交易规则----------------------------------------------

根据交易信号增加买入和卖出交易规则,当收盘价小于布林带下线时买入,当收盘价大于布林线上线时卖出,对应的命令为:

>add.rule(strategy = strategy.st,name='ruleSignal',

> arguments = list(sigcol="Cl.gt.LowerBand",sigval=TRUE,

> orderqty= 100, ordertype='market',orderside='long',

> threshold=NULL,osFUN=osMaxPos, prefer='open'),

> type='enter',label='enterlong')

>add.rule(strategy = strategy.st,name='ruleSignal',

> arguments = list(sigcol=" Cl.gt.UpperBand ",sigval=TRUE,

> orderqty= 'all',ordertype='market',orderside='long',

> threshold=NULL, prefer='open'),#osFUN=osMaxPos

> label='exitMid',type='exit')

增加止损交易规则,具体在Cl.gt.LowerBand基础上设置止损,其中ordertype为限价止损'stoplimit',同时增加tmult=T和threshold项,具体threshold=quote(.stoploss),即当价格小于买入价*(1-stoploss)时卖出,同时考虑到时效性,设置在开盘价买卖,即prefer='open'对应的命令如下:

>add.rule(strategy.st, name = 'ruleSignal', tmult=T

> arguments=list(sigcol='Cl.gt.LowerBand', sigval=T,replace=F,orderside='long',

> ordertype='stoplimit', tmult=T, threshold=quote(stoploss),

> TxnFees=-5,orderqty='all',orderset='ocolong',prefer='open'),

> type='chain', parent='enterlong',

> label='StopLossLONG',enabled=T)#enabled or not!

#-------------------------策略运行及绩效统计---------------------------------------

运行策略:

>out

得到的结果为:

[1] "2013-04-0100:00:00 X601988 10000 @ 2.01"

[1] "2013-05-2000:00:00 X601988 -10000 @ 2.03"

[1] "2013-06-2700:00:00 X601988 10000 @ 1.86"

[1] "2013-09-1000:00:00 X601988 -10000 @ 2.11"

[1] "2017-04-0500:00:00 X601988 -10000 @ 3.5"

[1] "2017-04-2400:00:00 X601988 10000 @ 3.37"

[1] "2017-05-1500:00:00 X601988 -10000 @ 3.5"

[1] "2017-10-3100:00:00 X601988 10000 @ 4.02"

[1] "2018-01-0400:00:00 X601988 -10000 @ 4"

依顺序更新投资组合、账户和最终资产:

>updatePortf(strategy.st)

>updateAcct(account.st)

>updateEndEq(portfolio.st)

策略结果图显示:

>chart.Posn(portfolio.st,Symbol= symbols)

感兴趣可以进一步参考《量化投资基础、方法与策略——R语言实战指南》(电子工业出版社)

mchain r语言_布林带交易策略R语言实现相关推荐

  1. 如何利用Python构建布林带交易策略?

    如何用Python构建布林带交易策略? 布林带是一个技术指标,广泛用于股票市场和外汇市场.它是由三条线组成的带状区域,由均线和标准差计算而得.布林带交易策略是一种利用布林带指标进行交易的策略.本文将介 ...

  2. R语言绘制布林带通道

    使用R语言绘制布林带通道. 其基本含义为: 所使用的公式为: 参数给个定值,看个具体的示例: 函数的语法格式: 显示布林带通道: 使用的函数addBBands的语法: 欢迎交流:

  3. 量化交易陷阱和R语言改进股票配对交易策略分析中国股市投资组合

    最近我们被客户要求撰写关于量化交易的研究报告,包括一些图形和统计输出. 计算能力的指数级增长,以及量化社区(日益增长的兴趣使量化基金成为投资者蜂拥而至的最热门领域. 量化交易陷阱和R语言改进股票配对交 ...

  4. BOLL布林带定向策略

    1. 策略原理 当收盘价上穿下轨,做多 当收盘价下穿上轨,做空 代码: seting = {'name': 'BBv3', 'symbol': 'BTCUSDT', 'kTime': '15m', ' ...

  5. Boll布林带突破策略

    1.策略原理 一个很简单的策略 突破上轨,且Rsi没有超卖时做多,价格回归中轨时平仓 代码: seting = {'name': 'BB', 'symbol': 'ETHUSDT', 'kTime': ...

  6. Boll布林带波动率策略

    1.策略原理 开仓条件:Boll开口扩大,中轨往上走,Rsi没有超买,Atr大于前值 平仓条件:Boll开口缩小,中轨往下走 2.回测结果 15mK线: 原文地址:Boll布林带波动率策略 - 苏慕白 ...

  7. 机器学习因子库及特征表达式,创业板布林带突破策略,年化13.3%(附代码)

    原创文章第235篇,专注"个人成长与财富自由.世界运作的逻辑与投资". 昨天有朋友留言说,L2R效果不好,当然我不知道这位兄弟的场景. pybroker vs qlib pybro ...

  8. clustMD r语言_使用vsearch,usearch和R语言进行16s扩增子分析

    以下教程中vsearch和usearch部分的操作在虚拟机中的ubuntu18系统下进行. 1. 示例数据的下载 czh@ubuntu:~/Desktop$ curl -O https://Astro ...

  9. rc51_中国存托凭证CDR发展初期的投资交易策略_量化投资交易策略_

    中国存托凭证CDR发展初期的投资交易策略 2018-06-10 交易 一,要点 1.1,展望 1.2,简要估值 1.3,交易策略 1.4,风险因素 二,背景和假设 2.1 中国存托凭证/CDR是什么? ...

最新文章

  1. 数据结构与算法--绪论
  2. JavaScript如何获得项目根路径
  3. C#编程语言之byte[]数组和string的互相转化
  4. 问题 D: AC自动机(二分,第一个等于和最后一个等于)
  5. 关于在ubuntu下配置AMD显卡驱动的总结
  6. 哈希(hash)表查找速度为什么那么快?快在哪里了?
  7. T440安装Win7系统
  8. python正在处理中_协程和 asyncio
  9. ELK的端口以及加入x-pack的密码问题
  10. 如何使用Intellij IDEA工具导入SVN项目
  11. django后台管理--添加自定义action
  12. Red5流媒体服务器的完整尝试
  13. 2020年度美国最受市场欢迎的十大编程语言
  14. 前台服务java.lang.SecurityException: Permission Denial: startForeground
  15. 单模光电转换器怎么接_光纤收发器及其连接方式图解!
  16. 实验吧-加了料的报错注入
  17. 最新江苏水利水电安全员模拟真题及答案解析
  18. MWC就快到来!5G、物联网应用以及折迭手机为本次焦点
  19. 英文论文写作注意事项整理
  20. WPViewPDF Delphi 和 .NET 的 PDF 查看组件

热门文章

  1. java 检测表情符号_关于Java:检查字母是否为表情符号
  2. 高中数学数列公式7种方法(方法全,例子全,归纳细)
  3. 计算机毕业论文会计,会计毕业论文6000字
  4. mysql docker还是rds_rds · 输出自己/docker-mysql - Gitee.com
  5. 长春SEO优化:SEO优化开篇——内容优化
  6. windows - DirectX渲染的学习总结
  7. ListView 里面的checkBox,当其中一个被选中,其余全不被选中
  8. 01 - Empire Lupin One
  9. el-upload上传文件
  10. 山东计算机专业民办大学排名,2020年山东最好的民办大学排名