溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

如何使用Python實(shí)現(xiàn)Dual Thrust 區(qū)間突破策略

發(fā)布時(shí)間:2022-01-15 15:17:48 來源:億速云 閱讀:310 作者:小新 欄目:互聯(lián)網(wǎng)科技

這篇文章給大家分享的是有關(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

策略邏輯

如何使用Python實(shí)現(xiàn)Dual Thrust 區(qū)間突破策略

  • 做多:價(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倍
    如何使用Python實(shí)現(xiàn)Dual Thrust 區(qū)間突破策略
    績(jī)效報(bào)告
    如何使用Python實(shí)現(xiàn)Dual Thrust 區(qū)間突破策略
    資金曲線
    如何使用Python實(shí)現(xiàn)Dual Thrust 區(qū)間突破策略

感謝各位的閱讀!關(guān)于“如何使用Python實(shí)現(xiàn)Dual Thrust 區(qū)間突破策略”這篇文章就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,讓大家可以學(xué)到更多知識(shí),如果覺得文章不錯(cuò),可以把它分享出去讓更多的人看到吧!

向AI問一下細(xì)節(jié)

免責(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)容。

AI