【指标研究】KDJ日、周、月以及分钟级别研究
KDJ简介
KDJ指标又叫随机指标,是一种相当新颖、实用的技术分析指标,它起先用于期货市场的分析,后被广泛用于股市的中短期趋势分析,是期货和股票市场上最常用的技术分析工具。
如下图:
随机指标KDJ一般是用于股票分析的统计体系,根据统计学原理,通过一个特定的周期(常为9日、9周等)内出现过的最高价、最低价及最后一个计算周期的收盘价及这三者之间的比例关系,来计算最后一个计算周期的未成熟随机值RSV,然后根据平滑移动平均线的方法来计算K值、D值与J值,并绘成曲线图来研判股票价格走势。
随机指标KDJ是以最高价、最低价及收盘价为基本数据进行计算,得出的K值、D值和J值分别在指标的坐标上形成的一个点,连接无数个这样的点位,就形成一个完整的、能反映价格波动趋势的KDJ指标。它主要是利用价格波动的真实波幅来反映价格走势的强弱和超买超卖现象,在价格尚未上升或下降之前发出买卖信号的一种技术工具。它在设计过程中主要是研究最高价、最低价和收盘价之间的关系,同时也融合了动量观念、强弱指标和移动平均线的一些优点,因此,能够比较迅速、快捷、直观地研判行情。由于KDJ线本质上是一个随机波动的观念,故其对于掌握中短期行情走势比较准确。
计算方法
KDJ的计算比较复杂,首先要计算周期(n日、n周等)的RSV值,即未成熟随机指标值,然后再计算K值、D值、J值等。以n日KDJ数值的计算为例,其计算公式为:
公式中,Cn为第n日收盘价;Ln为n日内的最低价;Hn为n日内的最高价。
其次,计算K值与D值:
若无前一日K 值与D值,则可分别用50来代替。
以9日为周期的KD线为例,即未成熟随机值,计算公式为
公式中,C为第9日的收盘价;L9为9日内的最低价;H9为9日内的最高价。
若无前一日K值与D值,则可以分别用50代替。
指标分析
面对变幻莫测的中国股市行情,学会并准确利用相关技术指标进行股票分析就显得很有必要,它可以帮助我们更好地抓住规律,更好地着手操作。今天就给大家从五个方面讲解一下炒股的入门知识关于KDJ指标的分析。
第一个方面,KD指标的背离。在KD处在高位或低位,如果出现与股价走向的背离,则是采取行动的信号。
第二个方面,J指标取值超过100和低于0,都属于价格的非正常区域,大于100为超买,小0为超卖。
第三个方面,KD的取值。KD的统一取值范围是0~100,我们可以将其划分为3个区域:80以上为超买区,20以下为超卖区,其余为徘徊区。但是这里股票投资者需要注意的是这种划分只是一个信号提示,不能完全按这种分析的方法进行操作。
第四个方面,KD指标的交叉。K与D的关系就如同股价与MA的关系一样,也有死亡交叉和黄金交叉的问题。
第五个方面,KD指标曲线的形态。当KD指标在较高或较低的位置形成了头肩形和多重顶(底)时,是采取行动的信号。这里股票投资者同样需要注意的是,这些形态一定要在较高位置或较低位置出现,位置越高或越低,结论越可靠。
SMA简介
简单移动平均线(SMA)又称“算术移动平均线”,是在投资股票时用于分析股票价格走势的一项指标。它是一个简单地将某一证券在某一时间段的收盘价之和进行算术平均的方法,并随着时间的推移将这些平均值连成一条线便可得出SMA。
例如,在计算某只股票的5日简单移动平均线的平均值时,其收盘价分别为10、11、10.5、10和10.5元,用这些收盘价之和除以5即可(“5”为天数),此实例中的计算结果为10.4元。一般来说,当你听到“移动平均线”这个术语时,它通常指的是简单移动平均线(SMA)。这是很重要的,尤其是将它与指数移动平均线(EMA)进行比较时。
股票的收盘价是每个交易日最后一笔交易的股票价格。因为股票的市场价格在交易日是不断变化的,用收盘价来计算SMA是为了在比较股票的价值时有一个统一的时间。换句话说,简单移动平均线中的各个平均值实际上就是某一时间段的股票平均价格。记住:每日的股价被赋予了相同的权重。
根据所采用的数据的时间范围的长短可将SMA分为短期平均线和长期平均线。短期平均线可以快速反应证券的基本价格变化,而长期平均线则反应迟缓。当短期均线向上交叉长期均线时会引起交易者的注意,这往往是一个上升趋势开始的信号。而当价格回落时,短期均线(例如15日SMA)作为支撑位起着支撑作用。当计算的时间和价格范围扩大时,支撑位的作用变得更加强大和重要。
计算SMA有助于投资者确定和评估股票的价格变动模式。如果SMA在某一时间段里是向上移动的,它表面股票价格处于上升趋势中,即“牛市”,或即将“大涨”的趋势。当股票价格在简单移动平均线之上移动时,暗示着一个好的购买机会的来临,因为股票很有可能回升,相反的,如果SMA向下移动,则是“熊市”或下跌趋势的指示标志。
SMA也可以用于确定股票价格的阻力点和支撑位。当股价触及阻力点或支撑位后不再突破,这表明股票价格将不再下跌或上涨,这可能是开始回升或者下跌的信号。如果它突破了该阻力点或支撑位,则意味着价格会继续向上或向下变动,表明股价很可能持续地大幅上涨或下跌。
导入必要的模块
from jqdata import *
from functools import reduce
import talib as tl
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import datetime
KDJ函数封装
在计算KDJ的时候,会使用到SMA,代码如下。
# SMA计算函数
def SMA(close, timeperiod) :
close = np.nan_to_num(close)
return reduce(lambda x, y: ((timeperiod - 1) * x + y) / timeperiod, close)
# KDJ计算函数
def KDJ(high, low, close, fastk_period, slowk_period, fastd_period) :
kValue, dValue = tl.STOCHF(high, low, close, fastk_period, fastd_period=1, fastd_matype=0)
kValue = np.array(map(lambda x : SMA(kValue[:x], slowk_period), range(1, len(kValue) + 1)))
dValue = np.array(map(lambda x : SMA(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
# 获取某标的的KDJ信息
def get_kdj(stock, count, end_date, unit):
data = get_bars(security=stock, count=count, unit=unit,
include_now=False,
end_dt=end_date, fq_ref_date=None)
close = data['close']
open = data['open']
high = data['high']
low = data['low']
return KDJ(high, low, close, 9, 3, 3)
# 将KDJ信息图例化
def show_kdj(kdj_list):
k, d, j = kdj_list
plt.rcParams['font.sans-serif']=['SimHei'] # 用来正常显示中文标签
plt.rcParams['axes.unicode_minus']=False # 用来正常显示负号
# 设置图片大小
plt.figure(figsize=(20, 5))
# 绘制kdj曲线
plt.plot(k, 'orange')
plt.plot(d, 'blue')
plt.plot(j, 'purple')
# 画出20、50、80关键位置
plt.plot([20 for i in k], 'k--')
plt.plot([50 for i in d], 'k--')
plt.plot([80 for i in j], 'k--')
# 显示图例
plt.legend(['k', 'd', 'j'])
plt.show()
# 将KDJ的金叉与死叉展示出来
def show_cross(kdj_list):
k, d, j = kdj_list
# 设置图片大小
plt.rcParams['font.sans-serif']=['SimHei'] # 用来正常显示中文标签
plt.rcParams['axes.unicode_minus']=False # 用来正常显示负号
# 设置图片大小
plt.figure(figsize=(20, 5))
# 绘制kdj曲线
plt.plot(k, 'orange')
plt.plot(d, 'blue')
plt.plot(j, 'purple')
# 画出20、50、80关键位置
plt.plot([20 for i in k], 'k--')
plt.plot([50 for i in d], 'k--')
plt.plot([80 for i in j], 'k--')
# 因为前几天是没有kdj值的,我们这里从第5天开始计算
for i in range(4, len(d)):
if k[i-1] < d[i-1] and k[i] > d[i]:
# 用红圈标出金叉
plt.scatter(i, d[i-1], color='', marker='o', edgecolors='r', s=500, linewidths=3)
elif k[i-1] > d[i-1] and k[i] < d[i]:
# 用绿圈标出死叉
plt.scatter(i, d[i-1], color='', marker='o', edgecolors='g', s=500, linewidths=3)
# 显示图例
plt.legend(['k', 'd', 'j'])
plt.show()
日级别的KDJ调用
print('获取一只标的的日级别kdj信息')
kdj_day = get_kdj('000001.XSHE', 100, datetime.datetime.now().date(), '1d')
print('k:', kdj_day[0][-5:])
print('d:', kdj_day[1][-5:])
print('j:', kdj_day[2][-5:])
获取一只标的的日级别kdj信息
('k:', array([ 80.48669568, 73.37610698, 68.14817388, 75.43211592, 82.21790184]))
('d:', array([ 82.25077155, 79.29255003, 75.57775798, 75.52921063, 77.75877437]))
('j:', array([ 76.95854394, 61.54322088, 53.28900569, 75.23792651, 91.1361568 ]))
将日级另的KDJ的图例展示出来
show_kdj(kdj_day)
求出金叉与死叉位置,并在图上展示出来
这里使用的是k,d这两条线,金叉使用向上三角标出,死叉使用向下三角标出。
show_cross(kdj_day)
周级别的KDJ的调用
print('获取一只标的的周级别kdj信息')
kdj_week = get_kdj('000001.XSHE', 100, datetime.datetime.now().date(), '1w')
print('k:', kdj_week[0][-5:])
print('d:', kdj_week[1][-5:])
print('j:', kdj_week[2][-5:])
获取一只标的的周级别kdj信息
('k:', array([ 24.76609723, 19.3021929 , 23.45013918, 35.86463999, 48.5725731 ]))
('d:', array([ 39.99249419, 33.09572709, 29.88053112, 31.87523408, 37.44101375]))
('j:', array([ 0. , 0. , 10.58935529, 43.84345182, 70.83569179]))
将周级另的KDJ的图例展示出来
show_kdj(kdj_week)
求出金叉与死叉位置,并在图上展示出来
这里使用的是k,d这两条线,金叉使用向上三角标出,死叉使用向下三角标出。
show_cross(kdj_week)
月级别的KDJ的调用
print('获取一只标的的周级别kdj信息')
kdj_month = get_kdj('000001.XSHE', 100, datetime.datetime.now().date(), '1M')
print('k:', kdj_month[0][-5:])
print('d:', kdj_month[1][-5:])
print('j:', kdj_month[2][-5:])
获取一只标的的周级别kdj信息
('k:', array([ 20.55227454, 26.67556826, 31.18240498, 37.15502234, 33.65253639]))
('d:', array([ 27.99336619, 27.55410021, 28.76353513, 31.56069754, 32.25797715]))
('j:', array([ 5.67009124, 24.91850435, 36.02014468, 48.34367196, 36.44165485]))
将月级另的KDJ的图例展示出来
show_kdj(kdj_month)
求出金叉与死叉位置,并在图上展示出来
这里使用的是k,d这两条线,金叉使用向上三角标出,死叉使用向下三角标出。
show_cross(kdj_month)
分钟级别的KDJ的调用
这里的示例为60分钟级别。
print('获取一只标的的周级别kdj信息')
kdj_60m = get_kdj('000001.XSHE', 100, datetime.datetime.now().date(), '60m')
print('k:', kdj_60m[0][-5:])
print('d:', kdj_60m[1][-5:])
print('j:', kdj_60m[2][-5:])
获取一只标的的周级别kdj信息
('k:', array([ 78.90416969, 84.37361313, 86.40780558, 89.06060278, 91.29861781]))
('d:', array([ 66.68506638, 72.58124863, 77.19010095, 81.14693489, 84.5308292 ]))
('j:', array([ 100., 100., 100., 100., 100.]))
将分钟级另的KDJ的图例展示出来
show_kdj(kdj_60m)
求出金叉与死叉位置,并在图上展示出来
这里使用的是k,d这两条线,金叉使用向上三角标出,死叉使用向下三角标出。
show_cross(kdj_60m)