您好,登錄后才能下訂單哦!
這篇文章給大家分享的是有關如何使用Python實現Dual Thrust 區間突破策略的內容。小編覺得挺實用的,因此分享給大家做個參考,一起跟隨小編過來看看吧。
Dual Thrust簡介
Dual Thrust策略屬于開盤區間突破策略,它以當天開盤價加減一定的范圍來確定一個上下軌道,當價格突破上軌時做多,價格突破下軌時做空。不過與其他突破策略相比有兩點不同:第一個是Dual Thrust策略在設置范圍的時候,引入的是前N個交易日的開高低收這四個價格,這使得在一定時期內范圍相對穩定,對于趨勢跟蹤策略來說是比較合理的。
第二個是Dual Thrust策略在多頭和空頭的觸發條件上,考慮了非對稱性,通過外部參數Ks和Kx,可以針對多頭和空頭選擇不同的周期,這一點比較符合期貨市場漲緩跌急的特點。當Ks小于Kx時,多頭相對容易被觸發,當Ks大于Kx時,空頭相對容易被觸發。這樣的好處是可以根據自己的交易經驗,動態地調整Ks和Kx的值。也可以根據歷史數據測試的最優參數來使用策略。
Dual Thrust上下軌
在Dual Thrust策略中,首先需要定義前N根K線的震蕩區間,然后震蕩區間乘以多頭和空頭系數計算出范圍,接著以開盤價加減這個范圍,形成上軌和下軌,最后根據價格與上下軌的相互位置關系開開平倉。
計算震蕩區間
計算震蕩區間首先需要獲取四個價格,它們分別是:前N根K線中最高價(hh)、最高收盤價(hc)、最低價(ll)、最低收盤價(lc)。然后獲取hh與lc的差和hc與ll的差,最后獲取這兩個差的最大值。公式為:
Range = Max(hh-lc,hc-ll)
計算范圍
在計算范圍的時候,需要用到兩個外部參數,分別是多頭系數Ks和空頭系數Kx,它們的值可以根據交易者的經驗自己設置。那么多頭的范圍就是Rang乘以Ks;空頭的范圍是Rang乘以Kx。公式為:
long_range = Range * Ks
short_range = Range * Kx
計算上軌下軌
有了多頭范圍和空頭范圍,就可以根據開盤價來計算上軌和下軌的值了,其中上軌的值是開盤價加上多頭范圍,下軌的值是開盤價減去空頭范圍。公式為:
up_line = open + long_rang
down_line = open - short_range
策略邏輯
做多:價格向上突破上軌
做空:價格向下突破下軌
與其他突破策略一樣,Dual Thrust策略也是根據價格與上下軌的相對位置關系來開平倉,當價格向上突破上軌時開多單;當價格向下突破下軌時開空單。另外,Dual Thrust策略沒有止損止盈機制,也沒有主動平倉機制。也就是說當持有多單時,如果價格向下突破下軌時直接反空為多;當持有空單時,如果價格向上突破上軌時直接反多為空。
策略編寫
第一步:編寫策略架構
還是我們熟悉的策略框架,包含一個main程序入口函數和一個onTick策略主函數,如下:
# 策略主函數 def onTick(): pass # 程序入口 def main(): while True: # 進入無限循環模式 onTick() # 執行策略主函數 Sleep(1000) # 休眠1秒
定義全局變量
之所以定義全局變量是因為,在程序重復執行onTick函數中,如果變量定義在onTick函數中,那么這個變量的值會隨著onTick的執行而改變。但有時候我們需要當達到某個條件的時候才改變這個變量,所以就需要我們把變量寫到onTick函數的外面。
mp = 0 # 用于控制虛擬持倉 last_bar_time = 0 # 用于判斷K線時間 up_line = 0 # 上軌 down_line = 0 # 下軌
計算上下軌
仔細看下面代碼中的注釋,首先一次性引入所有的全局變量,然后訂閱期貨品種并獲取K線數組,接著判斷一下K線數組的狀態是否符合我們的條件,如果沒問題就從K線數組中獲取最新的K線數據和最新的收盤價。
有了以上基礎數據,就可以計算上下軌的值了。首先是獲取四個價格:最高價、最高的收盤價、最低價、最低的收盤價,然后就可以計算范圍,最后根據范圍計算出上軌和下軌。大家可以根據以上的計算流程,熟悉下面的代碼。
global mp, last_bar_time, up_line, down_line # 引入全局變量 exchange.SetContractType(FuturesCode) # 訂閱期貨品種 bar_arr = exchange.GetRecords() # 獲取K線數組 if not bar_arr or len(bar_arr) < Cycle: return # 如果沒有獲取到K線數據或者K線數據太短就返回 last_bar = bar_arr[len(bar_arr) - 1] # 最新的K線 last_bar_close = last_bar['Close'] # 最新K線的收盤價 if last_bar_time != last_bar['Time']: # 如果產生了新的K線 hh = TA.Highest(bar_arr, Cycle, 'High') # 最高價 hc = TA.Highest(bar_arr, Cycle, 'Close') # 最高的收盤價 ll = TA.Lowest(bar_arr, Cycle, 'Low') # 最低價 lc = TA.Lowest(bar_arr, Cycle, 'Close') # 最低的收盤價 Range = max(hh - lc, hc - ll) # 計算范圍 up_line = _N(last_bar['Open'] + Ks * Range) # 計算上軌 down_line = _N(last_bar['Open'] - Kx * Range) # 計算下軌 last_bar_time = last_bar['Time'] # 更新最后時間戳
下單交易
下單交易很簡單,使用if語句判斷當前的持倉狀態和價格與上下軌的相互位置關系來開平倉。同樣的在下單交易之前也需要設置交易方向和類型,即:開多、開空、平多、平空。最后下單之后重置虛擬持倉的狀態。
if mp == 0 and last_bar_close >= up_line: exchange.SetDirection("buy") # 設置交易方向和類型 exchange.Buy(last_bar_close, 1) # 開多單 mp = 1 # 設置虛擬持倉的值,即有多單 if mp == 0 and last_bar_close <= down_line: exchange.SetDirection("sell") # 設置交易方向和類型 exchange.Sell(last_bar_close - 1, 1) # 開空單 mp = -1 # 設置虛擬持倉的值,即有空單 if mp == 1 and last_bar_close <= down_line: exchange.SetDirection("closebuy") # 設置交易方向和類型 exchange.Sell(last_bar_close - 1, 1) # 平多單 mp = 0 # 設置虛擬持倉的值,即空倉 if mp == -1 and last_bar_close >= up_line: exchange.SetDirection("closesell") # 設置交易方向和類型 exchange.Buy(last_bar_close, 1) # 平空單 mp = 0 # 設置虛擬持倉的值,即空倉
策略回測
測試環境
交易品種:螺紋鋼指數
時間:2015年02月22日~2019年12月06日
周期:一小時
滑點:開平倉各2跳
手續費:交易所2倍
績效報告
資金曲線
感謝各位的閱讀!關于“如何使用Python實現Dual Thrust 區間突破策略”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,讓大家可以學到更多知識,如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。