股票分析中的 KDJ指标

最近炒股想学习点新玩意

Stochastic Indicator

  • Intro
  • RSV 未成熟随机值
  • KDJ 计算
  • 一般原则
  • Python 代码
    • 计算 KDJ (9, 3, 3)
  • 一些无用的想法
    • 是否可获得目标价格?
    • 目标 D 值
    • 目标 J 值
    • 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 日 内 的 最 高 价 \begin{aligned}\text{RSV} &=\frac{C - L_n}{H_n - L_n}×100 \\ C &= 收盘价 \\ L_n &= 之前n日内的最低价 \\ H_n &= 之前n日内的最高价\end{aligned} 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

一些无用的想法

  • 是否可以求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 \begin{aligned}\text{RSV} &=\frac{C - L_n}{H_n - L_n}×100 \\ \text{rsv} &=\frac{C - L_n}{H_n - L_n} \\ H_n - L_n &= \frac{C - L_n}{\text{rsv}}\\ H_n &= \frac{C - L_n}{\text{rsv}} + L_n\\ &= \frac{C}{\text{rsv}}+ \frac{{rsv} × L_n - L_n}{\text{rsv}}\end{aligned} 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 \begin{aligned}D_i&= \frac{2}{3}D_{i - 1} + \frac{1}{3}K_i\\ &= \frac{2}{3}D_{i - 1} + \frac{1}{3}(\frac{2}{3}K_{i - 1} + \frac{1}{3}\text{RSV}_i)\\ &= \frac{2}{9}K_{i - 1} + \frac{1}{9}\text{RSV}_i + \frac{2}{3}D_{i - 1}\\ \text{RSV}_i &= 9D_{i} - 2K_{i-1} - 6D_{i - 1} \end{aligned} 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 \begin{aligned}J_i&= 3K_i - 2D_i\\ &= 3K_i - 2(\frac{2}{3}D_{i - 1} + \frac{1}{3}K_i)\\ &= \frac{7}{3}K_i - \frac{4}{3}D_{i - 1}\\ &= \frac{7}{3}(\frac{2}{3}K_{i - 1} + \frac{1}{3}\text{RSV}_i)- \frac{4}{3}D_{i - 1}\\ &= \frac{14}{9}K_{i - 1} + \frac{7}{9}\text{RSV}_i- \frac{4}{3}D_{i - 1}\\ \text{RSV}_i &= \frac{9}{7}J_i - 2K_{i-1} + \frac{12}{7}D_{i - 1} \end{aligned} 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 \begin{aligned}\text{RSV}_{\max} &=\frac{1.1 × C_{i-1} - L_n}{H_{n-1} - L_n}×100 \\ \text{RSV}_{\min} &=\frac{0.9 × C_{i-1} - L_n}{1.1 × H_{n-1} - L_n}×100\end{aligned} 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)

  • 以我近期购买的一个股票为例:
  • 在一定值范围内可以预知,但超出后起KDJ 不变。
    股票分析中的 KDJ指标_第1张图片

你可能感兴趣的:(Stock,python)