• 股票分析中的 KDJ指标


    最近炒股想学习点新玩意

    Intro

    • KDJ 指标又叫 随机指标(Stochastic Indicator)。最早起源于期货市场,由乔治·莱恩(George Lane)首创。KDJ 由判断股票的超买超卖现象的KD指标而来,并融合了移动平均线速度上的观念,形成比较准确的买卖信号依据。

    RSV 未成熟随机值

    • RSV 指标主要用来分析市场是处于“超买”还是“超卖”状态。
    • RSV 高于80%时候市场即为超买状况,行情即将见顶,应当考虑出仓
    • RSV 低于20%时候,市场为超卖状况,行情即将见底,此时可以考虑进仓
    • 计算公式:
      RSV = C − L n H n − L n × 100 C = 收 盘 价 L n = 之 前 n 日 内 的 最 低 价 H n = 之 前 n 日 内 的 最 高 价
      RSV=CLnHnLn×100C=Ln=nHn=n" role="presentation">RSV=CLnHnLn×100C=Ln=nHn=n
      RSVCLnHn=HnLnCLn×100==n=n

    KDJ 计算

    • K 值计算:
      K i = 2 3 K i − 1 + 1 3 RSV i K_i = \frac{2}{3}K_{i - 1} + \frac{1}{3}\text{RSV}_i Ki=32Ki1+31RSVi
      • i − 1 i-1 i1 为前一天。
      • 若无前一天的值,则用50来代替。
    • D 值计算:
      D i = 2 3 D i − 1 + 1 3 K i D_i = \frac{2}{3}D_{i - 1} + \frac{1}{3}K_i Di=32Di1+31Ki
    • J 值计算:
      J i = 3 K i − 2 D i J_i = 3K_i - 2D_i Ji=3Ki2Di

    一般原则

    1. D%>80,市场超买;D%<20,市场超卖。
    2. J%>100,市场超买;J%<10,市场超卖。
    3. KD金叉:K%上穿D%,为买进信号。
    4. KD死叉:K%下破D%,为卖出信号。

    Python 代码

    计算 KDJ (9, 3, 3)

    # kdj = (933)
    def cal_kdj(data_from):
        day_period = 9
        k_period = 3 - 1
        d_period = 3 - 1
    
        # 9个交易日内最低价
        lowest = data_from.iloc[::-1]['low'].rolling(day_period, min_periods=1).min()[::-1]
        # 9个交易日内最高价
        highest = data_from.iloc[::-1]['high'].rolling(day_period, min_periods=1).max()[::-1]
    	# 初始化输出列表
        data_out = pd.DataFrame(columns=['trade_date', 'high', 'low', 'K', 'D', 'J'])
        # 若存在 NA
        if (highest.isna().sum() | lowest.isna().sum()):
            return False
    
        # 计算rsv值
        rsv = 100 * (data_from.iloc[:]['close'] - lowest)/ (highest - lowest)
        rsv.fillna(value=100.00, inplace=True)
        
        data_out['trade_date'] = data_from['trade_date']
        data_out['high'] = highest
        data_out['low'] = lowest
    
        # J=3*K-2*D
        data_out['K'] = rsv.iloc[::-1].ewm(com=k_period, adjust=False).mean()[::-1]
        data_out['D'] = data_out.iloc[::-1]['K'].ewm(com=d_period, adjust=False).mean()[::-1]
        data_out['J'] = 3 * data_out['K'] - 2 * data_out['D']
    
        return data_out
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30

    一些无用的想法

    • 是否可以求RSV去预知大概价格,结论:不能!

    是否可获得目标价格?

    • 计算公式:
      RSV = C − L n H n − L n × 100 rsv = C − L n H n − L n H n − L n = C − L n rsv H n = C − L n rsv + L n = C rsv + r s v × L n − L n rsv
      RSV=CLnHnLn×100rsv=CLnHnLnHnLn=CLnrsvHn=CLnrsv+Ln=Crsv+rsv×LnLnrsv" role="presentation" style="position: relative;">RSV=CLnHnLn×100rsv=CLnHnLnHnLn=CLnrsvHn=CLnrsv+Ln=Crsv+rsv×LnLnrsv
      RSVrsvHnLnHn=HnLnCLn×100=HnLnCLn=rsvCLn=rsvCLn+Ln=rsvC+rsvrsv×LnLn
    • rsv → 1 \text{rsv} \rightarrow 1 rsv1 r s v × L n − L n rsv → 0 \frac{{rsv} × L_n - L_n}{\text{rsv}} \rightarrow 0 rsvrsv×LnLn0,最大值基于收盘价,因此无法基于KDJ 值判断目标价格。
    • 条件 (A股 ± \pm ± 10%):
      • C = a ⋅ C i − 1 , a ∈ [ 0.9 , 1.1 ] C = a \cdot C_{i-1}, a\in[0.9, 1.1] C=aCi1,a[0.9,1.1],下标 i − 1 i-1 i1 为前一天
      • H n ≥ H n − 1 H_n \geq H_{n-1} HnHn1 that H n = b ⋅ H n − 1 , b ∈ [ 1 , 1.1 ] H_n = b \cdot H_{n-1}, b \in [1, 1.1] Hn=bHn1,b[1,1.1] (涨停)

    目标 D 值

    • 已知: K i − 1 , D i − 1 K_{i-1}, D_{i-1} Ki1,Di1
    • 计算公式:
      D i = 2 3 D i − 1 + 1 3 K i = 2 3 D i − 1 + 1 3 ( 2 3 K i − 1 + 1 3 RSV i ) = 2 9 K i − 1 + 1 9 RSV i + 2 3 D i − 1 RSV i = 9 D i − 2 K i − 1 − 6 D i − 1
      Di=23Di1+13Ki=23Di1+13(23Ki1+13RSVi)=29Ki1+19RSVi+23Di1RSVi=9Di2Ki16Di1" role="presentation" style="position: relative;">Di=23Di1+13Ki=23Di1+13(23Ki1+13RSVi)=29Ki1+19RSVi+23Di1RSVi=9Di2Ki16Di1
      DiRSVi=32Di1+31Ki=32Di1+31(32Ki1+31RSVi)=92Ki1+91RSVi+32Di1=9Di2Ki16Di1

    目标 J 值

    • 已知: K i − 1 , D i − 1 K_{i-1}, D_{i-1} Ki1,Di1
    • 计算公式:
      J i = 3 K i − 2 D i = 3 K i − 2 ( 2 3 D i − 1 + 1 3 K i ) = 7 3 K i − 4 3 D i − 1 = 7 3 ( 2 3 K i − 1 + 1 3 RSV i ) − 4 3 D i − 1 = 14 9 K i − 1 + 7 9 RSV i − 4 3 D i − 1 RSV i = 9 7 J i − 2 K i − 1 + 12 7 D i − 1
      Ji=3Ki2Di=3Ki2(23Di1+13Ki)=73Ki43Di1=73(23Ki1+13RSVi)43Di1=149Ki1+79RSVi43Di1RSVi=97Ji2Ki1+127Di1" role="presentation" style="position: relative;">Ji=3Ki2Di=3Ki2(23Di1+13Ki)=73Ki43Di1=73(23Ki1+13RSVi)43Di1=149Ki1+79RSVi43Di1RSVi=97Ji2Ki1+127Di1
      JiRSVi=3Ki2Di=3Ki2(32Di1+31Ki)=37Ki34Di1=37(32Ki1+31RSVi)34Di1=914Ki1+97RSVi34Di1=79Ji2Ki1+712Di1

    KDJ 边界

    • K 值与D值 计算都与 RSV 正相关
    • 因此可计算RSV 边界 得出 KDJ 边界值
    • RSV 边界:
      RSV max ⁡ = 1.1 × C i − 1 − L n H n − 1 − L n × 100 RSV min ⁡ = 0.9 × C i − 1 − L n 1.1 × H n − 1 − L n × 100
      RSVmax=1.1×Ci1LnHn1Ln×100RSVmin=0.9×Ci1Ln1.1×Hn1Ln×100" role="presentation" style="position: relative;">RSVmax=1.1×Ci1LnHn1Ln×100RSVmin=0.9×Ci1Ln1.1×Hn1Ln×100
      RSVmaxRSVmin=Hn1Ln1.1×Ci1Ln×100=1.1×Hn1Ln0.9×Ci1Ln×100
    • 全局条件 H ≥ C , L ≤ C H \geq C, L \leq C HC,LC
    def get_rsv(close, high, low):
        return (close - low)/(high - low) * 100
    
    def get_K(rsv, K1):
        return (rsv + 2*K1)/3
    
    def get_D(rsv, K1, D1):
        return (rsv + 2*K1 + 6*D1)/9
    
    def get_J(rsv, K1, D1):
        return (7*rsv + 14*K1 - 12*D1)/9
    
    def target_D(D0, K1, D1):
        return 9 * D0 - 2 * K1 - 6 * D1
    
    def target_J(J0, K1, D1):
        return 9/7 * J0 - 2 * K1 + 12/7 * D1
    
    def target_price(rsv, low, high):
        return high * rsv - (low * rsv - low)
    
    def rsv_max(close, high, low):
        l_close = 1.1 * close
        l_high = high
        if l_close > l_high:
            l_high = l_close
        return get_rsv(l_close, l_high, low)
    
    def rsv_min(close, high, low):
        l_high = 1.1 * high
        if l_high > (1.1 * close):
            l_high = max(1.1 * close, high)
        l_close = 0.9 * close
        l_low = min(low, l_close)
        return get_rsv(l_close, l_high, l_low)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35

    • 以我近期购买的一个股票为例:
    • 在一定值范围内可以预知,但超出后起KDJ 不变。
      kdj for j
  • 相关阅读:
    基于文化算法优化的神经网络预测研究(Matlab代码实现)
    【Objective -- C】—— block
    javaScript:碰撞检测
    jxTMS设计思想之流程开发(二)
    Solon 1.6.33 发布,更现代感的应用开发框架
    75基于matlab的模拟退火算法优化TSP(SA-TSP),最优路径动态寻优,输出最优路径值、路径曲线、迭代曲线。
    redis之Bitmap
    08【子查询】
    SpringBoot | SpringBoot多种过滤器配置方式
    LightningChart .NET v10.3.2
  • 原文地址:https://blog.csdn.net/Varalpha/article/details/123156282