【指標(biāo)研究】MACD日、周、月以及分鐘級別研究

MACD簡介

MACD(Moving Average Convergence and Divergence)是Geral Appel 于1979年提出的,利用收盤價的短期(常用為12日)指數(shù)移動平均線與長期(常用為26日)指數(shù)移動平均線之間的聚合與分離狀況,對買進(jìn)、賣出時機(jī)作出研判的技術(shù)指標(biāo)。

如下圖:

MACD指標(biāo)的原理

MACD指標(biāo)是根據(jù)均線的構(gòu)造原理,對股票價格的收盤價進(jìn)行平滑處理,求出算術(shù)平均值以后再進(jìn)行計算,是一種趨向類指標(biāo)。

MACD指標(biāo)是運用快速(短期)和慢速(長期)移動平均線及其聚合與分離的征兆,加以雙重平滑運算。而根據(jù)移動平均線原理發(fā)展出來的MACD,一則去除了移動平均線頻繁發(fā)出假信號的缺陷,二則保留了移動平均線的效果,因此,MACD指標(biāo)具有均線趨勢性、穩(wěn)重性、安定性等特點,是用來研判買賣股票的時機(jī),預(yù)測股票價格漲跌的技術(shù)分析指標(biāo) 。

MACD指標(biāo)主要是通過EMA、DIF和DEA(或叫MACD、DEM)這三值之間關(guān)系的研判,DIF和DEA連接起來的移動平均線的研判以及DIF減去 DEM值而繪制成的柱狀圖(BAR)的研判等來分析判斷行情,預(yù)測股價中短期趨勢的主要的股市技術(shù)分析指標(biāo)。其中,DIF是核心,DEA是輔助。DIF是快速平滑移動平均線(EMA1)和慢速平滑移動平均線(EMA2)的差。BAR柱狀圖在股市技術(shù)軟件上是用紅柱和綠柱的收縮來研判行情。

MACD指標(biāo)的計算方法

MACD 是根據(jù)移動平均線較易掌握趨勢變動的方向之優(yōu)點所發(fā)展出來的,它是利用二條不同速度(一條變動的速率快──短期的移動平均線,另一條較慢──長期的移動平 均線)的指數(shù)平滑移動平均線來計算二者之間的差離狀況(DIF)作為研判行情的基礎(chǔ),然后再求取其DIF之9日平滑移動平均線(MACD)記Signal。MACD實際就是運用快速與慢速移動平均線聚合與分離的征兆,來研判買進(jìn)與賣進(jìn)的時機(jī)和訊號。

計算方法

  1. 計算平滑系數(shù)

MACD一個最大的長處,即在于其指標(biāo)的平滑移動,特別是對一某些劇烈波動的市場,這種平滑移動的特性能夠?qū)r格波動作較和緩的描繪,從而大為提高資料的實用性。不過,在計算EMA前,首先必須求得平滑系數(shù)。所謂的系數(shù),則是移動平均周期之單位數(shù),如幾天,幾周等等。其公式如下:
平滑系數(shù)=2÷(周期單位數(shù)+1 )
如12日EMA的平滑系數(shù)=2÷(12+1)=0.1538;
26日EMA平滑系數(shù)為=2÷27=0.0741

  1. 計算指數(shù)平均值(EMA)

一旦求得平滑系數(shù)后,即可用于EMA之運算,公式如下:
今天的指數(shù)平均值=平滑系數(shù)×(今天收盤指數(shù)-昨天的指數(shù)平均值)+昨天的指數(shù)平均值。

依公式可計算出12日EMA
12日EMA=2÷13×(今天收盤指數(shù)一昨天的指數(shù)平均值)+昨天的指數(shù)平均值=(2÷13)×今天收盤指數(shù)+(11÷13)×昨天的指數(shù)平均值。

同理,26日EMA亦可計算出:
26日EMA=(2÷27)×今天收盤指數(shù)+(25÷27)×昨天的指數(shù)平均值。

