如何利用平均趨向指數(shù)輔助MACD策略

如何利用平均趨向指數(shù)輔助MACD策略,相信很多沒有經(jīng)驗(yàn)的人對(duì)此束手無(wú)策,為此本文總結(jié)了問題出現(xiàn)的原因和解決方法,通過這篇文章希望你能解決這個(gè)問題。

成都創(chuàng)新互聯(lián)專業(yè)網(wǎng)站設(shè)計(jì)制作、成都網(wǎng)站制作,集網(wǎng)站策劃、網(wǎng)站設(shè)計(jì)、網(wǎng)站制作于一體,網(wǎng)站seo、網(wǎng)站優(yōu)化、網(wǎng)站營(yíng)銷、軟文發(fā)稿等專業(yè)人才根據(jù)搜索規(guī)律編程設(shè)計(jì),讓網(wǎng)站在運(yùn)行后,在搜索中有好的表現(xiàn),專業(yè)設(shè)計(jì)制作為您帶來(lái)效益的網(wǎng)站!讓網(wǎng)站建設(shè)為您創(chuàng)造效益。

前言

“趨勢(shì)是你的朋友”這是每一個(gè)交易者都耳熟能詳?shù)捏鹧?。但做過交易的朋友可能會(huì)有體會(huì),趨勢(shì)總是在毫無(wú)預(yù)警地開始并突然結(jié)束。那么在CTA策略中,如何抓住趨勢(shì)并過濾震蕩行情,是許多主觀和量化交易者孜孜不倦的追求。在本節(jié)課程中,我們將以平均趨向指數(shù)(ADX)為濾網(wǎng),分析在它量化交易中的應(yīng)用。

什么是平均趨向指數(shù)

平均趨向指數(shù)是衡量趨勢(shì)的技術(shù)工具,簡(jiǎn)稱ADX(average directional indicator),它是由韋爾斯·懷爾德在1978年提出,與其他技術(shù)分析工具不同的是,ADX并不能判斷多空方向,更不能提示精確的買賣點(diǎn)位,它只是衡量當(dāng)前趨勢(shì)的強(qiáng)弱。

如何利用平均趨向指數(shù)輔助MACD策略

ADX的默認(rèn)周期參數(shù)是14,通常在K線圖的副圖中顯示。它的值是在0~100之間,數(shù)值越大說明上漲或下跌趨勢(shì)越強(qiáng)力,通常當(dāng)ADX的值大于40時(shí),說明趨勢(shì)強(qiáng)力,此時(shí)使用趨勢(shì)交易才具有最大的回報(bào)潛力;當(dāng)ADX的值小于20時(shí),說明趨勢(shì)疲軟,并警告交易者不要使用趨勢(shì)跟蹤交易策略。

ADX的計(jì)算方式

ADX的計(jì)算方式比較復(fù)雜,它涉及到了:價(jià)格正向移動(dòng)距離(+DM)、價(jià)格負(fù)向移動(dòng)距離(-DM)、真是波動(dòng)幅度(TR)、正向方向性指數(shù)(+DI), 負(fù)向方向性指數(shù)(-DI)等很多中間變量:

計(jì)算動(dòng)向變化

  • up:今天的最高價(jià) – 昨天的最高價(jià)

  • down:昨天的最低價(jià) – 今天的最低價(jià)

  • +DM:如果up大于max(down, 0),則+DM等于up,否則等于零

  • -DM:如果down大于max(up, 0),則-DM等于down,否則等于零

計(jì)算真實(shí)波幅

  • TR:max(今天最高價(jià)與今天最低價(jià)的差值,今天最高價(jià)與昨天收盤價(jià)差值的絕對(duì)值,今天最低價(jià)與昨天收盤價(jià)差值的絕對(duì)值)

計(jì)算動(dòng)向指數(shù)

  • +DI(14):+DM(14)/TR(14)*100

  • -DI(14):-DM(14)/TR(14)*100

計(jì)算ADX

  • DX:((+DI14)- (-DI14)/(+DI14)+(-DI14))*100

  • ADX:MA(DX,14)

