请选择 进入手机版 | 继续访问电脑版
楼主: huiyujuanjuan
1939 1

[交易策略] 修正布林带交易策略R语言实现 [推广有奖]

  • 0关注
  • 6粉丝

副教授

36%

还不是VIP/贵宾

-

威望
0
论坛币
697 个
通用积分
331.9472
学术水平
19 点
热心指数
23 点
信用等级
10 点
经验
46761 点
帖子
503
精华
0
在线时间
1152 小时
注册时间
2015-2-2
最后登录
2024-3-14

相似文件 换一批

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币

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

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

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


QQ图片20190825151853.png

QQ图片20190825151955.png

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

   kkk.png

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

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

表6.1     修正布林带策略


策略

设定

参数

数据

中国银行

日K线数据

指标

修正布林带

20日线

进入

Close>Lowerband

-

退出

Close<Upperband

-

止损

5%

-

资产数量

100股(1手)

-



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

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

  2. 加载相关工具包:

  3. >library(quantstrat)

  4. >library(data.table)

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

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

  7. 设置起止时间:

  8. >startDate<-initDate<-'2013-01-04'

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

  10. >symbols='X601988'

  11. >X601988 <- read.local.xts('601988',source='tdx',type='stock')

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

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

  14. >MBbands<-function (x, n = 20, sd = 2) {

  15. >  a <- 2/(n + 1)

  16. >  Mt <- EMA(x, n = n)

  17. >  Ut <- EMA(Mt, n = n)

  18. >  Dt <- ((2 - a) * Mt - Ut)/(1 - a)

  19. >  mt <- EMA(abs(x - Dt), n = n)

  20. >  ut <- EMA(mt, n = n)

  21. >  dt <- ((2 - a) * mt - ut)/(1 - a)

  22. >  bu <- Dt + sd * dt

  23. >  bl <- Dt - sd * dt

  24. >  result <- cbind(Dt, bu, bl)

  25. >  colnames(result) <- c("mavg", "up", "dn")

  26. >  reclass(result, x)

  27. >}

  28. #------------------------------------------------策略初始化------------------------------------------

  29. 设置初始资产:

  30. >initEq=10000*length(symbols)

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

  32. >strategy.st<-portfolio.st<-account.st<-'bbands'

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

  34. >.blotter<-.strategy<-new.env()

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

  36. >rm.strat(portfolio.st)

  37. >rm.strat(strategy.st)

  38. 设置市场类型和时区:

  39. >currency('CNY')

  40. >Sys.setenv(TZ="UTC")

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

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

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

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

  45. >initOrders(portfolio.st,initDate=initDate)

  46. 设置每次交易头寸:

  47. >for (symbol in symbols){

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

  49. >} #set max pos

  50. 设置参数:

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

  52. >sdp = 2 #带宽参数

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

  54. 保存策略:

  55. >strategy(strategy.st, store=TRUE)

  56. #-------------------------------------------------增加指标-------------------------------------------

  57. 增加布林带指标

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

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

  60. >              label='mbbands')

  61. #-------------------------------------------------增加信号-------------------------------------------

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

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

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

  65. >           label="Cl.gt.LowerBand")

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

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

  68. >           label="Cl.gt.UpperBand")

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  89. 运行策略:

  90. >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)

aaa.png

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

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝


已有 1 人评分经验 学术水平 热心指数 信用等级 收起 理由
accumulation + 100 + 1 + 1 + 1 精彩帖子

总评分: 经验 + 100  学术水平 + 1  热心指数 + 1  信用等级 + 1   查看全部评分

本帖被以下文库推荐

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

使用道具

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注jr
拉您进交流群

京ICP备16021002-2号 京B2-20170662号 京公网安备 11010802022788号 论坛法律顾问:王进律师 知识产权保护声明   免责及隐私声明

GMT+8, 2024-3-28 17:52