ストキャスティクス(Stochastics)
ストキャスティクスは、直近 N 期間の値幅のなかで終値がどこに位置するかを 0 から 100 で表し、過熱と反転候補を検出するオシレーターです。RSI より反応が速く、レンジ相場の逆張り補助に向きます。単体で使うより、ADX によるレジーム判定や RSI とのクロス確認と組み合わせるのが実践的です。

架空データによるイメージ図(実際の相場データではありません)。下段が %K と %D。80以上(買われすぎ)と20以下(売られすぎ)を色で示した例。
定義
ストキャスティクスは 1950 年代に George C. Lane が発表したモメンタム系オシレーターです(書籍化は 1978 年頃)。直近レンジのどこに現在の終値がいるかを数値化します。
Fast ストキャスティクス
Fast %K は直近 N 期間の高安レンジ内での終値位置です。
- 分母は過去 N 期間の高値から安値を引いたレンジ幅
- 分子は終値から過去 N 期間の安値を引いたレンジ底からの距離
- Fast %K が 100 なら終値は過去 N 期間の高値
- Fast %K が 0 なら終値は過去 N 期間の安値
- Fast %K が 50 なら終値はレンジ中央
Fast %D は Fast %K の M 期間 SMA です。
Slow ストキャスティクス
Fast %K はノイズが激しいため、実務では Slow を使います。
Slow %K は Fast %D と等しい入れ子構造です。標準は Fast %K の期間 14、smoothing 3。
Full ストキャスティクス
K 期間、K smoothing、D smoothing の 3 つのパラメータをすべて独立に指定する版です。
Full 14-3-3 は Slow 14-3 と等しくなります。実務では Slow か Full を使い、Fast は解析用途で使います。
パラメータと期間
| バージョン | 表記 | 意味 |
|---|---|---|
| Fast | (14, 3) | 短期用、ノイズ多い |
| Slow | (14, 3) | 標準。Fast %D を再平滑 |
| Full | (14, 3, 3) | Slow と同等の柔軟版 |
| パラメータ | 標準 | 意味 |
|---|---|---|
| K 期間 | 14 | 高安レンジの計算期間 |
| K smoothing | 3 | Slow / Full での K 平滑 |
| D smoothing | 3 | %D の平滑期間 |
| 閾値 | 20 / 80 | 買われすぎ / 売られすぎ |
USD/JPY の時間足別の設定例です。
| 時間足 | 設定 | 主な用途 |
|---|---|---|
| 5分 | (14, 3, 3) | 東京仲値のトレンド追随、短期リバウンド |
| 15分 | (14, 3, 3) | デイトレのレンジ逆張り、ダイバージェンス |
| 1時間 | (14, 3, 3) | 押し目、戻り目のタイミング |
| 4時間 | (14, 3, 3) | スイングの過熱、反転候補 |
| 日足 | (14, 3, 3) | 週次レベルの過熱判定 |
シグナル
過熱ゾーンでの反転
古典的な使い方です。
- %K > 80 かつ %D > 80:買われすぎ。売り候補
- %K < 20 かつ %D < 20:売られすぎ。買い候補
- %K が 80 を上から下抜け:売りシグナル(%D 抜けで確定)
- %K が 20 を下から上抜け:買いシグナル(%D 抜けで確定)
閾値の 20 / 80 は Wilder(1978)や Lane 自身の推奨です。より保守的に 10 / 90、より攻撃的に 25 / 75 も使われます。
%K と %D のクロス
- %K が %D を上抜け:買いシグナル
- %K が %D を下抜け:売りシグナル
クロス位置によって意味が変わります。過熱ゾーン内のクロスは反転狙い、中央 50 付近のクロスは継続狙いです。
ダイバージェンス
価格とオシレーターの方向が食い違う状態で、勢いの鈍化を示します。
- 強気ダイバージェンス:価格が安値更新、%K が前回安値より高値で、売り勢いの減衰を示す
- 弱気ダイバージェンス:価格が高値更新、%K が前回高値より低値で、買い勢いの減衰を示す
ダイバージェンスは大転換の初期兆候として機能します。ただし RSI と同様、トレンド継続下では機能しないことも多いです。
バンドウォーク(張り付き)
強トレンド下では %K が 80 以上、または 20 以下に張り付き続けます。
- 上昇バンドウォーク:%K が 80 から 100 で推移。売りシグナルは無効
- 下落バンドウォーク:%K が 0 から 20 で推移。買いシグナルは無効
- 中心線 50 の割れが張り付き終了の目安
USD/JPY での使いどころ
ストキャスティクスはレンジ相場で最も機能します。ADX < 20 の環境と組み合わせます。
レンジ相場での逆張り
東京時間のレンジ相場(JST 10:00-14:00)が典型です。
- 15分足 %K < 20 かつ %K が上向きなら、レンジ下限での買い候補
- 15分足 %K > 80 かつ %K が下向きなら、レンジ上限での売り候補
- 損切りはレンジ幅の外
- 利確はレンジ中央、または反対側
RSI との組み合わせ
RSI よりストキャスティクスの方が反応が速いです。両方の過熱ゾーンが一致したときに確度を上げます。
- RSI > 70 かつ %K > 80:強い過熱
- RSI < 30 かつ %K < 20:強い売られすぎ
- RSI が中立で %K だけ極端なら、ストキャスティクスの一時的なノイズを疑う
東京仲値(JST 09:55)
- 09:30-09:55 の急上昇で %K が 80 以上へ張り付く動きが典型
- 仲値通過後の %K 反落と %D 下抜けで、一時反転を狙う
- ただし仲値後もトレンドが継続する日もある。ATR と組み合わせて普通の値幅範囲かを確認する
ロンドンオープン、NYオープン
- ロンドン初動の勢いで %K が過熱ゾーンに突入した場合、逆張りは避ける(バンドウォーク)
- NY 引け後(JST 05:00-08:00)の低ボラ帯では、%K はノイズで過熱判定が形骸化する
- 指標発表直後の 5-15 分は %K が急変する。指標日はエントリー保留が無難
スイングでの過熱判定
- 日足 %K > 80 が 3-5 日続く場合、週次レベルで過熱。押し目待ち候補
- 日足 %K が 80 から下抜ける場合、中期的な反落の初期兆候
- 週足 %K で見る月次の過熱は、大きなポジション整理の目安
落とし穴
- 強トレンドで逆張りしない:%K > 80 だから売り、%K < 20 だから買いは、バンドウォーク中に大損する典型。ADX と組み合わせてレンジかどうかを先に判定する
- Fast / Slow / Full を混同しない:プラットフォームで表示されるストキャスティクスが Fast か Slow か Full かを確認する。設定値 (14, 3, 3) が同じでも Fast と Slow で値が違う
- SMA と EMA を混同しない:原典は SMA。平滑を EMA に置き換えると挙動が変わり、原典と異なる別指標になる
- 短期化しすぎない:%K 期間 5-7 のような短期はノイズが激増し、過熱シグナルが乱発されて信頼できない
- ダイバージェンスを盲信しない:ダイバージェンスは起こったから必ず反転ではない。トレンド継続時はダイバージェンスが継続することがある
- 50 中心線の解釈を忘れない:%K > 50 は買い優勢、%K < 50 は売り優勢という基本を忘れて過熱ゾーンだけ見ると、全体像を失う
- 通貨ペア間で閾値を混用しない:EUR/USD と GBP/JPY では過熱の普通の水準が異なる。ペアごとの %K 分布を確認する
- 指標発表後の急変に注意する:指標直後は分母(高安レンジ)が急拡大する。過去 N 期間の高安に急変値が入り、%K が急変する。指標後 30 分はシグナル判定を保留する
- RSI と単純比較しない:RSI とストキャスティクスは似ているが違う指標。両方が同時に過熱を示すのは強い一致だが、片方だけのときは要注意
- 教科書シグナルの実データ有意性:RSI の逆張り閾値は、統計的に有意ではないが完全棄却でもない灰色帯にとどまるという検証がある。ストキャスティクス系も類似の傾向が予想される。単体依存せず、レジーム判定と他指標の confluence で使う
Python 実装スケッチ
import pandas as pd
def stochastic( high: pd.Series, low: pd.Series, close: pd.Series, n: int = 14, k_smoothing: int = 3, d_smoothing: int = 3, mode: str = "slow", # "fast", "slow", "full") -> pd.DataFrame: lowest = low.rolling(window=n, min_periods=n).min() highest = high.rolling(window=n, min_periods=n).max() fast_k = 100.0 * (close - lowest) / (highest - lowest)
if mode == "fast": k = fast_k d = fast_k.rolling(window=d_smoothing, min_periods=d_smoothing).mean() elif mode == "slow": # Slow %K = Fast %D k = fast_k.rolling(window=k_smoothing, min_periods=k_smoothing).mean() d = k.rolling(window=d_smoothing, min_periods=d_smoothing).mean() elif mode == "full": k = fast_k.rolling(window=k_smoothing, min_periods=k_smoothing).mean() d = k.rolling(window=d_smoothing, min_periods=d_smoothing).mean() else: raise ValueError(f"unknown mode: {mode}")
return pd.DataFrame({"k": k, "d": d})min_periods で warm-up 期間を NaN にします。デフォルトで Slow (14, 3, 3) です。
シグナル判定のヘルパーです。
def stochastic_signals( stoch: pd.DataFrame, upper: float = 80.0, lower: float = 20.0,) -> pd.DataFrame: out = stoch.copy() out["overbought"] = (out["k"] > upper) & (out["d"] > upper) out["oversold"] = (out["k"] < lower) & (out["d"] < lower) out["k_cross_d_up"] = (out["k"] > out["d"]) & (out["k"].shift(1) <= out["d"].shift(1)) out["k_cross_d_down"] = (out["k"] < out["d"]) & (out["k"].shift(1) >= out["d"].shift(1)) out["mid_cross_up"] = (out["k"] > 50) & (out["k"].shift(1) <= 50) out["mid_cross_down"] = (out["k"] < 50) & (out["k"].shift(1) >= 50) return outダイバージェンス検出は、価格の高安と %K の高安を独立に検出し、乖離を判定します。実装は複雑になるため、機械化前提なら別途 pivot detection を組み合わせます。
参考
- George C. Lane, “Lane’s Stochastics”, Technical Analysis of Stocks and Commodities 誌, 1984 頃
- Perry J. Kaufman, Trading Systems and Methods, Wiley, 6th ed. 2020 (Chapter 9)
- Investopedia — “Stochastic Oscillator”
- StockCharts — “Stochastic Oscillator (Fast, Slow, and Full)”