Python 实现股票指标计算——MACD

MACD (Moving Average Convergence / Divergence) - 异同移动平均线

1 公式

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 简单试用

2 数据准备

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

3 计算过程

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

4 结果:

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

到此,完成计算。

  • 16
    点赞
  • 130
    收藏
    觉得还不错? 一键收藏
  • 15
    评论
评论 15
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值