由于每日行情震蕩波動之大小不同,并不適合以每日之收盤價來計算移動平均值,于是有需求指數(shù)(Demand Index)之產(chǎn)生,乃輕需求指數(shù)代表每日的收盤指數(shù)。計算時,都分別加重最近一日的份量權(quán)數(shù)(兩倍),即對較近的資料賦予較大的權(quán)值,其計算方法如下:
DI=(C×2+H+L)÷4

其中,C為收盤價,H為最高價,L為最低價。
所以,上列公式中之今天收盤指數(shù),可以需求指數(shù)來替代。

  1. 計算指數(shù)平均的初值

當(dāng)開始要對指數(shù)平均值,作持續(xù)性的記錄時,可以將第一天的收盤價或需求指數(shù)當(dāng)作指數(shù)平均的初值。若要更精確一些,則可把最近幾天的收盤價或需求指數(shù)平均,以其平均價位作為初值。此外。亦可依其所選定的周期單位數(shù),來做為計算平均值的基期數(shù)據(jù)。

MACD指標(biāo)的一般研判標(biāo)準(zhǔn)

MACD指標(biāo)是市場上絕大多數(shù)投資者熟知的分析工具,但在具體運用時,投資者可能會覺得MACD指標(biāo)的運用的準(zhǔn)確性、實效性、可操作性上有很多茫然的地方,有時會發(fā)現(xiàn)用從書上學(xué)來的MACD指標(biāo)的分析方法和技巧去研判股票走勢,所得出的結(jié)論往往和實際走勢存在著特別大的差異,甚至?xí)贸鱿喾吹慕Y(jié)果。這其中的主要原因是市場上絕大多數(shù)論述股市技術(shù)分析的書中關(guān)于MACD的論述只局限在表面的層次,只介紹MACD的一般分析原理和方法,而對MACD分析指標(biāo)的一些特定的內(nèi)涵和分析技巧的介紹鮮有涉及。

MACD指標(biāo)的一般研判標(biāo)準(zhǔn)主要是圍繞快速和慢速兩條均線及紅、綠柱線狀況和它們的形態(tài)展開。一般分析方法主要包括DIF指標(biāo)和MACD值及它們所處的位置、DIF和MACD的交叉情況、紅柱狀的收縮情況和MACD圖形的形態(tài)這四個大的方面分析。

  1. DIF和MACD的值及線的位置

    1. 當(dāng)DIF和MACD均大于0(即在圖形上表示為它們處于零線以上)并向上移動時,一般表示為股市處于多頭行情中,可以買入或持股;

    2. 當(dāng)DIF和MACD均小于0(即在圖形上表示為它們處于零線以下)并向下移動時,一般表示為股市處于空頭行情中,可以賣出股票或觀望。

    3. 當(dāng)DIF和MACD均大于0(即在圖形上表示為它們處于零線以上)但都向下移動時,一般表示為股票行情處于退潮階段,股票將下跌,可以賣出股票和觀望;

    4. 當(dāng)DIF和MACD均小于0時(即在圖形上表示為它們處于零線以下)但向上移動時,一般表示為行情即將啟動,股票將上漲,可以買進(jìn)股票或持股待漲。

  2. DIF和MACD的交叉情況

    1. 當(dāng)DIF與MACD都在零線以上,而DIF向上突破MACD時,表明股市處于一種強(qiáng)勢之中,股價將再次上漲,可以加碼買進(jìn)股票或持股待漲,這就是MACD指標(biāo)“黃金交叉”的一種形式。

    2. 當(dāng)DIF和MACD都在零線以下,而DIF向上突破MACD時,表明股市即將轉(zhuǎn)強(qiáng),股價跌勢已盡將止跌朝上,可以開始買進(jìn)股票或持股,這是MACD指標(biāo)“黃金交叉”的另一種形式。

    3. 當(dāng)DIF與MACD都在零線以上,而DIF卻向下突破MACD時,表明股市即將由強(qiáng)勢轉(zhuǎn)為弱勢,股價將大跌,這時應(yīng)賣出大部分股票而不能買股票,這就是MACD指標(biāo)的“死亡交叉”的一種形式。

    4. 當(dāng)DIF和MACD都在零線以上,而DIF向下突破MACD時,表明股市將再次進(jìn)入極度弱市中,股價還將下跌,可以再賣出股票或觀望,這是MACD指標(biāo)“死亡交叉”的另一種形式。

  3. MACD指標(biāo)中的柱狀圖分析

    1. 當(dāng)紅柱狀持續(xù)放大時,表明股市處于牛市行情中,股價將繼續(xù)上漲,這時應(yīng)持股待漲或短線買入股票,直到紅柱無法再放大時才考慮賣出。

    2. 當(dāng)綠柱狀持續(xù)放大時,表明股市處于熊市行情之中,股價將繼續(xù)下跌,這時應(yīng)持幣觀望或賣出股票,直到綠柱開始縮小時才可以考慮少量買入股票。

    3. 當(dāng)紅柱狀開始縮小時,表明股市牛市即將結(jié)束(或要進(jìn)入調(diào)整期),股價將大幅下跌,這時應(yīng)賣出大部分股票而不能買入股票。

    4. 當(dāng)綠柱狀開始收縮時,表明股市的大跌行情即將結(jié)束,股價將止跌向上(或進(jìn)入盤整),這時可以少量進(jìn)行長期戰(zhàn)略建倉而不要輕易賣出股票。

    5. 當(dāng)紅柱開始消失、綠柱開始放出時,這是股市轉(zhuǎn)市信號之一,表明股市的上漲行情(或高位盤整行情)即將結(jié)束,股價將開始加速下跌,這時應(yīng)開始賣出大部分股票而不能買入股票。

    6. 當(dāng)綠柱開始消失、紅柱開始放出時,這也是股市轉(zhuǎn)市信號之一,表明股市的下跌行情(或低位盤整)已經(jīng)結(jié)束,股價將開始加速上升,這時應(yīng)開始加碼買入股票或持股待漲。

