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