python 实现股票MACD计算

首先普及基本知识,就是MACD的计算公式:

3个参数(这3个参数可以根据实际情况自己设定,默认为12,26和9):(12)日快速移动平均线,(26)日慢速移动平均,(9)日移动平均
EMA(12)= 前一日EMA(12)×11/13+今日收盘价×2/13
EMA(26)= 前一日EMA(26)×25/27+今日收盘价×2/27
DIFF=今日EMA(12)- 今日EMA(26)
DEA(MACD)= 前一日DEA×8/10+今日DIF×2/10
BAR=2×(DIFF-DEA)
关键是第一日和第二日的DIFF,DEA和BAR(MACD)是多少:
第一日都为0
DIFF=0,DEA=0,BAR(MACD)=0
第二日
EMA(12)=前一日收盘价(即第一日收盘价)+(今日收盘价 - 前一日收盘价)* 2 / 13
EMA(26)=前一日收盘价(即第一日收盘价)+(今日收盘价 - 前一日收盘价)* 2 / 27
DIFF=EMA(12)-EMA(26)
DEA(9)=0(即前一日DEA(9))+今日DIFF*2/10

BAR=2*(DIFF-DEA)
第三日就可以按最上面的公式计算了,因为前一日(即第二日)的EMA(12),EMA(26),DEA(9)都已经有了,后面以此类推。

由于计算当天的DIFF,DEA和BAR(MACD)需要前一天的EMA数据,所以除非这些数据是已知的,否则需要从第一天收盘后开始计算,这也是MACD比较麻烦的地方。

根据以上的公式给出代码就不困难了:

元数据的获取使用了Tushare第三方金融数据库,可以见之前的blog:python 经济数据第三方库 tushare 简单试用

元数据格式是这样的(以沪深300指数为例):

python 实现股票MACD计算_第1张图片

函数实现:

def calMACD(df, fast_ma, slow_ma, ma):
    """

    :param df: original dataframe, index = 'date',
                columns ='open','high','close','low','volume','amount'
    :param fast_ma: fast period
    :param slow_ma: slow period
    :param ma: moving average
    :return: DateFrame
    """

    # sort by date
    sort_df = df.sort_index(ascending=True)

    # create list to save result

    EMA10 = []
    EMA22 = []
    DIFF = []
    DEA8 = []
    MACDN = []

    # get close prices
    close = sort_df['close']
    # print(close[:10])

    # need to be calculated

    # cal ema,diff,dea,macd
    for i in range(1, close.count() + 1):
        # print("Is calculating the %d lines" % i)
        ema10 = CalMACD.emaN(days=fast_ma, i=i, close=close, lastemaN=EMA10)
        # print("ema10" + str(ema10))
        EMA10.insert(i, ema10)
        ema22 = CalMACD.emaN(days=slow_ma, i=i, close=close, lastemaN=EMA22)
        # print("ema22" + str(ema22))
        EMA22.insert(i, ema22)
        diff = CalMACD.diff(ema10, ema22)
        DIFF.insert(i, diff)
        dea = CalMACD.deaN(ma=ma, dea=DEA8, diff=DIFF, i=i)
        DEA8.insert(i, dea)
        macdN = CalMACD.macd(diff, dea)
        MACDN.insert(i, macdN)

    # insert result to dataframe
    sort_df['ema' + str(fast_ma)] = EMA10
    sort_df['ema' + str(slow_ma)] = EMA22
    sort_df['diff' + str(fast_ma)] = DIFF
    sort_df['dea' + str(slow_ma)] = DEA8
    sort_df['macd' + str(ma)] = MACDN

    return sort_df

结果:

python 实现股票MACD计算_第2张图片

最后的3列数据就是我们想要获得的数据,可以与任意股票软件中的数据对比,完全一致

到此,完成计算。

你可能感兴趣的:(python,编程)