先說一下寫代碼的思路

  • 需要使用talib模塊中的MACDEXT函數(shù)返回macd對應(yīng)的dif, dea, macd信息,封裝好的方法為MACD(close, fastperiod, slowperiod, signalperiod)
  • 調(diào)用的標(biāo)的是經(jīng)常變化的,時間周期也是變化的,所以將對應(yīng)標(biāo)的信息的代碼單獨封裝,封裝好的方法為get_macd(stock, count, end_date, unit)
  • 為了查看macd的信息,將其圖例化將是再好不過的,所謂一圖勝萬字,封裝的方法為show_macd(macd_list)
  • 另外,使用macd信息的時候,最關(guān)心的點是dif與dea金叉死叉情況,這里也給出了方法,并與直接在圖例上進(jìn)行展示,封裝的方法為show_cross(macd_list)

導(dǎo)入必要的模塊

from jqdata import *
import talib as tl
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import datetime

封裝公用函數(shù)

# MACD 公用函數(shù)
def MACD(close, fastperiod, slowperiod, signalperiod):
    macdDIFF, macdDEA, macd = tl.MACDEXT(close, fastperiod=fastperiod, fastmatype=1, slowperiod=slowperiod, slowmatype=1, signalperiod=signalperiod, signalmatype=1)
    macd = macd * 2
    return macdDIFF, macdDEA, macd 

# 查尋一個時間段內(nèi)某標(biāo)的的macd信息
def get_macd(stock, count, end_date, unit):
    data = get_bars(security=stock, count=count, unit=unit,
                        include_now=False, 
                        end_dt=end_date, fq_ref_date=None)
    close = data['close']
    open = data['open']
    high = data['high']
    low = data['low']

    return MACD(close, 12, 26, 9)

# 將macd信息圖例化
def show_macd(macd_list):
    macdDIFF, macdDEA, macd = macd_list
    plt.rcParams['font.sans-serif']=['SimHei']  # 用來正常顯示中文標(biāo)簽  
    plt.rcParams['axes.unicode_minus']=False  # 用來正常顯示負(fù)號

    plt.figure(figsize=(20, 5))
    plt.title('MACD 金叉死叉示例圖')
    plt.plot(macdDEA)
    plt.plot(macdDIFF)
    
    for i in range(0, len(macd)):
        plt.bar(i, macd[i], color='r' if macd[i] > 0 else 'g')
        
    plt.legend(['DEA', 'DIF'], loc=2)
    plt.show()

