今天測試使用KDJ的時(shí)候,發(fā)現(xiàn)talib上沒有這個(gè)方法。于是,找公式準(zhǔn)備自己實(shí)現(xiàn)一遍。
KDJ指標(biāo)又叫隨機(jī)指標(biāo),是一種短線指標(biāo),它是由KD指標(biāo)發(fā)展而來的。
實(shí)現(xiàn)步驟
KDJ的實(shí)現(xiàn)步驟主要分成三步:
1、先計(jì)算“未成熟隨機(jī)值”,即RSV
2、求出當(dāng)日的K值和D值(即計(jì)算出RSV值的3日指數(shù)移動(dòng)平均)
3、計(jì)算出J值
J = 3 * D - 2 * K
KDJ簡單理解
1、RSV線過于起伏不定,為此根據(jù)MA原理,以RSV線為基礎(chǔ),生成一條相對平滑的K線
2、K線是RSV的3日移動(dòng)平均線,D線是K線的3日移動(dòng)平均線
KDJ的實(shí)現(xiàn)
talib上雖然沒有KDJ指標(biāo)的實(shí)現(xiàn),不過,它實(shí)現(xiàn)了KD指標(biāo)。我們只需要稍微加點(diǎn)邏輯就可以實(shí)現(xiàn)KDJ指標(biāo)。如下:
def talib_KDJ(data, fastk_period=9, slowk_period=3, slowd_period=3):
indicators={}
#計(jì)算kd指標(biāo)
high_prices = np.array([v['high'] for v in data])
low_prices = np.array([v['low'] for v in data])
close_prices = np.array([v['close'] for v in data])
indicators['k'], indicators['d'] = talib.STOCH(high_prices, low_prices, close_prices,
fastk_period=fastk_period,
slowk_period=slowk_period,
slowd_period=slowd_period)
indicators['j'] = 3 * indicators['k'] - 2 * indicators['d']
return indicators
在剛開始使用talib計(jì)算KD指標(biāo)時(shí),我不是很理解fastk_period
、slowk_period
和slowd_period
這三個(gè)參數(shù)是用來干啥的。如果只是傳一個(gè)周期,那只需要一個(gè)參數(shù)就行了。而且,我自己實(shí)現(xiàn)了KDJ,發(fā)現(xiàn)計(jì)算出來的值并不相同。
后來,看到下面內(nèi)容,我才知道talib對KD指標(biāo)的具體實(shí)現(xiàn),如下:
上面的FASTK就是RSV,而SLOWK就是K線,SLOWD就是D線,那參數(shù)就知道了:
- flask_period: 計(jì)算RSV的周期
- slowk_period: K線是由RSV的幾日移動(dòng)平均線得到
- slowd_period: D線是由K線的幾日移動(dòng)平均得到
為了驗(yàn)證正確性,我重新實(shí)現(xiàn)了下KDJ,用數(shù)據(jù)進(jìn)行驗(yàn)證。我實(shí)現(xiàn)的KDJ如下:
def self_KDJ(data, fastk_period=9, slowk_period=3, slowd_period=3):
#計(jì)算kd指標(biāo)
high_prices = np.array([v['high'] for v in data])
low_prices = np.array([v['low'] for v in data])
close_prices = np.array([v['close'] for v in data])
fast_k = RSV(data, fastk_period)
slow_k = talib.MA(np.array(fast_k), timeperiod=slowk_period)
slow_d = talib.MA(slow_k, timeperiod=slowd_period)
indicators= {
'k': slow_k,
'd': slow_d,
'j': 3 * slow_k - 2 * slow_d
}
return indicators
對應(yīng)的數(shù)據(jù):
talib對應(yīng)KD計(jì)算出的結(jié)果:
自己實(shí)現(xiàn)的KDJ的結(jié)果:
除了前部分默認(rèn)數(shù)據(jù)不一致外,從后面計(jì)算出結(jié)果值可以看出,我們實(shí)現(xiàn)KDJ與talib一樣。
最后
今天查找KDJ公式時(shí),發(fā)現(xiàn)最后的J值公式有兩種。一種是J = 3 * K - 2 * D
,另外一種是J = 3 * D - 2 * K
。后來,使用幣安專業(yè)版和Okex的指標(biāo)工具時(shí),發(fā)現(xiàn)它們都是使用第一種方式,于是選擇了第一種。