量化交易——传统技术分析平滑异同移动平均线MACD的原理及实现

来源:互联网 发布:php 数组的写法 编辑:程序博客网 时间:2024/05/22 07:57

指数平滑异同移动平均线MACD

MACD是股票交易中常见的一个技术分析工具,同时也是一个我认为分析可执行度高并且效果优秀的一种手段。其是于1970年代由Gerald Appel提出,它主要是利用了双指数移动平均线,即是求得一条快速的指数移动平均线EMA12和一条慢的指数移动平均线EMA26,再进行相减得到差离值DIF。进而将得到的DIF取9日加权移动平均DEA,最后得到MACD。MACD指标由一组曲线和柱形图构成,它反映的是股票价格变化额趋势周期等特征,通过这些特征便可以很好的挖掘出股票买卖交易的最佳时机。

实现

分析过程可以参考前面的博文,量化交易——传统技术分析相对强弱指数RSI的原理及实现,这里不细讲。
相关代码:

import numpy as npimport mathimport randomimport jsonimport matplotlib.pyplot as pltimport syssys.setrecursionlimit(10000)#date|open|high|low|close|volume|adjsuted def get_stock_hist(num):    s_his=np.genfromtxt('C:/Users/Haipeng/Desktop/python/Korea/Korea_{:03d}.csv'.format(num), delimiter=',')    s_hi=s_his[1:][:]    days=s_hi.shape[0]    this_stock = []    for i in range(1,days,1):        this_day = [i]        for k in range(1,7):            this_day.append(s_hi[i][k])        this_stock.append(this_day)    print 'Maximum date is ',len(this_stock)    return this_stockdef get_price(D, p_tpe):    if p_tpe=='close':        pos=4;    elif p_tpe=='open':        pos=1;    elif p_tpe=='high':        pos=2;    elif p_tpe=='low':        pos=3;    else:        pos=5    price=stock_hist[D-1][pos];    return pricedef get_ma(D, N):    p_used=np.zeros(N);    for i in range(1,N+1,1):        p_used[i-1]=stock_hist[(D-1)-(i-1)][4];    ma=np.mean(p_used);    return madef get_mar(fro,to,N):    ma = []    for i in range(fro,to+1):        ma.append(get_ma(i,N))    return ma#Date\Open\High\Low\Closedef get_tuples(fro,to):    res =[]    for d in range(fro,to+1):        tmp = []        tmp.append(d)        tmp.append(get_price(d,'open'))        tmp.append(get_price(d,'high'))        tmp.append(get_price(d,'low'))        tmp.append(get_price(d,'close'))                res.append(tmp)    return resdef get_volume(fro,to):    res = []    for d in range(fro,to+1):        num = 1        try:            if get_price(d,'close')<get_price(d-1,'close'):                num = -1        except:            pass        res.append(num*get_price(d,'volume'))    return res  # MACDdef get_MACD(D):    EMA12 = 0    EMA26 = 0    DEM = 0    DIF = 0    for i in range(1,D):        if i==1:            EMA12 = get_price(i+1,'close')*2.0/13+(1-2.0/13)*get_price(i,'close')            EMA26 = get_price(i+1,'close')*2.0/27+(1-2.0/27)*get_price(i,'close')            DIF = EMA12 - EMA26            DEM = DIF*2.0/10        else:            EMA12 = get_price(i+1,'close')*2.0/13+(1-2.0/13)*EMA12            EMA26 = get_price(i+1,'close')*2.0/27+(1-2.0/27)*EMA26            DIF = EMA12 - EMA26            DEM = DIF*2.0/10+DEM*(1-2.0/10)    OSC = DIF-DEM    return [DIF,DEM,OSC]def get_DIF_DEM_OSC(fro,to):    res = [[],[],[]]    for d in range(fro,to+1):        tmp = get_MACD(d)        res[0].append(tmp[0])        res[1].append(tmp[1])        res[2].append(tmp[2])    return res

绘制k线图及MACD指标

画图代码:

def plot_MACD(fro,to):    volume = get_volume(fro,to)    tmp = get_DIF_DEM_OSC(fro,to)    DIF = tmp[0]    DEM = tmp[1]    OSC = tmp[2]    ma5 = get_mar(fro,to,5)    ma10 = get_mar(fro,to,10)    ma20 = get_mar(fro,to,20)    tuples = get_tuples(fro,to)    date = [d for d in range(fro,to+1)]     fig = plt.figure(figsize=(8,5))    p1 = plt.subplot2grid((5,4),(0,0),rowspan=3,colspan=4,axisbg='k')     p1.set_title("Moving Average Convergence / Divergence(MACD)")    p1.set_ylabel("Price")    p1.plot(date,ma5,'m')    p1.plot(date,ma10,'b')    p1.plot(date,ma20,'y')    p1.legend(('MA5','MA10','MA20'))    p1.grid(True,color='w')    candlestick_ohlc(p1, tuples, width=0.7,colorup='r',colordown="g")    p2 = plt.subplot2grid((5,4),(3,0),colspan=4,axisbg='c')     p2.set_ylabel("Volume")    colors = []    for i in range(len(volume)):        if volume[i]<0:            colors.append('green')            volume[i] = -volume[i]        else:            colors.append('red')    p2.bar(date,volume,color=colors)    p3 = plt.subplot2grid((5,4),(4,0),colspan=4,axisbg='m')     p3.set_ylabel("MACD")    p3.set_xlabel("Dates")    p3.plot(date,DIF, 'r-')    p3.plot(date,DEM, 'g-')    p3.bar(date,OSC,facecolor = 'yellowgreen',edgecolor = 'gold')    p3.legend(('DIF','DEM','MACD bar / OSC'),loc='upper left')    plt.subplots_adjust(hspace=0)    plt.show()# show the plot on the screen#select stock 18stock_hist = get_stock_hist(18)#Date from 110 to 880plot_MACD(110,880)

图像1:
这里写图片描述
图像2:

#Date from 400 to 520plot_MACD(400,520)

这里写图片描述

欢迎交流~

1 0
原创粉丝点击