雖然ADX的計(jì)算比較復(fù)雜,但其邏輯還是比較清晰的:up和down分別代表了價(jià)格正向和負(fù)向移動(dòng)距離;+DI和-DI分別代表用波動(dòng)率修正后上漲和下跌趨勢(shì)。不管趨勢(shì)是上漲還是下跌,只要存在明顯的趨勢(shì)行情,那么+DI和-DI中總有一個(gè)是較大的,因此DX的值會(huì)隨著趨勢(shì)的強(qiáng)弱指示在0~100之間;最后ADX則是DX的14天平均線。

當(dāng)+ DI高于-DI時(shí),表明價(jià)格處于上升趨勢(shì)。 相反,當(dāng)-DI高于+ DI時(shí),價(jià)格處于下降趨勢(shì)。 交易者可以通過檢查同一時(shí)間點(diǎn)的ADX值來(lái)確定上升趨勢(shì)或下降趨勢(shì)的強(qiáng)度。

策略邏輯

在前幾節(jié)中,我們使用MACD指標(biāo)創(chuàng)建了一個(gè)簡(jiǎn)單的策略,雖然該策略在趨勢(shì)行情中表現(xiàn)還可以,但是在震蕩行情入不敷出,甚至在長(zhǎng)期的震蕩行情中資金回撤比較大。因此我們將在本節(jié)中將之前的MACD策略加入ADX濾網(wǎng),我們來(lái)看下效果到底如何?

原策略邏輯

  • 多頭開倉(cāng):DIF大于零軸

  • 空頭開倉(cāng):DIF小于零軸

  • 多頭平倉(cāng):DIF向下突破DEA

  • 空頭平倉(cāng):DIF向上突破DEA

改進(jìn)后的策略邏輯

  • 多頭開倉(cāng):DIF大于零軸,并且ADX大于20

  • 空頭開倉(cāng):DIF小于零軸,并且ADX大于20

  • 多頭平倉(cāng):DIF向下突破DEA,或者ADX下降

  • 空頭平倉(cāng):DIF向上突破DEA,或者ADX下降

我們?cè)谠呗赃壿嫽A(chǔ)之上,對(duì)開倉(cāng)和平倉(cāng)分別加入ADX濾網(wǎng),控制在行情進(jìn)入震蕩時(shí)期的開倉(cāng)次數(shù)。在開倉(cāng)的時(shí)候ADX的數(shù)值必須大于指定的數(shù)值;當(dāng)開倉(cāng)之后一旦ADX下降就平倉(cāng)出局。整個(gè)策略邏輯就設(shè)計(jì)成一個(gè)嚴(yán)進(jìn)寬出的模式,以此來(lái)控制震蕩時(shí)期的回撤幅度。

策略編寫

原始策略

# 回測(cè)配置
'''backtest
start: 2015-02-22 00:00:00
end: 2019-10-17 00:00:00
period: 1h
exchanges: [{"eid":"Futures_CTP","currency":"FUTURES"}]
'''


mp = 0  # 定義一個(gè)全局變量,用于控制虛擬持倉(cāng)


# 判斷數(shù)組是否上升
def is_up(arr):
    arr_len = len(arr)
    if arr[arr_len - 1] > arr[arr_len - 2] and arr[arr_len - 2] > arr[arr_len - 3]:
        return True     

    
# 判斷數(shù)組是否下降
def is_down(arr):
    arr_len = len(arr)
    if arr[arr_len - 1] < arr[arr_len - 2] and arr[arr_len - 2] < arr[arr_len - 3]:
        return True

    
# 判斷兩根兩個(gè)數(shù)組是否金叉
def is_up_cross(arr1, arr2):
    if arr1[len(arr1) - 2] < arr2[len(arr2) - 2] and arr1[len(arr1) - 1] > arr2[len(arr2) - 1]:
        return True

