最近炒股想学习点新玩意
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 = C − L n H n − L n × 100 C = 收 盘 价 L n = 之 前 n 日 内 的 最 低 价 H n = 之 前 n 日 内 的 最 高 价 " role="presentation">RSV C L n H n = C − L n H n − L n × 100 = 收 盘 价 = 之 前 n 日 内 的 最 低 价 = 之 前 n 日 内 的 最 高 价 RSV = C − L n H n − L n × 100 C = 收 盘 价 L n = 之 前 n 日 内 的 最 低 价 H n = 之 前 n 日 内 的 最 高 价
RSV C L n H n = H n − L n C − L n × 1 0 0 = 收 盘 价 = 之 前 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
K i = 3 2 K i − 1 + 3 1 RSV i
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
D i = 3 2 D i − 1 + 3 1 K i J 值计算:
J
i
=
3
K
i
−
2
D
i
J_i = 3K_i - 2D_i
J i = 3 K i − 2 D i
一般原则
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
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
=
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 = 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 " role="presentation" style="position: relative;">RSV rsv H n − L n H n = C − L n H n − L n × 100 = C − L n H n − L n = C − L n rsv = C − L n rsv + L n = C rsv + r s v × L n − L n 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 rsv H n − L n H n = H n − L n C − L n × 1 0 0 = H n − L n C − L n = rsv C − L n = rsv C − L n + L n = rsv C + rsv r s v × L n − L n 当
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
rsv r s v × L n − L n → 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 ⋅ C i − 1 , a ∈ [ 0 . 9 , 1 . 1 ] ,下标
i
−
1
i-1
i − 1 为前一天
H
n
≥
H
n
−
1
H_n \geq H_{n-1}
H n ≥ H n − 1 that
H
n
=
b
⋅
H
n
−
1
,
b
∈
[
1
,
1.1
]
H_n = b \cdot H_{n-1}, b \in [1, 1.1]
H n = b ⋅ H n − 1 , b ∈ [ 1 , 1 . 1 ] (涨停)
目标 D 值
已知:
K
i
−
1
,
D
i
−
1
K_{i-1}, D_{i-1}
K i − 1 , D i − 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
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 " role="presentation" style="position: relative;">D i RSV 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 = 9 D i − 2 K i − 1 − 6 D i − 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
D i RSV i = 3 2 D i − 1 + 3 1 K i = 3 2 D i − 1 + 3 1 ( 3 2 K i − 1 + 3 1 RSV i ) = 9 2 K i − 1 + 9 1 RSV i + 3 2 D i − 1 = 9 D i − 2 K i − 1 − 6 D i − 1
目标 J 值
已知:
K
i
−
1
,
D
i
−
1
K_{i-1}, D_{i-1}
K i − 1 , D i − 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
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 " role="presentation" style="position: relative;">J i RSV 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 = 9 7 J i − 2 K i − 1 + 12 7 D i − 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
J i RSV i = 3 K i − 2 D i = 3 K i − 2 ( 3 2 D i − 1 + 3 1 K i ) = 3 7 K i − 3 4 D i − 1 = 3 7 ( 3 2 K i − 1 + 3 1 RSV i ) − 3 4 D i − 1 = 9 1 4 K i − 1 + 9 7 RSV i − 3 4 D i − 1 = 7 9 J i − 2 K i − 1 + 7 1 2 D i − 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
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 " role="presentation" style="position: relative;">RSV max RSV min = 1.1 × C i − 1 − L n H n − 1 − L n × 100 = 0.9 × C i − 1 − L n 1.1 × H n − 1 − L n × 100 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
RSV max RSV min = H n − 1 − L n 1 . 1 × C i − 1 − L n × 1 0 0 = 1 . 1 × H n − 1 − L n 0 . 9 × C i − 1 − L n × 1 0 0 全局条件
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)
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 不变。