ストキャスティクスと移動平均の組み合わせ — 傾きで環境を決め、クロスで押しを拾う設計
ストキャスティクス(Stochastic Oscillator)は、一定期間の高値と安値の幅のなかで、現在の終値がどのあたりにあるかを0〜100で示すオシレーターです。移動平均線(Moving Average)は、一定期間の価格を平均してなめらかにした線で、相場の大まかな方向を読む基本ツールです。
この2つを組み合わせると、「移動平均で取引してよい方向を先に決め、その方向に沿ったストキャスティクスのクロスだけを採用する」という絞り込みの設計が組めます。ストキャスティクスは反応が速い分、単独ではシグナルが多くなりがちです。そこに移動平均という環境フィルターを重ね、逆方向のシグナルを最初から捨てるのが狙いです。本記事は、オシレーターのシグナルが多すぎて扱いに困っている方や、シンプルな二層構造のcBotを最初に作ってみたい方を想定しています。特定の設定が成果を保証するものではなく、設計の考え方の整理として読んでください。
移動平均の役割
最初に、環境判定を担う移動平均がどんな情報を返すのかを確認します。
移動平均から読み取れる情報は、大きく分けて2つあります。ひとつは傾きで、平均値そのものが上向きか下向きかを示します。もうひとつは価格との位置関係で、終値が線の上にあるか下にあるかです。この2つがそろって同じ方向を指している状態を「環境が定まっている」とみなすのが、本記事の基本的な考え方です。基礎は移動平均線とはで解説しています。
単独で使う場合は、価格と線のクロスや、短期線と長期線のゴールデンクロス・デッドクロスが代表的な判断材料になります。
ただし限界もあります。移動平均は過去の平均である以上、方向の変化を認識するのはどうしても後になります。また、横ばいの相場では線が水平に近づき、価格が線を何度も上下に横切ります。この状態でクロスを売買の合図に使うと、往復の判断を繰り返すことになりがちです。さらに、移動平均は「どこで入るか」についての情報をほとんど持っていません。上向きであることは分かっても、いま入るのが高値づかみなのか押しの底なのかまでは教えてくれません。
ストキャスティクスの役割
次に、タイミングを担うストキャスティクスの性格を整理します。
ストキャスティクスは、直近の高値と安値の幅を100としたとき、終値がどの位置にあるかを示す%Kと、%Kを平滑化した%Dの2本で構成されます。一般に80以上が買われ過ぎ、20以下が売られ過ぎの目安とされ、%Kが%Dを下から上へ抜けるクロスが反転の候補として扱われます。詳しくはストキャスティクスとはにまとめています。
単独で使うときの最大の弱点は、強いトレンドで高水準や低水準に張り付くことです。上昇が続く局面ではストキャスティクスが80以上にとどまり続け、「買われ過ぎだから下がるはず」という読みが外れ続ける原因になります。もうひとつの弱点はシグナルの多さです。反応が速い設計のため、小さな揺れでもクロスが発生し、そのすべてを同じ重みで扱うと判断がぶれやすくなります。
裏を返せば、ストキャスティクスはどちらに向かうべきかという前提さえあれば、短い押しや戻りの終わりを敏感に拾える道具だといえます。その前提を外から与えるのが、組み合わせの出発点です。
なぜこの組み合わせか
両者の弱点がどう噛み合うのかを、理屈の面から整理します。
移動平均は「方向」を持っていますが、「いつ入るか」を持っていません。ストキャスティクスは「短い波の転換点」を持っていますが、「どちらの波が本流か」を持っていません。互いに欠けている情報を補完し合う関係にあると考えられます。
判定の組み立て例は次のとおりです。
- 移動平均が上向き + 終値が線より上 + ストキャスティクスが売られ過ぎ圏で上抜けクロス → 上方向の押し目候補として検討する材料
- 移動平均が上向き + ストキャスティクスが買われ過ぎ圏で下抜けクロス → 本流と逆向きのため採用しない
- 移動平均が下向き + 終値が線より下 + 買われ過ぎ圏で下抜けクロス → 下方向の戻り候補として検討する材料
- 傾きと位置が食い違う(線は上向きだが終値が線の下など) → 環境が定まっていないとみなし見送る材料
ここでのポイントは、ストキャスティクスの「張り付き」問題が、構造的に半分解消されることです。上向きの環境では買われ過ぎ圏のシグナルをそもそも使わないため、80以上に張り付いても判断を誤る余地がありません。押しの局面で一時的に売られ過ぎ圏まで下がり、そこから戻り始めたクロスだけを拾う形になるため、ノイズフィルターとして機能することが期待されます。押し目という考え方そのものは押し目と戻りとはで整理しています。
一方で、この組み合わせにも明確な限界があります。移動平均の傾きが転換する直前、つまりトレンドの終盤では、環境フィルターは「まだ上向き」と判定し続けます。その間に出た押し目候補は、実際にはトレンドの終わりだったということも起こりえます。環境判定の遅れはこの構造では解消されない点を、前提として持っておく必要があります。
パラメータをどう考えるか
パラメータに唯一の正解はないため、ここでは方向性のみを整理します。
移動平均は、環境判定に使う以上、ストキャスティクスよりも明確に長い期間を選ぶのが自然です。短すぎると傾きが頻繁に入れ替わり、フィルターとしての意味が薄れます。長すぎると方向転換の認識がさらに遅れます。単純移動平均(SMA)か指数平滑移動平均(EMA)かも、反応速度の好みで選ぶ部分です。傾きの判定は、数本前の値との差で見るのが簡単ですが、差をATR(平均真の値幅)で割って正規化しておくと、銘柄や時間足をまたいで同じ基準を使いやすくなります。
ストキャスティクスは、%Kの期間・スロー化の期間・%Dの期間の3つを持ちます。スロー化を強めるとクロスの回数は減り、反応は遅くなります。売られ過ぎ・買われ過ぎの判定ラインを20/80とするか、25/75のように内側へ寄せるかでも、シグナルの頻度と押しの深さが変わります。
時間足については、上位足の移動平均で環境を決め、下位足のストキャスティクスでタイミングを測る構成も検討に値します。考え方はマルチタイムフレームの移動平均組み合わせも参考にしてください。どの設定でも、運用する銘柄と時間足でバックテストを行い、シグナル頻度や連敗の深さを確かめてから採用する手順は省かないことが重要です。
cBot化する際の考慮点
ここからは、cTraderのcBotに組み込む際の設計上のポイントを整理します。
確定足で判定する: ストキャスティクスは未確定の足の途中でクロスが出たり消えたりします。判定はOnBarで行い、確定済みの1本前(Last(1))と2本前(Last(2))を比べてクロスを検出する設計が安定します。
クロスとゾーンの条件を分ける: 「売られ過ぎ圏でのクロス」は、クロスした足の%Kが20以下なのか、直前に20以下を経験していればよいのかで意味が変わります。後者を採る場合は、「売られ過ぎ圏に入った」というフラグを保持し、クロスで発火、環境が変わったらリセットする状態管理が必要です。
環境の食い違いを明示的に扱う: 傾きと価格位置が食い違う状態は、条件分岐のなかで暗黙に落ちがちです。Up / Down / Undefined の3状態として明示しておくと、見送りの理由をログに残しやすくなります。
足数不足のガード: 長期の移動平均は、計算に必要な本数がそろうまで値が不安定です。Bars.Countが移動平均の期間と傾き判定の参照本数の合計を下回る間は、判定しない分岐を入れます。
ポジション管理との連携: 押し目候補で入る場合、損切候補は押しの安値や移動平均の少し外側に置く設計が考えられます。損切までの距離からロットを逆算する構造にしておくと、許容リスクを一定に保ちやすくなります。
// 例: 環境判定(移動平均)とタイミング判定(ストキャスティクス)の分離
var ma = Indicators.ExponentialMovingAverage(Bars.ClosePrices, 100);
var stoch = Indicators.StochasticOscillator(14, 3, 3, MovingAverageType.Simple);
var atr = Indicators.AverageTrueRange(14, MovingAverageType.Simple);
if (Bars.Count < 100 + 5) return; // 計算に必要な本数が不足
double slope = (ma.Result.Last(1) - ma.Result.Last(5)) / atr.Result.Last(1);
bool above = Bars.ClosePrices.Last(1) > ma.Result.Last(1);
var env = (slope > 0 && above) ? Env.Up
: (slope < 0 && !above) ? Env.Down
: Env.Undefined;
double k1 = stoch.PercentK.Last(1), d1 = stoch.PercentD.Last(1);
double k2 = stoch.PercentK.Last(2), d2 = stoch.PercentD.Last(2);
if (env == Env.Up && k1 <= 20) oversoldArmed = true; // 売られ過ぎ圏を記録
bool crossUp = k2 <= d2 && k1 > d1;
bool signal = env == Env.Up && oversoldArmed && crossUp;
if (signal || env != Env.Up) oversoldArmed = false; // 発火または環境変化で解除
// signal を判断材料のひとつとして扱う
実装の流れ
全体の処理を、入力から出力までの流れで整理します。
- 入力: 対象銘柄・時間足の確定足を
OnBarで受け取る - 環境判定: 移動平均の傾き(ATRで正規化)と終値の位置から、
Up/Down/Undefinedを決める - 状態更新: 環境が変わったらゾーン経験フラグをリセット。変わらなければストキャスティクスの水準からフラグを進める
- タイミング判定: 環境と同じ向きのクロスだけを検出し、ゾーン経験フラグと照合する
- 出力: 候補が出たら損切候補を決めてロットを逆算し、発注またはログへ渡す
環境とタイミングを別の層に分けておけば、移動平均をほかのトレンド指標に差し替える、ストキャスティクスの判定ラインだけを検証し直す、といった変更を局所的に行えます。
どう活用するか
最後に、立場別の使い方をまとめます。
自作派の方は、本記事の「環境は移動平均、タイミングはストキャスティクス」という二層構造を、Claude Code を使ったcBot開発の最初の題材にしてみてください。構造が単純な分、状態管理とログ出力の練習に向いています。委託派の方は、ai-programming.xyzへの相談時に「移動平均の傾きと位置で環境を決め、同方向のストキャスティクスのクロスだけを拾いたい」と伝えていただくと、要件のすり合わせが進めやすくなります。教育派の方は、スクールで環境フィルターの考え方を学ぶ際の比較材料として活用できます。
本記事は一般的な情報提供を目的としています。投資助言ではありません。 取引判断はご自身の責任で行ってください。