python实现KDJ指标模型 量化策略 python 策略开发

指标说明

KDJ指标中文名叫随机指标,是一种相当新颖、实用的技术分析指标,它起先用于期货市场的分析,后被广泛用于股市的中短期趋势分析,是期货和股票市场上最常用的技术分析工具。

随机指标KDJ一般是用于股票分析的统计体系,根据统计学原理,通过一个特定的周期(常为9日、9周等)内出现过的最高价、最低价及最后一个计算周期的收盘价及这三者之间的比例关系,来计算最后一个计算周期的未成熟随机值RSV,然后根据平滑移动平均线的方法来计算K值、D值与J值,并绘成曲线图来研判股票走势。

KDJ计算公式

KDJ的计算比较复杂,首先要选择周期(n日、n周等),再计算当天的未成熟随机值(即RSV值),然后再计算K值、D值、J值等。

(1) RSV的计算公式为:
在这里插入图片描述

公式中,
C为当天的收盘价;
Ln为之前n日内的最低价;
Hn为之前n日内的最高价。
(2) 某一天的K值=2/3×前一日K值+1/3×当日RSV。
在这里插入图片描述

Ki和RSVi分别表示某一天当天的K值和RSV值;
Ki-1表示前一天的K值,若无前一天的K值,则用50来代替。
(3) 某一天当天的D值=2/3×前一日D值+1/3×当日K值。
在这里插入图片描述

Di和Ki分别表示当天的D值和K值;
Di-1表示前一天的D值,若无前一天的D值,则用50来代替。
(4) J值=3×当日K值-2×当日D值。
在这里插入图片描述

'''
作者:Leo
微信:470770753
名称:KDJ指标
参数:span1,span2,span3分别代表三个数据的计算跨度
说明:输出格式:[k ,d,j]
'''
class kdj(object):
    '''
    名称:KDJ指标
    参数:span1,span2,span3分别代表三个数据的计算跨度
    说明:输出格式:[k ,d,j]
    '''
    def __init__(self,span1,span2,span3):
        self._span1=span1
        self._span2 = span2
        self._span3 = span3
        self._ldatalist = []
        self._hdatalist = []
        self._rsvlist=[]
        self._kdj_k=[]
        self._kdj_d = []
        self._kdj_j = []
        self._kdj_k_list=[]

    @property
    def span1(self):
        return self._span1
    @property
    def span2(self):
        return self._span2
    @property
    def span3(self):
        return self._span3

    def cal_kdj(self,data,ldata,hdata):

        self._ldatalist.append(ldata)
        self._hdatalist.append(hdata)
        self._ldatalist=self._ldatalist[-self._span1:]
        self._hdatalist = self._hdatalist[-self._span1:]
        ldataresult=min(self._ldatalist)
        hdataresult = max(self._hdatalist)
        rsv = (data - ldataresult) / (hdataresult - ldataresult) * 100
        self._rsvlist.append(rsv)
        rsv_series=pd.Series(self._rsvlist)

        kdj_k_median=rsv_series.ewm(ignore_na=False, com=(self._span2-1), min_periods=0, adjust=False).mean()

        if int(kdj_k_median[-1:])>100:
            kdj_k_median[-1:]=100
        if int(kdj_k_median[-1:])<0:
            kdj_k_median[-1:]=0

        self._kdj_k=float(kdj_k_median[-1:])

        self._kdj_k_list.append(float(kdj_k_median[-1:]))

        kdj_k_series=pd.Series(self._kdj_k_list)

        kdj_dm=kdj_k_series.ewm(ignore_na=False, com=(self._span3-1), min_periods=0, adjust=False).mean()

        self._kdj_d=float(kdj_dm[-1:])

        self._kdj_jm=3*self._kdj_k-2*self._kdj_d

        if self._kdj_jm>100:
            self._kdj_j=100
        if self._kdj_jm<0:
            self._kdj_j=0

        self._kdj_j=self._kdj_jm

        return [self._kdj_k,self._kdj_d,self._kdj_j]

你可能感兴趣的:(量化与python,python,开发语言)