商品期貨R-Breaker策略

一、摘要

R-Breaker策略由Richard Saidenberg開發,並於1994年公佈於世。在之後連續十五年被美國《Futures Truth》雜誌評選爲前十大最賺錢的交易策略之一。與其他策略相比,R-Breaker是趨勢與反轉相結合的交易策略。不僅可以捕捉趨勢行情獲得大利潤,還可以在行情反轉的時候,及時主動止盈並順勢反手。

二、阻力位與支撐位

簡單的說,R-Breaker策略就是一個支撐位和阻力位策略,它根據昨日的最高價、最低價和收盤價,計算出七個價格:一箇中心價(pivot)、三個支撐位(s1、s2、s3)、三個阻力位(r1、r2、r3)。然後根據當前價格與這些支撐位和阻力位的位置關係,以形成買賣的觸發條件,並且通過一定的算法調整,調節這七個價格之間的距離,進一步改變交易的觸發值。

  • 突破買入價(阻力位r3) = 昨日最高價 + 2 *(中心價 - 昨日最低價)2
  • 觀察賣出價(阻力位r2) = 中心價 +(昨日最高價-昨日最低價)
  • 反轉賣出價(阻力位r1) = 2 * 中心價 - 昨日最低價
  • 中心價(pivot) =(昨日最高價 + 昨日收盤價 + 昨日最低價)/ 3
  • 反轉買入價(支撐位s1) = 2 * 中心價 - 昨日最高價
  • 觀察買入價(支撐位s2) = 中心價 -(昨日最高價 - 昨日最低價)
  • 突破賣出價(支撐位s3) = 昨日最低價 - 2 *(昨日最高價 - 中心價)

由此我們可以看到,R-Breaker策略是根據昨天的價格繪製了一個類似網格的價格線,並且每天更新一次這些價格線。在技術分析上支撐位和阻力位,並且兩者的作用可以互相轉換。當價格成功向上突破阻力位時,阻力位變成了支撐位;當價格成功向下突破支撐位時,支撐位變成了阻力位。

在實際交易中,這些支撐位和阻力位爲交易者指出了開平倉方向和精確等買賣點位。具體的開平倉條件交易者可以根據盤中價格、中心價、阻力位、支撐位靈活定製,也可以根據這些網格價格線進行加減倉的頭寸管理。

三、策略邏輯

接下來,讓我們看一下R-Breaker策略是怎樣利用這些支撐位和阻力位的。它邏輯一點也不復雜。如果當前沒有持倉就進入趨勢模式,當價格大於突破買入價就開倉做多;當價格小於突破賣出價就開倉做空。

  • 趨勢模式
    • 多頭開倉:如果無持倉,並且價格大於突破買入價
    • 空頭開倉:如果無持倉,並且價格小於突破賣出價
    • 多頭平倉:如果持多單,並且當日最高價大於觀察賣出價,並且價格小於反轉賣出價
    • 空頭平倉:如果持空單,並且當日最低價小於觀察買入價,並且價格大於反轉買入價
  • 反轉模式
    • 多頭開倉:如果持空單,並且當日最低價小於觀察買入價,並且價格大於反轉買入價
    • 空頭開倉:如果持多單,並且當日最高價大於觀察賣出價,並且價格小於反轉賣出價
    • 多頭平倉:如果持多單,並且價格小於突破賣出價
    • 空頭平倉:如果持空單,並且價格大於突破買入價

如果有持倉時就進入反轉模式,當持有多單時,並且當日最高價大於觀察賣出價,並且價格跌破反轉賣出價就平掉多頭持倉反手做空。當持有空單時,並當日最低價小於觀察買入價,並且價格突破反轉買入價就平掉空頭持倉反手做多。

四、策略編寫

'''backtest
start: 2019-01-01 00:00:00
end: 2020-01-01 00:00:00
period: 5m
exchanges: [{"eid":"Futures_CTP","currency":"FUTURES"}]
'''

