python股票量化交易(2)---震荡类指标KDJ

简介: 汝之命,未知若何?即命当荣显,常做落寞想;即时当顺利,常做拂逆想;即眼前足食,常作贫窭想;即人相爱敬,常作恐惧想;即家世望重,常作卑下想;即学问颇优,常作浅陋想。

什么是KDJ


说到KDJ,我们首先需要提到威廉指数,该指标的计算首先选定一个特定的时间跨度,比如14天,然后找出这一特定时间的最高价和最低价,构成一个价格变化区间,而后分析这一时间跨度最后一个时间点的收盘价与期间最高价和最低价的相对位置,以此来衡量市场的超买或超卖现象。


而KDJ指标最早是由芝加哥期货交易商George Lane提出的KD指标,该指标还被称为随机震荡指标。与威廉指数不同的是,该指标在收盘价与最高价和最低价的相对位置的比值上,融合了移动平均的思想,用更多的信息来捕捉市场的超买与超卖。顾名思义,KDJ就是比威廉指数多了一个J线,进一步提高了数据的准确度。


KDJ的计算公式


关于KDJ的计算,我们可以分为4个步骤:


(1)首先,需要计算RSV值,它的公式如下:


RSV=(第n天的收盘价-最近n天内的最低价)÷(最近n天内的最高价-最近n天内的最低价)*100


这个公式中,n为时间跨度,具体应用之时,视你需要观察的数据时间长度而定。而RSV取值范围在0~100之间,取值越大说明收盘价在价格区间中的相对位置越高,市场可能出现超买的现象,反之则出现超卖的现象。


(2)计算K值,K值由RSV值的指数移动平均(EMA)计算得到,即前一日的K值和当前RSV值经过一定权重调整后相加所得,计算公式如下:


K值=2/3前一日的K值+1/3当日RSV值


(3)计算D值,D值由K值的指数移动平均计算而来,即前一日的D值和当期K值经过一定权重调整后相加得到,计算公式如下:


D值=2/3前一日D值+1/3当日K值


(4)计算J值,J值是KD的辅助指标,进一步反映了K指标和D指标的乘离程度,计算公式如下:


J值=3K值-2D值


计算KDJ的值


这里,我们选择时间跨度为9日,也就是和之前讲解的均线一样。但和均线不同的是,前8日依旧有RSV值,但无效,第9日以及之后的数据才有效。


根据上面的公式,我们首先需要计算最近9天内的最低价以及最近9天内的最高价。这里,我们依旧使用前一章开头获取的歌尔股份k.xlsx文件中的股票数据。具体代码如下:

low_list = df["close"].rolling(9, min_periods=1).min()
high_list = df["high"].rolling(9, min_periods=1).max()


得到这2个值后,我们就可以计算RSV值,具体的代码如下所示(套用公式1):

rsv = (df["close"] - low_list) / (high_list - low_list) * 100

得到RSV值之后,我们可以分别根据上面的公式推导出KDJ的值,具体代码如下所示:

df["K"] = rsv.ewm(com=2, adjust=False).mean()
df["D"] = df["K"].ewm(com=2, adjust=False).mean()
df["J"] = 3 * df["K"] - 2 * df["D"]


我们首先来分析一下ewm方法,其具体的定义如下:

DataFrame.ewm(self, com=None, span=None, halflife=None, alpha=None, min_periods=0, adjust=True, ignore_na=False, axis=0)

该方法为指数加权函数,当adjust为False时,是以递归方式计算加权平均值,公式如下所示:

当com为2时,则a=1/3,套用上图第2个公式,得出K值为(2/3)前一日的K值+1/3当日的RSV值,所以使用ewm就可以计算出K值。


而D值同样如此,只是RSV换成了K值。至于最后的J值,是最简单的,直接套用即可。


绘制KDJ曲线


既然KDJ的值都被计算出来了,那么曲线自然可以直接绘制出来,我们直接将3值代入到绘图库的方法中即可,具体代码如下所示(完整代码):

import matplotlib.pyplot as plt
plt.figure(figsize=(12, 8))
df = pd.read_excel("歌尔股份k.xlsx")
low_list = df["close"].rolling(9, min_periods=1).min()
high_list = df["high"].rolling(9, min_periods=1).max()
rsv = (df["close"] - low_list) / (high_list - low_list) * 100
df["K"] = rsv.ewm(com=2, adjust=False).mean()
df["D"] = df["K"].ewm(com=2, adjust=False).mean()
df["J"] = 3 * df["K"] - 2 * df["D"]
plt.plot(df["date"], df["K"], label ="K")
plt.plot(df["date"], df["D"], label ="D")
plt.plot(df["date"], df["J"], label ="J")
plt.legend()
plt.show()


运行之后,显示的KDJ曲线如下:

KDJ指标我们就讲到这里,下一篇介绍MACD指标图绘制。

相关文章
|
2月前
|
索引 Python
python-类属性操作
【10月更文挑战第11天】 python类属性操作列举
25 1
|
2月前
|
Java C++ Python
Python基础---类
【10月更文挑战第10天】Python类的定义
27 2
|
2月前
|
机器学习/深度学习 数据挖掘 Serverless
手把手教你全面评估机器学习模型性能:从选择正确评价指标到使用Python与Scikit-learn进行实战演练的详细指南
【10月更文挑战第10天】评估机器学习模型性能是开发流程的关键,涉及准确性、可解释性、运行速度等多方面考量。不同任务(如分类、回归)采用不同评价指标,如准确率、F1分数、MSE等。示例代码展示了使用Scikit-learn库评估逻辑回归模型的过程,包括数据准备、模型训练、性能评估及交叉验证。
120 1
|
2月前
|
设计模式 开发者 Python
Python类里引用其他类
Python类里引用其他类
30 4
|
2月前
|
设计模式 开发者 Python
Python 类中引用其他类的实现详解
Python 类中引用其他类的实现详解
59 1
|
2月前
|
JSON 缓存 API
在 Python 中使用公共类处理接口请求的响应结果
在 Python 中使用公共类处理接口请求的响应结果
37 1
|
2月前
|
机器人 关系型数据库 Python
【Python篇】Python 类和对象:详细讲解(下篇)
【Python篇】Pyt hon 类和对象:详细讲解(下篇)
35 2
|
2月前
|
算法 Python
【Python篇】Python 类和对象:详细讲解(中篇)
【Python篇】Python 类和对象:详细讲解(中篇)
37 2
|
2月前
|
存储 C++ Python
【Python篇】Python 类和对象:详细讲解(上篇)
【Python篇】Python 类和对象:详细讲解(上篇)
50 2
|
3月前
|
前端开发 Python
Python编程的面向对象有哪些(二)
Python编程的面向对象(二)—类的多态
27 7