一、MACD与KDJ计算原理

python Ta-lib的安装 篇中提到了ta-lib在python下的安装,不过安装的目的为了使用,这里就结合该库进行股票中MACD和KDJ值的计算和处理。如果不了解这两个指标的,可以自行科普。行情相关数据可以使用tushare包进行获取,具体可以参考 python stock数据包tushare

ta-lib中直接有MACD函数,其返回值有三个。而KDJ值对应的函数是Stochastic Oscillator Slow (Stoch),其返回值有两个,一个是快速确认线值,另外一个是慢速主干线值。MACD函数返回的三个值如下:

1macd = 12 天 EMA - 26 天 EMA DIFF
2signal = 9 天 MACD的EMA  DEA
3hist = MACD - MACD signal DIFF - DEA

这个值对应的是DIFF DEA DIFF-DEA 三个值 。

KDJ值对应的四条随机线FASTK, FASTD, SLOWK and SLOWD的计算原理见下图:

talib-kdj
talib-kdj

上面提到的stoch函数计算得到的是最下面的两条值,上面两个的值对应的是stochf函数。其中常见的K、D两个值对应的是SLOWK和SLOWD,而J值是不是对应上面的两个中的某个一个或者是否是通过再计算得出的,这个还未研究,不过J值一般只做为参考值,因为其变化太快。

 1>>> import talib as ta
 2>>> help(ta.STOCH)
 3Help on function STOCH in module talib._ta_lib:
 4STOCH(...)
 5    STOCH(high, low, close[, fastk_period=?, slowk_period=?, slowk_matype=?, slowd_period=?, slowd_matype=?])
 6    Stochastic (Momentum Indicators)
 7    Inputs:
 8        prices: ['high', 'low', 'close']
 9    Parameters:
10        fastk_period: 5
11        slowk_period: 3
12        slowk_matype: 0
13        slowd_period: 3
14        slowd_matype: 0
15    Outputs:
16        slowk
17        slowd
18>>> help(ta.STOCHF)
19Help on function STOCHF in module talib._ta_lib:
20STOCHF(...)
21    STOCHF(high, low, close[, fastk_period=?, fastd_period=?, fastd_matype=?])
22    Stochastic Fast (Momentum Indicators)
23    Inputs:
24        prices: ['high', 'low', 'close']
25    Parameters:
26        fastk_period: 5
27        fastd_period: 3
28        fastd_matype: 0
29    Outputs:
30        fastk
31        fastd

二、使用示例

1、计算MACD

 1import talib as ta
 2import tushare as ts
 3import pandas as pd
 4dw = ts.get_k_data("600600")
 5dw = dw[-50:]   # 取最后50天的数据
 6print(dw)
 7close = dw.close.values
 8print(close)
 9print(len(close))
10dw['macd'], dw['macdsignal'], dw['macdhist'] = ta.MACD(close, fastperiod=12, slowperiod=26, signalperiod=9)
11df = pd.DataFrame(data=dw)
12row = df.iloc[-10:].values
13print(row)

2、计算KDJ

 1import talib as ta
 2import tushare as ts
 3import pandas as pd
 4dw = ts.get_k_data("603236")
 5print(len(dw))
 6dw = dw[300:]   # 从第300天开始,直到最后
 7dw.index = range(len(dw))
 8dw['slowk'], dw['slowd'] = ta.STOCH(dw['high'].values,
 9                        dw['low'].values,
10                        dw['close'].values,
11                        fastk_period=9,
12                        slowk_period=3,
13                        slowk_matype=0,
14                        slowd_period=3,
15                        slowd_matype=0)
16df = pd.DataFrame(data=dw)
17row = df.iloc[-10:].values
18print(row)

注意这里计算的时候,MACD是最少要26天的数据,KDJ要至少最近9天的数据,所以在遇到新股时,计算会出错,所以批量处理时需要通过len(dw)进行判断过滤。

除此之外,还可以像很多软件一样,其有按天、周、月等统计的结果,这个只需要使用MA加权平均即可,比如,我们可以算5、10、20三种的加权平均时,可以使用如下代码:

1slowkMA5 = ta.MA(slowk, timeperiod=5, matype=0)
2slowkMA10 = ta.MA(slowk, timeperiod=10, matype=0)
3slowkMA20 = ta.MA(slowk, timeperiod=20, matype=0)
4slowdMA5 = ta.MA(slowd, timeperiod=5, matype=0)
5slowdMA10 = ta.MA(slowd, timeperiod=10, matype=0)