2014年10月1日 星期三 晴

MACD是股票技术分析的一个重要指标,要计算MACD,必须要懂得计算EMA。关于EMA和MACD,网络上的文字资料很多,公式也有,但代码方面很少,Python的更少。今晚研究了一下,用Python写了如何计算,验证了两只股票,感觉还行。希望本文能给其他同好带来帮助。

一、 EMA的计算 指数平滑移动平均线(EMA,Exponential Moving Average) : EMA的原理和数学公式,我只是稍微看了一下,反正了解个大概,我只管应用。

新股上市首日,其DIFF,DEA以及MACD都为0,因为当日不存在前一日,无法做迭代。而计算新股上市第二日的EMA时,前一日的EMA需要用收盘价(而非0)来计算。

下面上ema计算的Python代码。 [code]def getEMAList(inlist,num = 12): #计算出序数 k = 2.0 / (num + 1.0) #第一天ema等于当天收盘价 ema = inlist[0] emaList = [ema] for item in inlist: #第二天以后,当天收盘 收盘价乘以系数再加上昨天EMA乘以系数-1 ema = item * k + ema * (1 - k) emaList.append(ema) return emaList[/code]

二、 MACD的计算 国外,MACD不是读字母的,而是读Mac D。

根据这段百度知道 ,我就慢慢自己推断了,代码如下:

[code]

def handle1Day(): closeList = [] sh1dayPath = ‘D:\Program Files\new_zszq\vipdoc\sh\lday\’ f601628 = ‘sh601628.day’ with open("%s%s" % (sh1dayPath ,f601628),‘rb’) as f: text = f.read() start = 0 total_length = len(text) while start < total_length: mydate,price_open,high,low,close,amount,vol,reservation = struct.unpack(“lllllfll”,text[start:start+32]) #print mydate,price_open,high,low,close,amount,vol,reservation closeList.append(close / 100.0) start += 32 return closeList

def main(): closeList = handle1Day() #12日EMA,快速移动平均线,即EMA1 ema12List = getEMAList(closeList,12) print ema12List #26日EMA,慢速移动平均线,即EMA2 ema26List = getEMAList(closeList,26) print ema26List #计算快慢速线间的离差值(DIF),DIF = 今日EMA(12)-今日EMA(26) difList = [x - y for x,y in zip(ema12List,ema26List)] print difList #DEA/DEM,计算DIF的9日EMA deaList = getEMAList(difList,9) print deaList #BAR柱状线,其公式为:BAR=2×(DIF-DEA) macdList = [2 * (x - y) for x,y in zip(difList,deaList)] print macdList[/code]

有人说,计算过程中小数点后四舍五入保留4位小数,最后显示的时候四舍五入保留2位小数。我暂时还没那么做,或许在实战中我会做出调整。大概算了一下601628的,结果是吻合的。

我觉得会计算EMA和MACD,就有信心继续往下走了。