# 策略主函數
def onTick():
    # 獲取數據
    exchange.SetContractType(contract_type)   # 訂閱期貨品種
    bars_arr =exchange.GetRecords(PERIOD_D1)  # 獲取日K線數組
    if len(bars_arr) < 2:  # 如果K線數量小於2根
        return
    yesterday_open = bars_arr[-2]['Open']     # 昨日開盤價
    yesterday_high = bars_arr[-2]['High']     # 昨日最高價
    yesterday_low = bars_arr[-2]['Low']       # 昨日最低價
    yesterday_close = bars_arr[-2]['Close']   # 昨日收盤價

    # 計算
    pivot = (yesterday_high + yesterday_close + yesterday_low) / 3 # 樞軸點
    r1 = 2 * pivot - yesterday_low # 阻力位1
    r2 = pivot + (yesterday_high - yesterday_low) # 阻力位2
    r3 = yesterday_high + 2 * (pivot - yesterday_low) # 阻力位3
    s1 = 2 * pivot - yesterday_high  # 支撐位1
    s2 = pivot - (yesterday_high - yesterday_low)  # 支撐位2
    s3 = yesterday_low - 2 * (yesterday_high - pivot)  # 支撐位3

    today_high = bars_arr[-1]['High'] # 今日最高價
    today_low = bars_arr[-1]['Low'] # 今日最低價
    current_price = _C(exchange.GetTicker).Last #當前價格

    # 獲取持倉
    position_arr = _C(exchange.GetPosition)  # 獲取持倉數組
    if len(position_arr) > 0:  # 如果持倉數組長度大於0
        for i in position_arr:
            if i['ContractType'] == contract_type:  # 如果持倉品種等於訂閱品種
                if i['Type'] % 2 == 0:  # 如果是多單
                    position = i['Amount']  # 賦值持倉數量爲正數
                else:
                    position = -i['Amount']  # 賦值持倉數量爲負數
                profit = i['Profit']  # 獲取持倉盈虧
    else:
        position = 0  # 賦值持倉數量爲0
        profit = 0  # 賦值持倉盈虧爲0
        
    if position == 0:  # 如果無持倉
        if current_price > r3:  # 如果當前價格大於阻力位3
            exchange.SetDirection("buy")  # 設置交易方向和類型
            exchange.Buy(current_price + 1, 1)  # 開多單
        if current_price < s3:  # 如果當前價格小於支撐位3
            exchange.SetDirection("sell")  # 設置交易方向和類型
            exchange.Sell(current_price - 1, 1)  # 開空單
        
    if position > 0:  # 如果持有多單
        if today_high > r2 and current_price < r1 or current_price < s3:  # 如果今日最高價大於阻力位2,並且當前價格小於阻力位1
            exchange.SetDirection("closebuy")  # 設置交易方向和類型
            exchange.Sell(current_price - 1, 1)  # 平多單
            exchange.SetDirection("sell")  # 設置交易方向和類型
            exchange.Sell(current_price - 1, 1)  # 反手開空單

    if position < 0:  # 如果持有空單
        if today_low < s2 and current_price > s1 or current_price > r3:  # 如果今日最低價小於支撐位2,並且當前價格大於支撐位1
            exchange.SetDirection("closesell")  # 設置交易方向和類型
            exchange.Buy(current_price + 1, 1)  # 平空單
            exchange.SetDirection("buy")  # 設置交易方向和類型
            exchange.Buy(current_price + 1, 1)  # 反手開多單

            
# 程序主函數
def main():
    while True:     # 循環
        onTick()    # 執行策略主函數
        Sleep(1000) # 休眠1秒
        

五、複製完整策略

完整策略已經發布到發明者量化(FMZ.COM)中,點擊下面鏈接直接複製,無需配置即可回測:
https://www.fmz.com/strategy/187009

六、總結

R-Breaker策略之所以流行,關鍵在於它並不是純粹到趨勢跟蹤類策略,而是以複合型策略同時賺取趨勢的alpha和反轉的alpha收益。本文的策略只是作爲演示,沒有優化合適的參數和品種,另外完整的策略也必須包含止損功能,感興趣的朋友可以加以改進。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章