J 线冲到 100 以上或者掉到 0 以下,是 KDJ 公式本来就会算出的结果,J 出界这件事本身不说明数据有错。K 值是 76、D 值是 62 时,最后一步 J = 3K − 2D 给出的是 3 × 76 − 2 × 62 = 104。K 和 D 被前面的算法限制在 0 到 100 之间,J 这一步没有这个限制,K 离 D 越远,J 冲出去越多。
拿 KDJ 去和海外图表里的 Stoch(Stochastic,随机指标)比,两边读数对不上,原因在算法。两者第一步是同一个算式,算的都是收盘价在最近 N 根 K 线高低区间里的位置;往后 KDJ 用 2/3、1/3 的递推,Stoch 用简单移动平均,常用周期一个是 9,一个是 14。
想自己复核软件上的读数,要用的是每根 K 线的最高价、最低价和收盘价这三种价格,每一步的算式都列在下面。
1. KDJ 计算公式里的 RSV、K 值、D 值和 J 值
KDJ 的算法,一家券商的中文帮助中心写成这样四行:
RSV(n 日)= (Cn − Ln) ÷ (Hn − Ln) × 100K 值 = 2/3 × 前一日 K 值 + 1/3 × 当日 RSVD 值 = 2/3 × 前一日 D 值 + 1/3 × 当日 K 值J 值 = 3 × 当日 K 值 − 2 × 当日 D 值
Cn 是第 n 日的收盘价,Ln 是 n 日内的最低价,Hn 是 n 日内的最高价,n 一般取 9 日。RSV 在那里叫未成熟随机指标值。这家券商的 KDJ 入门文章多交代了两处:前一日没有 K 值和 D 值的,可改用 50;KDJ 的取值范围是 0 至 100,J 值有时会超出。
取 n = 9,用一组自设的 11 根日 K 把四行公式走到底。前 8 天凑不够 9 根,出不了 RSV,从第 9 日起每天一组数:
| 第几日 | 最高 | 最低 | 收盘 | RSV | K | D | J |
|---|---|---|---|---|---|---|---|
| 1 | 6,412 | 6,400 | 6,408 | — | — | — | — |
| 2 | 6,420 | 6,405 | 6,416 | — | — | — | — |
| 3 | 6,428 | 6,410 | 6,422 | — | — | — | — |
| 4 | 6,440 | 6,418 | 6,436 | — | — | — | — |
| 5 | 6,446 | 6,424 | 6,428 | — | — | — | — |
| 6 | 6,460 | 6,426 | 6,455 | — | — | — | — |
| 7 | 6,471 | 6,450 | 6,468 | — | — | — | — |
| 8 | 6,484 | 6,462 | 6,480 | — | — | — | — |
| 9 | 6,500 | 6,476 | 6,495 | 95 | 65 | 55 | 85 |
| 10 | 6,505 | 6,490 | 6,503 | 98 | 76 | 62 | 104 |
| 11 | 6,510 | 6,498 | 6,507 | 97 | 83 | 69 | 111 |
第 9 日往回数 9 根,是第 1 到第 9 日。9 个最高价里最大的是当天的 6,500,9 个最低价里最小的是第 1 日的 6,400,当天收在 6,495:
RSV = (6,495 − 6,400) ÷ (6,500 − 6,400) × 100 = 95
第 8 日没有 K 值和 D 值,两个都用 50。表里从 50 起算,是为了把算法演示出来;拿去和软件上的读数比,要往前多取一些 K 线再起算,最前面几个数受 50 的影响最大。2/3 × 前值 + 1/3 × 新值,写成 (2 × 前值 + 新值) ÷ 3 更方便口算:
- K = (2 × 50 + 95) ÷ 3 = 65
- D = (2 × 50 + 65) ÷ 3 = 55
- J = 3 × 65 − 2 × 55 = 85
第 10 日的 9 根换成第 2 到第 10 日。第 1 日退了出去,最低价变成第 2 日的 6,405,最高价是当天的 6,505,收盘 6,503,RSV = (6,503 − 6,405) ÷ (6,505 − 6,405) × 100 = 98。前一日的 K 和 D 这回有了,是 65 和 55:K = (2 × 65 + 98) ÷ 3 = 76,D = (2 × 55 + 76) ÷ 3 = 62,J = 3 × 76 − 2 × 62 = 104。
第 11 日看第 3 到第 11 日,最低 6,410,最高 6,510,收盘 6,507,RSV = (6,507 − 6,410) ÷ (6,510 − 6,410) × 100 = 97,比前一天小了 1。K = (2 × 76 + 97) ÷ 3 = 83,D = (2 × 62 + 83) ÷ 3 = 69,J = 3 × 83 − 2 × 69 = 111。RSV 回落了一点,J 反而更高。
2. 为什么 K 值和 D 值出不了 0 到 100 而 J 值可以?
RSV 的分子是收盘价减去 9 根里的最低价,分母是 9 根里的最高价减最低价。收盘价不会高过这 9 根的最高价,也不会低过最低价,分子就落在 0 和分母之间,RSV 落在 0 到 100 之间:收在区间最高点是 100,收在最低点是 0。
K 是前一日的 K 占两份、当日 RSV 占一份的加权平均。两个数都在 0 到 100 之间,平均值落在它们中间,从 50 起算的 K 也就一直留在这个区间里。D 对 K 再做一次同样的平均,道理相同。
J 这一行的两个系数是 3 和 −2,带了负号,已经算不上平均。把它拆开:
J = 3K − 2D = K + 2 × (K − D)
J 等于 K 再加上两倍的 K 与 D 之差。第 10 日 K 比 D 高 14,J = 76 + 2 × 14 = 104;第 11 日两条线仍差 14,K 升到 83,J 就是 83 + 28 = 111,那天 RSV 小了 1、J 还在升,原因在这里。K 是 76 的时候,D 只要低于 64,J 就在 100 之上。
方向倒过来也一样。RSV 连着三天是 5、2、3,同样从 50 起算,K 依次是 35、24、17,D 是 45、38、31,J 是 15、−4、−11,第二天就到了 0 以下。
K 自己最高只到 100,J 要越过 100,只能靠 K 和 D 之间的距离。RSV 停在高位不再变化的话,D 会一天天追上 K,差值缩小,J 也跟着落回 K 附近。
3. KDJ 和 TradingView 的 Stoch 读数对不上,差别在平滑方法和周期
Stoch 的全名是 Stochastic Oscillator,StockCharts 网站上有一篇《Stochastic Oscillator (Fast, Slow, and Full)》专讲它:由 George C. Lane 在 1950 年代后期提出,量的是收盘价在一段时间的高低区间里处在什么位置。原始算式是 %K = (当前收盘价 − 区间最低价) ÷ (区间最高价 − 区间最低价) × 100,默认取 14 个周期,%D 是 %K 的 3 日简单移动平均。这条 %K 和 KDJ 的 RSV 是同一个算式。Stochastic 自己还分三个版本:Fast 直接用这条 %K,Slow 先把它做一次 3 期简单平均,Full 的几个周期可以自己定。
TradingView 简体中文帮助页《随机指标 (STOCH)》的算式把这层平均写了进去:
%K = SMA(100 * (Current Close - Lowest Low) / (Highest High - Lowest Low), smoothK)%D = SMA(%K, periodD)
SMA 是简单移动平均。三个输入的默认值是 K 14、D 3、平滑 3,平滑填 1 会禁用对 %K 的额外平滑。图上只有 %K 和 %D 两条线,都在 0 和 100 之间移动,没有 J。内置指标里另有一个随机相对强弱指数,也就是 Stoch RSI,它是另一个指标,核对读数时别选成它。
差别出在平均的方式上。简单移动平均只看最近几个数,每个数分量相同:默认设置下的 %K 是最近 3 个原始值各占三分之一,再早的一概不算。KDJ 的递推把旧数一直留着:当日 RSV 占 1/3,前一日占 2/9,再前一日占 4/27,每往前一天乘一次 2/3。
放到第 11 日那根 K 线上:把 Stoch 的 K 周期也改成 9、平滑留 3,%K = (95 + 98 + 97) ÷ 3 ≈ 96.67;KDJ 的 K 是 83。83 里第 9 到第 11 日的三个 RSV 合计占 19/27,余下的 8/27 属于更早的数,在这 11 根日 K 里就是起算用的 50。周期用默认的 14 时,最高价、最低价要从 14 根里取,第一步的原始值就可能不一样。
| 指标 | 第一步算式 | 平滑方法 | 常用周期 | 超买 / 超卖线 |
|---|---|---|---|---|
| KDJ(券商帮助中心的写法) | RSV = (收盘价 − 区间最低价) ÷ (区间最高价 − 区间最低价) × 100 | K、D 都按 2/3 × 前一日的值 + 1/3 × 当日新值递推 | 9 | K 值 90 / 10,D 值 80 / 20 |
| Stochastic(TradingView 默认设置) | 100 × (收盘价 − 区间最低价) ÷ (区间最高价 − 区间最低价),同一个算式 | %K、%D 都是简单移动平均,各 3 期 | 14 | 80 / 20 |
4. KDJ 超买超卖线的几种画法和强趋势里停在超买区的读数
超买、超卖线画在哪,各家自己定。TradingView 的随机指标默认超卖 20、超买 80,并注明这是典型水平,但可能并不适合所有情况,要看交易的是什么品种;超买也并不总是意味着看跌,它可能是趋势加强的迹象,不一定是即将发生的逆转。
写四行公式的那家券商帮助中心把 K 值 90 以上算作超买、10 以下算作超卖,D 值 80 以上算作超买、20 以下算作超卖。这家券商另一页的 KDJ 入门文章是另一种写法:D 值高于 70 视为超买,低于 30 视为超卖。这三种画法都是给 K 值、D 值定的,Stochastic 那边叫 %K、%D;四行公式本身不带任何一条线。
读数进了超买区,也可以一直不出来。StockCharts 讲 Stochastic 的超买超卖读数时写到,超买不一定看跌:强劲的上涨趋势里,读数可以进入超买并一直留在那里,收盘价持续贴近区间上沿,表示买压在持续;强劲下跌趋势里的超卖是同样的道理。所以它主张先认清更大的趋势,上升趋势里留意偶尔出现的超卖读数,频繁出现的超买读数不去理会;它还提到,%K 与信号线 %D 的交叉、读数跌破 80 或升破 20 都出现得频繁,容易来回反复。趋势有多强,另有只量强弱、不分涨跌的 ADX 可以看。第 1 节那 11 根日 K 的后三根,收盘价一直贴着 9 日区间的上沿,RSV 是 95、98、97。
KDJ 这边,RSV 在高位停久了,D 追上 K,两条线靠得很近,交叉就来得容易。K 是 92、D 是 90 的次日,RSV 是 85:新的 K = (2 × 92 + 85) ÷ 3 ≈ 89.67,新的 D = (2 × 90 + 89.67) ÷ 3 ≈ 89.89,K 到了 D 的下方,而 RSV 85 说明收盘价仍在 9 日区间靠上的位置。
5. KDJ 公式里要自己定的数
把 KDJ 的 9 日换成别的周期公式会变吗?
四行公式不变,变的是 RSV 取最高价、最低价的那段区间。券商帮助中心把计算周期写作 n 日、n 周等:周线图上 n 取 9,用的是最近 9 根周 K 的最高价、最低价和最后一根的收盘价;n 换成 14,区间就是 14 根。K、D 两行的 2/3 和 1/3 不随 n 变。软件参数栏里若还有别的数,它们各管哪一步,要查那款软件自己的指标说明。
KDJ 从 50 起算会让前几天的数不准吗?
起算值会带偏最前面几天的读数,越往后越小。K 每过一天,旧的 K 只留下 2/3,起算的 50 在 K 里的份额到第三个 K 值是 8/27,约 29.63%;到第十个 K 值只剩 2/3 的十次方,约 1.73%。D 多做了一层平均,淡得更慢。自己复核时往前多取一些 K 线再起算,起算值留下的痕迹就小。