# 判斷兩根兩個(gè)數(shù)組是否死叉
def is_down_cross(arr1, arr2):
    if arr1[len(arr1) - 2] > arr2[len(arr2) - 2] and arr1[len(arr1) - 1] < arr2[len(arr2) - 1]:
        return True    

    
# 程序主函數(shù)
def onTick():
    exchange.SetContractType("rb000")  # 訂閱期貨品種
    bar_arr = exchange.GetRecords()  # 獲取K線數(shù)組
    if len(bar_arr) < long + m + 1:  # 如果K線數(shù)組長(zhǎng)度太小,就不能計(jì)算MACD,所以直接返回跳過
        return
    all_macd = TA.MACD(bar_arr, short, long, m)  # 計(jì)算MACD值,返回的是一個(gè)二維數(shù)組
    dif = all_macd[0]  # 獲取DIF的值,返回一個(gè)數(shù)組
    dif.pop()  # 刪除DIF數(shù)組最后一個(gè)元素
    dea = all_macd[1]  # 獲取DEA的值,返回一個(gè)數(shù)組
    dea.pop()  # 刪除DEA數(shù)組最后一個(gè)元素
    last_close = bar_arr[len(bar_arr) - 1]['Close']  # 獲取最新價(jià)格(賣價(jià)),用于開平倉(cāng)
    global mp  # 全局變量,用于控制虛擬持倉(cāng)
    
    # 開多單
    if mp == 0 and dif[len(dif) - 1] > 0:
        exchange.SetDirection("buy")  # 設(shè)置交易方向和類型
        exchange.Buy(last_close, 1)  # 開多單
        mp = 1  # 設(shè)置虛擬持倉(cāng)的值,即有多單
    
    # 開空單
    if mp == 0 and dif[len(dif) - 1] < 0:
        exchange.SetDirection("sell")  # 設(shè)置交易方向和類型
        exchange.Sell(last_close - 1, 1)  # 開空單
        mp = -1  # 設(shè)置虛擬持倉(cāng)的值,即有空單
        
    # 平多單
    if mp == 1 and is_down_cross(dif, dea):
        exchange.SetDirection("closebuy")  # 設(shè)置交易方向和類型
        exchange.Sell(last_close - 1, 1)  # 平多單
        mp = 0  # 設(shè)置虛擬持倉(cāng)的值,即空倉(cāng)
    
    # 平空單
    if mp == -1 and is_up_cross(dif, dea):
        exchange.SetDirection("closesell")  # 設(shè)置交易方向和類型
        exchange.Buy(last_close, 1)  # 平空單
        mp = 0  # 設(shè)置虛擬持倉(cāng)的值,即空倉(cāng)

        
def main():
    while True:
        onTick()
        Sleep(1000)

根據(jù)上面更改的策略邏輯,我們可以直接在原始策略的基礎(chǔ)之上把ADX濾網(wǎng)加入進(jìn)去,雖然ADX的計(jì)算方法比較復(fù)雜,但可以借助talib庫(kù)只需要幾行代碼就可以把ADX的值計(jì)算出來(lái)。因?yàn)橛?jì)算ADX需要用帶talib,而計(jì)算talib庫(kù)又需要用到numpy.array數(shù)據(jù)類型,所以我們需要在代碼開頭導(dǎo)入talib庫(kù)和numpy庫(kù)。

import talib
import numpy as np

在使用talib庫(kù)計(jì)算ADX的時(shí)候,一共需要4個(gè)參數(shù):最高價(jià)、最低價(jià)、收盤價(jià)、周期參數(shù)。所以我們還需要寫一個(gè)get_data函數(shù),這個(gè)函數(shù)的目的是從K線數(shù)組中提取出最高價(jià)、最低價(jià)、收盤價(jià)。

# 把K線數(shù)組轉(zhuǎn)換成最高價(jià)、最低價(jià)、收盤價(jià)數(shù)組,用于轉(zhuǎn)換為numpy.array類型數(shù)據(jù)
def get_data(bars):
    arr = [[], [], []]
    for i in bars:
        arr[0].append(i['High'])
        arr[1].append(i['Low'])
        arr[2].append(i['Close'])
    return arr

