mchain r语言_布林带交易策略R语言实现
布林帶(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语言实现的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 扬帆际海——怎么做跨境电商?
- 下一篇: 微信小程序:2022强大的修复版趣味心理