talib实现的MACD与国内软件厂商实现的不太一致,需要自行定义和调整。提供通达信、同花顺 MACD Talib实现。
同花顺和通达信等软件中的SMA,是KDJ_CN和RSI_CN的基础依赖
注意:使用前引用talib
首先实现SMA,然后才是其它MACD、KDJ等:
import talib
def SMA_CN(close, timeperiod):
close = np.nan_to_num(close)
return reduce(lambda x, y: ((timeperiod - 1) * x + y) / timeperiod, close)
import talib
def MACD_CN(close, fastperiod, slowperiod, signalperiod):
macdDIFF, macdDEA, macd = talib.MACDEXT(close, fastperiod=fastperiod, fastmatype=1,slowperiod=slowperiod, slowmatype=1, signalperiod=signalperiod, signalmatype=1)
macd = macd * 2
return macdDIFF, macdDEA, macd
import talib
def RSI_CN(close, timeperiod) :
diff = map(lambda x, y : x - y, close[1:], close[:-1])
diffGt0 = map(lambda x : 0 if x < 0 else x, diff)
diffABS = map(lambda x : abs(x), diff)
diff = np.array(diff)
diffGt0 = np.array(diffGt0)
diffABS = np.array(diffABS)
diff = np.append(diff[0], diff)
diffGt0 = np.append(diffGt0[0], diffGt0)
diffABS = np.append(diffABS[0], diffABS)
rsi = map(lambda x : SMA_CN(diffGt0[:x], timeperiod) / SMA_CN(diffABS[:x], timeperiod) * 100, range(1, len(diffGt0) + 1) )
return np.array(rsi)
import talib
def KDJ_CN(high, low, close, fastk_period, slowk_period, fastd_period):
kValue, dValue = talib.STOCHF(high, low, close, fastk_period, fastd_period=1, fastd_matype=0)
kValue = np.array(map(lambda x : SMA_CN(kValue[:x], slowk_period), range(1, len(kValue) + 1)))
dValue = np.array(map(lambda x : SMA_CN(kValue[:x], fastd_period), range(1, len(kValue) + 1)))
jValue = 3 * kValue - 2 * dValue
func = lambda arr : np.array([0 if x < 0 else (100 if x > 100 else x) for x in arr])
kValue = func(kValue)
dValue = func(dValue)
jValue = func(jValue)
return kValue, dValue, jValue