然后我們使用numpy庫(kù)把普通的數(shù)組轉(zhuǎn)換為numpy.array類型數(shù)據(jù),最后使用talib庫(kù)就可以計(jì)算出ADX的值,具體的寫法可以看下面代碼中的注釋:

np_arr = np.array(get_data(bar_arr)) # 把列表轉(zhuǎn)換為numpy.array類型數(shù)據(jù),用于計(jì)算ADX的值
adx = talib.ADX(np_arr[0], np_arr[1], np_arr[2], 20);  # 計(jì)算ADX的值

在策略邏輯中,需要判斷ADX的大小和是否上升下降。判斷大小很簡(jiǎn)單,只需要把ADX具體某一天的值提取出來(lái)就可以了,跟判斷MACD一樣,我們只取倒數(shù)第二根K線的ADX值;但判斷時(shí)候上升下降則需要只取倒數(shù)第二根和第三根K線的ADX值。

adx1 = adx_arr[len(adx_arr) - 2]  # 倒數(shù)第二根K線的ADX值
adx2 = adx_arr[len(adx_arr) - 3]  # 倒數(shù)第三根K線的ADX值

最后修改下單邏輯:

# 開多單
if mp == 0 and dif[len(dif) - 1] > 0 and adx1 > 40:
    exchange.SetDirection("buy")  # 設(shè)置交易方向和類型
    exchange.Buy(last_close, 1)  # 開多單
    mp = 1  # 設(shè)置虛擬持倉(cāng)的值,即有多單

# 開空單
if mp == 0 and dif[len(dif) - 1] < 0 and adx1 > 40:
    exchange.SetDirection("sell")  # 設(shè)置交易方向和類型
    exchange.Sell(last_close - 1, 1)  # 開空單
    mp = -1  # 設(shè)置虛擬持倉(cāng)的值,即有空單
    
# 平多單
if mp == 1 and (is_down_cross(dif, dea) or adx1 < adx2):
    exchange.SetDirection("closebuy")  # 設(shè)置交易方向和類型
    exchange.Sell(last_close - 1, 1)  # 平多單
    mp = 0  # 設(shè)置虛擬持倉(cāng)的值,即空倉(cāng)

# 平空單
if mp == -1 and (is_up_cross(dif, dea) or adx1 < adx2):
    exchange.SetDirection("closesell")  # 設(shè)置交易方向和類型
    exchange.Buy(last_close, 1)  # 平空單
    mp = 0  # 設(shè)置虛擬持倉(cāng)的值,即空倉(cāng)

完整策略代碼

# 回測(cè)配置
'''backtest
start: 2015-02-22 00:00:00
end: 2019-10-17 00:00:00
period: 1h
exchanges: [{"eid":"Futures_CTP","currency":"FUTURES"}]
'''

# 導(dǎo)入庫(kù)
import talib
import numpy as np


mp = 0  # 定義一個(gè)全局變量,用于控制虛擬持倉(cāng)


# 把K線數(shù)組轉(zhuǎn)換成最高價(jià)、最低價(jià)、收盤價(jià)數(shù)組,用于轉(zhuǎn)換為numpy.array類型數(shù)據(jù)
def get_data(bars):
    arr = [[], [], []]
    for i in bars:
        arr[0].append(i['High'])
        arr[1].append(i['Low'])
        arr[2].append(i['Close'])
    return arr


# 判斷兩根兩個(gè)數(shù)組是否金叉
def is_up_cross(arr1, arr2):
    if arr1[len(arr1) - 2] < arr2[len(arr2) - 2] and arr1[len(arr1) - 1] > arr2[len(arr2) - 1]:
        return True

# 判斷兩根兩個(gè)數(shù)組是否死叉
def is_down_cross(arr1, arr2):
    if arr1[len(arr1) - 2] > arr2[len(arr2) - 2] and arr1[len(arr1) - 1] < arr2[len(arr2) - 1]:
        return True    

    