# 將macd的金叉與死叉
def show_cross(macd_list):
    macdDIFF, macdDEA, macd = macd_list
    plt.rcParams['font.sans-serif']=['SimHei']  # 用來正常顯示中文標(biāo)簽  
    plt.rcParams['axes.unicode_minus']=False  # 用來正常顯示負(fù)號

    plt.figure(figsize=(20, 5))
    plt.title('MACD 金叉死叉示例圖')
    plt.plot(macdDEA)
    plt.plot(macdDIFF)
    
    for i in range(0, len(macd)):
        plt.bar(i, macd[i], color='r' if macd[i] > 0 else 'g')
        
    for i in range(4, len(macd)):
        if macdDIFF[i-1] < macdDEA[i-1] and macdDIFF[i] > macdDEA[i]:
            # 用紅圈標(biāo)出金叉
            plt.scatter(i, macdDEA[i], color='', marker='o', edgecolors='r', s=500, linewidths=3)
        elif macdDIFF[i-1] > macdDEA[i-1] and macdDIFF[i] < macdDEA[i]:
            # 用綠圈標(biāo)出死叉
            plt.scatter(i, macdDEA[i], color='', marker='o', edgecolors='g', s=500, linewidths=3)
            
    plt.legend(['DEA', 'DIF'], loc=2)
    plt.show()
    
# 將macd的0軸下的二次金叉顯示出來
def show_two_low_cross(macd_list):
    macdDIFF, macdDEA, macd = macd_list
    plt.rcParams['font.sans-serif']=['SimHei']  # 用來正常顯示中文標(biāo)簽  
    plt.rcParams['axes.unicode_minus']=False  # 用來正常顯示負(fù)號

    plt.figure(figsize=(20, 5))
    plt.title('MACD 金叉死叉示例圖')
    plt.plot(macdDEA)
    plt.plot(macdDIFF)
    
    for i in range(0, len(macd)):
        plt.bar(i, macd[i], color='r' if macd[i] > 0 else 'g')
    
    cross_list = []
    for i in range(4, len(macd)):
        if macdDIFF[i-1] < macdDEA[i-1] and macdDIFF[i] > macdDEA[i]:
            gold_cross = {'id':i,
                          'name':'gold_cross',
                          'dif':macdDIFF[i],
                          'dea':macdDEA[i]}
            cross_list.append(gold_cross)
        elif macdDIFF[i-1] > macdDEA[i-1] and macdDIFF[i] < macdDEA[i]:
            death_cross = {'id':i,
                          'name':'death_cross',
                          'dif':macdDIFF[i],
                          'dea':macdDEA[i]}
            cross_list.append(death_cross)
            
    df = pd.DataFrame(cross_list, columns=['id', 'name', 'dif', 'dea']).sort_values(by="id",ascending=False)  
    for index in df.index:
        if index < 3:
            break
        if df.loc[index]['name']=='gold_cross' and df.loc[index]['dif']<0:
            if df.loc[index-1]['name']=='death_cross' and df.loc[index-1]['dif']<0:
                if df.loc[index-2]['name']=='gold_cross' and df.loc[index-2]['dif']<0:
                    if df.loc[index-3]['name']=='death_cross' and df.loc[index-3]['dif']>0:
                        plt.scatter(df.loc[index-2]['id'], df.loc[index-2]['dea'], color='', marker='o', edgecolors='r', s=500, linewidths=3)
                        plt.scatter(df.loc[index]['id'], df.loc[index]['dea'], color='', marker='o', edgecolors='r', s=500, linewidths=3)  
    
    plt.legend(['DEA', 'DIF'], loc=2)
    plt.show()
    
