最近炒股想学习点新玩意
Stochastic Indicator
- Intro
- RSV 未成熟随机值
- KDJ 计算
- 一般原则
- Python 代码
-
- 一些无用的想法
-
- 是否可获得目标价格?
- 目标 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=Hn−LnC−Ln×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=32Ki−1+31RSVi
- i − 1 i-1 i−1 为前一天。
- 若无前一天的值,则用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=32Di−1+31Ki
- J 值计算:
J i = 3 K i − 2 D i J_i = 3K_i - 2D_i Ji=3Ki−2Di
一般原则
- D%>80,市场超买;D%<20,市场超卖。
- J%>100,市场超买;J%<10,市场超卖。
- KD金叉:K%上穿D%,为买进信号。
- KD死叉:K%下破D%,为卖出信号。
Python 代码
计算 KDJ (9, 3, 3)
def cal_kdj(data_from):
day_period = 9
k_period = 3 - 1
d_period = 3 - 1
lowest = data_from.iloc[::-1]['low'].rolling(day_period, min_periods=1).min()[::-1]
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'])
if (highest.isna().sum() | lowest.isna().sum()):
return False
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
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 = 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} RSVrsvHn−LnHn=Hn−LnC−Ln×100=Hn−LnC−Ln=rsvC−Ln=rsvC−Ln+Ln=rsvC+rsvrsv×Ln−Ln
- 当 rsv → 1 \text{rsv} \rightarrow 1 rsv→1, r s v × L n − L n rsv → 0 \frac{{rsv} × L_n - L_n}{\text{rsv}} \rightarrow 0 rsvrsv×Ln−Ln→0,最大值基于收盘价,因此无法基于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=a⋅Ci−1,a∈[0.9,1.1],下标 i − 1 i-1 i−1 为前一天
- H n ≥ H n − 1 H_n \geq H_{n-1} Hn≥Hn−1 that H n = b ⋅ H n − 1 , b ∈ [ 1 , 1.1 ] H_n = b \cdot H_{n-1}, b \in [1, 1.1] Hn=b⋅Hn−1,b∈[1,1.1] (涨停)
目标 D 值
- 已知: K i − 1 , D i − 1 K_{i-1}, D_{i-1} Ki−1,Di−1
- 计算公式:
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=32Di−1+31Ki=32Di−1+31(32Ki−1+31RSVi)=92Ki−1+91RSVi+32Di−1=9Di−2Ki−1−6Di−1
目标 J 值
- 已知: K i − 1 , D i − 1 K_{i-1}, D_{i-1} Ki−1,Di−1
- 计算公式:
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=3Ki−2Di=3Ki−2(32Di−1+31Ki)=37Ki−34Di−1=37(32Ki−1+31RSVi)−34Di−1=914Ki−1+97RSVi−34Di−1=79Ji−2Ki−1+712Di−1
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=Hn−1−Ln1.1×Ci−1−Ln×100=1.1×Hn−1−Ln0.9×Ci−1−Ln×100
- 全局条件 H ≥ C , L ≤ C H \geq C, L \leq C H≥C,L≤C
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 不变。