# 程序主函數(shù)
def onTick():
    exchange.SetContractType("rb000")  # 訂閱期貨品種
    bar_arr = exchange.GetRecords()  # 獲取K線數(shù)組
    if len(bar_arr) < long + m + 1:  # 如果K線數(shù)組長(zhǎng)度太小,就不能計(jì)算MACD,所以直接返回跳過
        return
    all_macd = TA.MACD(bar_arr, short, long, m)  # 計(jì)算MACD值,返回的是一個(gè)二維數(shù)組
    dif = all_macd[0]  # 獲取DIF的值,返回一個(gè)數(shù)組
    dif.pop()  # 刪除DIF數(shù)組最后一個(gè)元素
    dea = all_macd[1]  # 獲取DEA的值,返回一個(gè)數(shù)組
    dea.pop()  # 刪除DEA數(shù)組最后一個(gè)元素
    
    np_arr = np.array(get_data(bar_arr)) # 把列表轉(zhuǎn)換為numpy.array類型數(shù)據(jù),用于計(jì)算ADX的值
    adx_arr = talib.ADX(np_arr[0], np_arr[1], np_arr[2], 20);  # 計(jì)算ADX的值
    adx1 = adx_arr[len(adx_arr) - 2]  # 倒數(shù)第二根K線的ADX值
    adx2 = adx_arr[len(adx_arr) - 3]  # 倒數(shù)第三根K線的ADX值
    
    last_close = bar_arr[len(bar_arr) - 1]['Close']  # 獲取最新價(jià)格(賣價(jià)),用于開平倉(cāng)
    global mp  # 全局變量,用于控制虛擬持倉(cāng)
    
    # 開多單
    if mp == 0 and dif[len(dif) - 1] > 0 and adx1 > 40:
        exchange.SetDirection("buy")  # 設(shè)置交易方向和類型
        exchange.Buy(last_close, 1)  # 開多單
        mp = 1  # 設(shè)置虛擬持倉(cāng)的值,即有多單
    
    # 開空單
    if mp == 0 and dif[len(dif) - 1] < 0 and adx1 > 40:
        exchange.SetDirection("sell")  # 設(shè)置交易方向和類型
        exchange.Sell(last_close - 1, 1)  # 開空單
        mp = -1  # 設(shè)置虛擬持倉(cāng)的值,即有空單
        
    # 平多單
    if mp == 1 and (is_down_cross(dif, dea) or adx1 < adx2):
        exchange.SetDirection("closebuy")  # 設(shè)置交易方向和類型
        exchange.Sell(last_close - 1, 1)  # 平多單
        mp = 0  # 設(shè)置虛擬持倉(cāng)的值,即空倉(cāng)
    
    # 平空單
    if mp == -1 and (is_up_cross(dif, dea) or adx1 < adx2):
        exchange.SetDirection("closesell")  # 設(shè)置交易方向和類型
        exchange.Buy(last_close, 1)  # 平空單
        mp = 0  # 設(shè)置虛擬持倉(cāng)的值,即空倉(cāng)

        
def main():
    while True:
        onTick()
        Sleep(1000)

以上貼出本節(jié)已經(jīng)改進(jìn)過的策略完整源代碼,或者你也可以到 https://www.fmz.com/strategy/174672 發(fā)明者量化官網(wǎng)的策略中復(fù)制下載,無(wú)需配置直接在線回測(cè)。

看完上述內(nèi)容,你們掌握如何利用平均趨向指數(shù)輔助MACD策略的方法了嗎?如果還想學(xué)到更多技能或想了解更多相關(guān)內(nèi)容,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝各位的閱讀!

當(dāng)前題目:如何利用平均趨向指數(shù)輔助MACD策略
標(biāo)題路徑:http://muchs.cn/article40/picoho.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供全網(wǎng)營(yíng)銷推廣外貿(mào)建站、移動(dòng)網(wǎng)站建設(shè)、小程序開發(fā)企業(yè)建站、網(wǎng)站策劃

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

小程序開發(fā)