# 將macd的0軸下多次金叉顯示出來
def show_low_cross(macd_list):
    macdDIFF, macdDEA, macd = macd_list
    plt.rcParams['font.sans-serif']=['SimHei']  # 用來正常顯示中文標(biāo)簽  
    plt.rcParams['axes.unicode_minus']=False  # 用來正常顯示負(fù)號

    plt.figure(figsize=(20, 5))
    plt.title('MACD 金叉死叉示例圖')
    plt.plot(macdDEA)
    plt.plot(macdDIFF)
    
    for i in range(0, len(macd)):
        plt.bar(i, macd[i], color='r' if macd[i] > 0 else 'g')
    
    cross_list = []
    for i in range(4, len(macd)):
        if macdDIFF[i-1] < macdDEA[i-1] and macdDIFF[i] > macdDEA[i]:
            gold_cross = {'id':i,
                          'name':'gold_cross',
                          'dif':macdDIFF[i],
                          'dea':macdDEA[i]}
            cross_list.append(gold_cross)
        elif macdDIFF[i-1] > macdDEA[i-1] and macdDIFF[i] < macdDEA[i]:
            death_cross = {'id':i,
                          'name':'death_cross',
                          'dif':macdDIFF[i],
                          'dea':macdDEA[i]}
            cross_list.append(death_cross)
            
    df = pd.DataFrame(cross_list, columns=['id', 'name', 'dif', 'dea']).sort_values(by="id",ascending=False)  
    for index in df.index:
        if index < 2:
            break
        if df.loc[index]['name']=='gold_cross' and df.loc[index]['dif'] < 0:
            if df.loc[index-1]['name']=='death_cross' and df.loc[index-1]['dif'] < 0:
                        plt.scatter(df.loc[index]['id'], df.loc[index]['dea'], color='', marker='o', edgecolors='r', s=500, linewidths=3)  
    
    plt.legend(['DEA', 'DIF'], loc=2)
    plt.show()
    

# 判斷是否是低們二金叉
def is_second_low_gold_cross(macd_list):
    macdDIFF, macdDEA, macd = macd_list
    
    cross_list = []
    # 判斷當(dāng)前是否發(fā)生金叉,并且位置在0軸之下
    if macdDIFF[-2] < macdDEA[-2] and macdDIFF[-1] > macdDEA[-1] and macdDIFF[-1] < 0:
        for i in range(4, len(macd)):
            if macdDIFF[i-1] < macdDEA[i-1] and macdDIFF[i] > macdDEA[i]:
                gold_cross = {'id':i,
                              'name':'gold_cross',
                              'dif':macdDIFF[i],
                              'dea':macdDEA[i]}
                cross_list.append(gold_cross)
            elif macdDIFF[i-1] > macdDEA[i-1] and macdDIFF[i] < macdDEA[i]:
                death_cross = {'id':i,
                              'name':'death_cross',
                              'dif':macdDIFF[i],
                              'dea':macdDEA[i]}
                cross_list.append(death_cross)

        df = pd.DataFrame(cross_list, columns=['id', 'name', 'dif', 'dea']).sort_values(by="id",ascending=False)
        index_list = []
        if len(df.index) > 4:
            index_list = df.index[0:4] 
        else:
            return False
            
        result1 = df.loc[index_list[0]]['name']=='gold_cross' and df.loc[index_list[0]]['dif'] < 0
        result2 = df.loc[index_list[1]]['name']=='death_cross' and df.loc[index_list[1]]['dif'] < 0
        result3= df.loc[index_list[2]]['name']=='gold_cross' and df.loc[index_list[2]]['dif'] < 0
        result4 = df.loc[index_list[3]]['name']=='death_cross' and df.loc[index_list[3]]['dif'] > 0                                            
        if result1 and result2 and result3 and result4:
            return True
        else:
            return False
    else:
        return False      

日級另MACD信息展示

