1 策略原理

布林帶通道策略(BollChannel)是一個典型的通道突破策略,即當價格突破通道上軌時做多,當價格走低突破通道下軌時做空。軌道計算的思路也相對簡單,先計算移動均線(MA),並且統計標準差STD,設置一定的通道寬度偏差X,則:

  • 上軌=MA+X*STD
  • 下軌=MA-X*STD

布林帶策略與上一節介紹的KingKeltner策略非常類似,區別在於僅僅把ATR指標換成標準差。因為標準差統計的數據是基於K線收盤價的,它並不能捕捉到K線跳空高開或者跳空低開的情況,理論上更適合於一些在短期內有較小波動的品種,如商品期貨。下面的策略回測會以螺紋鋼期貨為例,而不是之前的滬深300股指期貨。

布林帶通道策略三大要素

  • 信號:價格突破上軌做多,突破下軌做空
  • 過濾:若價格在通道內上下走動,則不進行開倉操作
  • 出場:固定百分點數移動止損離場

基於傳統布林帶通道策略的基礎上,加入CCI指標做過濾,ATR指標作為出場,策略的效果會好上很多。故新版布林帶通道策略三大要素為:

  • 信號:布林帶通道突破開倉交易
  • 過濾:CCI 指標
  • 出場:結合ATR指標的移動止損

2 CCI指標

2.1)CCI指標原理

CCI指標又叫順勢指標,其英文全名為Commodity Channel Index,是由美國股市分析家唐納德?R.蘭伯特(Donald R.Lambert)於20世紀80年代所創,是指導股市投資的一種中短線指標。

CCI指標是一種超買超賣指標。所謂超買超賣指標,顧名思義,「超買」,就是已經超出買方的能力,買進股票的人數超過了一定比例,那麼,這時候應該反向賣出股票。"超賣"則代表賣方賣股票賣過了頭,賣股票的人數超過一定比例時,反而應該買進股票。這是在一般常態行情,但是,如果行情是超乎尋常的強勢,則超買越賣指標會突然間失去方向,行情不停的持續前進,群眾似乎失去了控制,對於原價的這種脫序行為,CCI指標提供了不同度的看法。這樣就有利於投資者更好的研判行情,特別是那些短期內暴漲暴跌的非常態行情。

2.2)CCI計算原理

CCI(N日)=(TP-MA)÷MD÷0.015

其中,TP=(最高價+最低價+收盤價)÷3

MA=近N日收盤價的累計之和÷N

MD=近N日(MA-收盤價)的絕對值累計之和÷N

0.015為計算係數,N為計算周期

2.3)CCI指標信號判斷

  • 當CCI>0時,判斷多頭趨勢,K線內用停止單做多
  • 當CCI<0時,判斷空頭趨勢,K線內用停止單做空

2.4)策略代碼

CCI 指標過濾與布林帶通道交易信號相結合,主要用於開倉操作。若CCI > 0,顯示上升趨勢 , 在布林帶通道上軌掛上買入停止單。若CCI < 0,顯示下降趨勢 , 在布林帶通道下軌掛上賣出停止單。

def onXminBar(self, bar):
......

# 當前無倉位,發送開倉委託
if self.pos == 0:
self.intraTradeHigh = bar.high
self.intraTradeLow = bar.low

if self.cciValue > 0:
self.buy(self.bollUp, self.fixedSize, True)

elif self.cciValue < 0:
self.short(self.bollDown, self.fixedSize, True)
.....

3 ATR指標

3.1)ATR指標作用

ATR指標主要是用來衡量市場波動的強烈度,即為了顯示市場變化率的指標。它主要用來衡量價格的波動,並不能直接反映價格走向及其趨勢穩定性。當ATR增大時,說明市場波動率高,市場上下跳動的幅度很大,止損位置可以相對設置遠一些,當ATR減少時,說明行情波動不大,這時候需要把止損位置設置得近一點,來鎖定利潤。所以用ATR指標比固定百分點位的移動止損在行情不斷變化的市場,其作用會好一些。

2.4)策略代碼

開倉之後用到 ATR 指標移動止損。當持有多倉,統計日高點,設置移動止損為日高點減去一定乘數的 ATR指標,通過賣出停止單離場;同理,當持有空倉,設置移動止損為日低點加上一定乘數的 ATR指標,通過買入停止單離場。

# 持有多頭倉位
elif self.pos > 0:
self.intraTradeHigh = max(self.intraTradeHigh, bar.high)
self.intraTradeLow = bar.low
self.longStop = self.intraTradeHigh - self.atrValue * self.slMultiplier

self.sell(self.longStop, abs(self.pos), True)

# 持有空頭倉位
elif self.pos < 0:
self.intraTradeHigh = bar.high
self.intraTradeLow = min(self.intraTradeLow, bar.low)
self.shortStop = self.intraTradeLow + self.atrValue * self.slMultiplier

self.cover(self.shortStop, abs(self.pos), True)

3 策略回測

年化收益30.56%,最大回撤-16.32%,夏普比率1.11。

4 滾動回測

1)參數優化設置

# 優化配置
setting = OptimizationSetting() # 新建一個優化任務設置對象
setting.setOptimizeTarget(sharpeRatio) # 設置優化排序的目標是夏普比率
setting.addParameter(bollWindow, 18, 30, 2)
setting.addParameter(bollDev, 3.2,4, 0.2)
setting.addParameter(cciWindow, 12, 16, 1)

# 執行多進程優化
import time
start = time.time()
resultList = engine.runParallelOptimization(BollChannelStrategy, setting)
print u耗時:%s %(time.time()-start)

2)滾動回測設置

以3年為滾動周期,步進是半年,對20100416--20180101區間進行滾動回測以及參數優化,並且收集表現最好的前3組優化參數。

在上表中發現,最後一個回測區間,即20150101--20180101,其優化參數發生劇烈變化,上一個回測區間20140601--20170601有非常大的不同,說明行情發生巨大變化。故對以上兩區間進行更加細緻的回測:以1年為滾動周期,步進是半年。回測效果如下表:

對近年優化參數選取眾數得bollDev=3.2, bollWindow=18,cciWindow=16

預測優化參數歷史表現:

年化收益25.65%,最大回撤-21.04%,夏普比率達0.91。

對2018年以後的預測效果:

年化收益23.35%,最大回撤-17.3%,夏普比率0.65,優化參數預測效果不佳。

推薦閱讀:

相关文章