相似文件
换一批
经管之家送您一份
应届毕业生专属福利!
求职就业群
感谢您参与论坛问题回答
经管之家送您两个论坛币!
+2 论坛币
布林带(Bollinger Bands)指标是股市技术分析的常用工具之一。该指标由约翰 布林提出,基于K线图画出三条线,其中上下两条线可以分别看成是股价的压力线和支撑线,而在两条线之间还有一条股价平均线。布林线的交易规则比较复杂,可适用于震荡行情、单边行情、开口和缩口等不同情况,熟练运用需要结合行情进行分析。 不过笔者更乐意从统计的角度进行分析,布林带的上下线相当于围绕均值的置信区间带,只要是震荡行情,可以根据上限买下限卖,容易获利;但在趋势市场中,考虑到指标的滞后性,会出现K线一直位于布林线的上限或下限情况,因此,对于单边行情,感觉有悖统计学原理,笔者不喜欢用布林线进行单边行情的交易。 布林线虽然能够适合不同的行情,实际运用过程中,需要预先对市场行情进行预判,才会得到合理的运用。但并不是说布林线万能,布林带与大多数技术性指标一样,存在的问题就是滞后性和带宽的不对称性,当震荡(或波动)增加时,带宽会随之增加,但波动减少时,带宽会缓慢缩小。也就是说,带宽增加和减少具有不对称性。考虑到这个特点,实际分析中,有人对布林带指标进行修正。其中布林线均线、上限和下限对应的公式分别为:
为了对布林线和修正布林线指标有直观的理解,如下图6.1是以中国银行2017年度数据为例,其中红色虚线为原始布林线上下限,蓝色实线为修正的布林线上下限,可以看出,修正布林线带宽收缩比较快,如2018年上涨过程中,原始布林线下限大幅远离K线,而修正布林线下限的偏离程度很大程度上得到修正。
图6.1 布林线(虚线)与调整布林线(实线)指标在中国银行股票上的表现 下面基于修正布林带指标建立策略,分析布林带策略的有效性。此处仅考虑在震荡行情的运用,即布林线下限时买入,上限时卖出。此处把此指标运用于震荡市场中。同时为了防止趋势市场中这种策略的失效,附加止损5%。对应的策略设定见表6.1。 表6.1 修正布林带策略
策略 | 设定 | 参数 | 数据 | 中国银行 | 日K线数据 | 指标 | 修正布林带 | 20日线 | 进入 | Close>Lowerband | - | 退出 | Close<Upperband | - | 止损 | 5% | - | 资产数量 | 100股(1手) | - |
在此基础上,利用quantstrat工具包系统,构建布林带指标,并建立相应信号和交易规则,并验证策略的有效性。对应的策略代码如下: - #----------------------------------------加载工具包并获取数据-----------------------------------------
- 加载相关工具包:
- >library(quantstrat)
- >library(data.table)
- 运用本地自建函数,用于读取本地下载好的股票数据并把数据转换时间序列格式:
- >source('read.local.xts.R')
- 设置起止时间:
- >startDate<-initDate<-'2013-01-04'
- 获取股票代码,考虑到对数字开头变量的引用会带来较大的麻烦,在股票代码前面加个X,从而方便后续的引用:
- >symbols='X601988'
- >X601988 <- read.local.xts('601988',source='tdx',type='stock')
- #-------------------------------------------创建修正布林带指标--------------------------------------
- 由于系统工具包只有布林带指标,现在需要的是修正布林带指标,因此自建修正布林线函数,根据上述修正布林线公式,创建修正布林线函数,对应命令如下:
- >MBbands<-function (x, n = 20, sd = 2) {
- > a <- 2/(n + 1)
- > Mt <- EMA(x, n = n)
- > Ut <- EMA(Mt, n = n)
- > Dt <- ((2 - a) * Mt - Ut)/(1 - a)
- > mt <- EMA(abs(x - Dt), n = n)
- > ut <- EMA(mt, n = n)
- > dt <- ((2 - a) * mt - ut)/(1 - a)
- > bu <- Dt + sd * dt
- > bl <- Dt - sd * dt
- > result <- cbind(Dt, bu, bl)
- > colnames(result) <- c("mavg", "up", "dn")
- > reclass(result, x)
- >}
- #------------------------------------------------策略初始化------------------------------------------
- 设置初始资产:
- >initEq=10000*length(symbols)
- 设置初始策略、组合和账户,为了引用方便,都命名为'bbands':
- >strategy.st<-portfolio.st<-account.st<-'bbands'
- 初始化策略和基础框架环境空间,这个一定要有,否则后续出现问题:
- >.blotter<-.strategy<-new.env()
- 为了保持策略的重复可用性,删除历史投资组合和策略
- >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<-try(applyStrategy(strategy.st, portfolios='bbands'))
复制代码得到的结果为: [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语言实战指南》(电子工业出版社)
扫码加我 拉你入群
请注明:姓名-公司-职位
以便审核进群资格,未注明则拒绝
|