print('獲取一只標(biāo)的的日級別macd信息')
macd_day = get_macd('000001.XSHE', 200, datetime.datetime.now().date(), '1d')
print('最近5條DIF', macd_day[0][-5:])
print('最近5條DEA', macd_day[1][-5:])
print('最近5條MACD', macd_day[2][-5:])
獲取一只標(biāo)的的日級別macd信息
最近5條DIF [0.09338418 0.09829035 0.10659814 0.12545356 0.17708725]
最近5條DEA [-0.01178797  0.01022769  0.02950178  0.04869214  0.07437116]
最近5條MACD [0.21034429 0.17612531 0.15419272 0.15352284 0.20543218]
print('圖例展示')
show_macd(macd_day)
圖例展示
print('金叉死叉展示')
show_cross(macd_day)
金叉死叉展示

周級另MACD信息展示

print('獲取一只標(biāo)的的周級別macd信息')
macd_week = get_macd('000001.XSHE', 200, datetime.datetime.now().date(), '1w')
print('最近5條DIF', macd_week[0][-5:])
print('最近5條DEA', macd_week[1][-5:])
print('最近5條MACD', macd_week[2][-5:])
獲取一只標(biāo)的的周級別macd信息
最近5條DIF [-0.14239578 -0.16015779 -0.1363513  -0.09779805 -0.02100792]
最近5條DEA [-0.06544857 -0.08439042 -0.09478259 -0.09538569 -0.08051013]
最近5條MACD [-0.15389441 -0.15153475 -0.08313741 -0.00482473  0.11900442]
print('圖例展示')
show_macd(macd_week)
圖例展示
print('金叉死叉展示')
show_cross(macd_week)
金叉死叉展示

月級另MACD信息展示

print('獲取一只標(biāo)的的月級別macd信息')
macd_month = get_macd('000001.XSHE', 200, datetime.datetime.now().date(), '1M')
print('最近5條DIF', macd_month[0][-5:])
print('最近5條DEA', macd_month[1][-5:])
print('最近5條MACD', macd_month[2][-5:])
獲取一只標(biāo)的的月級別macd信息
最近5條DIF [-0.17706124 -0.12847861 -0.10011924 -0.12063404 -0.21350879]
最近5條DEA [-0.00852441 -0.03251525 -0.04603605 -0.06095565 -0.09146627]
最近5條MACD [-0.33707368 -0.19192673 -0.10816639 -0.1193568  -0.24408503]
print('圖例展示')
show_macd(macd_month)
圖例展示
print('金叉死叉展示')
show_cross(macd_month)
金叉死叉展示

分鐘級另MACD信息展示

print('獲取一只標(biāo)的的60分鐘級別macd信息')
macd_60m = get_macd('000001.XSHE', 200, datetime.datetime.now().date(), '60m')
print('最近5條DIF', macd_60m[0][-5:])
print('最近5條DEA', macd_60m[1][-5:])
print('最近5條MACD', macd_60m[2][-5:])
獲取一只標(biāo)的的60分鐘級別macd信息
最近5條DIF [0.06280508 0.09670337 0.1213621  0.14727579 0.1666979 ]
最近5條DEA [0.06006209 0.06739035 0.0781847  0.09200292 0.10694191]
最近5條MACD [0.00548599 0.05862605 0.08635481 0.11054574 0.11951197]
print('圖例展示')
show_macd(macd_60m)
圖例展示
print('金叉死叉展示')
show_cross(macd_60m)
金叉死叉展示

還可以將周、日級別的MACD同時展示,查看級別之間的共振情況

macd_week = get_macd('000001.XSHE', 50, datetime.datetime.now().date(), '1w')
macd_day = get_macd('000001.XSHE', 50*5, datetime.datetime.now().date(), '1d')
show_cross(macd_week)
show_cross(macd_day)

示例:求0軸下二次金叉

macd_week = get_macd('000001.XSHE', 200, datetime.datetime.now().date(), '1w')
show_two_low_cross(macd_week)
value = is_second_low_gold_cross(macd_week)
if value:
    print('當(dāng)前金叉是0軸下二次金叉')
else:
    print('當(dāng)前金叉不是0軸下二次金叉')
當(dāng)前金叉是0軸下二次金叉
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容