VWAPとATRを組み合わせる考え方 — 実勢平均からの乖離を変動幅の物差しで測る設計

「その日の取引の重心」を示すVWAPと、「値動きの平均的な振れ幅」を示すATR。本記事では、この2つを組み合わせて、価格がいまどれだけ実勢平均から離れているのかを、銘柄や日ごとのボラティリティに左右されない一貫した物差しで測る設計を整理します。想定読者は、デイトレード帯の時間軸でcBotを組みたい方、乖離の大小を毎回目分量で判断することに限界を感じている方です。特定の設定が成果を保証するという話ではなく、実装へ落とし込む際の考え方を共有することが目的です。

VWAPを中心にATRの倍数で上下バンドを引き、価格の乖離度を測る模式図

VWAPの役割

VWAP(Volume Weighted Average Price)は、当日の始まりなどの起点(アンカー)から現在までの「出来高で重み付けした平均価格」です。単純な移動平均と違い、多く取引された価格帯ほど平均に強く反映されるため、その日の取引の重心を一本の線として示します。機関投資家の執行基準として使われてきた経緯もあり、価格がVWAPの上にあるか下にあるかは、当日どちらの勢力が優勢かを読む材料になります。指標そのものの読み方はVWAPの基礎で解説しています。

一方、VWAP単独の限界は「離れ具合の評価基準を持たない」ことです。価格がVWAPから上に離れたとき、それが通常の振れの範囲なのか、行き過ぎと呼べる乖離なのかを、VWAP自身は教えてくれません。値動きの荒い日と静かな日では、同じ値幅の乖離でも意味が大きく違ってきます。

ATRの役割

ATR(Average True Range)は、一定期間の値動きの振れ幅(True Range)を平均した指標で、「この銘柄・この時間足では、1本あたりどの程度動くのが普通か」を数値化します。詳細はATRの基礎にまとめています。

ATRの持ち味は、乖離や損切り幅を測るための「物差し」になれることです。ボラティリティが変われば物差しの長さも自動的に伸び縮みするため、荒れた日と静かな日を同じ基準で比較できます。ただしATR単独の限界も明確で、方向の情報を一切持ちません。どちらへ動きやすいのか、いまの価格が高い位置なのか安い位置なのかについて、ATRは何も語らないのです。

なぜこの組み合わせか

この組み合わせの核心は、「位置の基準」と「距離の物差し」を分担させることにあります。VWAPが「どこを基準に測るか」を与え、ATRが「どれだけ離れたら大きいと言えるか」を与える。両者が揃って初めて、「いまの価格は実勢平均からATRの◯倍離れている」という、日をまたいで比較可能な乖離度が定義できます。

具体的には、VWAPを中心にATRの倍数で上下にバンドを引く構成が分かりやすい形です。

固定幅のバンドと違い、この距離はATRを介して毎日その日のボラティリティに合わせて再計算されます。経済指標の発表などで値動きが荒くなればバンドは自動的に広がり、静かな日なら「行き過ぎ」と映る乖離も平常の範囲として扱われる——環境の変化に追従するノイズフィルターとして機能することが期待できる仕組みです。

もちろん万能ではありません。強いトレンドが出た日には、価格がVWAPの片側に張り付いたまま乖離が縮まらないことがあり、「平均に戻るだろう」という前提そのものが崩れます。どの銘柄・時間帯でどの程度機能するかは対象しだいであり、採用前にバックテストで確かめる工程が前提になります。

パラメータをどう考えるか

この設計で決めるべきは、大きく3つです。

なお、VWAPはセッションをまたぐと意味合いが変わる指標のため、日をまたぐスイング用途よりも、当日内で完結する時間軸に向いた設計と考えられます。時間足の選び方は時間足の基礎も参考になります。

cBot化する際の考慮点

cTraderにはVWAPが標準搭載されていないため、cBot側で累積計算するのが基本になります。実装時に気を配りたい点を整理します。

判定部分の骨組みを疑似コードで示します。

// OnBar内: 日付が変わったら累積をリセット
if (Bars.OpenTimes.Last(1).Date != _anchorDate)
{
    _sumPV = 0; _sumV = 0;
    _anchorDate = Bars.OpenTimes.Last(1).Date;
}

double tp = (Bars.HighPrices.Last(1) + Bars.LowPrices.Last(1) + Bars.ClosePrices.Last(1)) / 3.0;
double vol = Bars.TickVolumes.Last(1);
_sumPV += tp * vol; _sumV += vol;
if (_sumV <= 0) return; // 出来高ゼロのバーは判定を保留
double vwap = _sumPV / _sumV;

// ATRを物差しに、方向付きの乖離度へ正規化する
double atr = Indicators.AverageTrueRange(atrPeriod, MovingAverageType.Exponential).Result.Last(1);
double deviation = (Bars.ClosePrices.Last(1) - vwap) / atr;

実際にはスプレッドやロット設計、ATRを基準にしたストップ幅の決め方を加えて、細部を詰めていくことになります。

実装の流れ

処理の流れを上流から並べると、次のようになります。

  1. 足の確定: OnBarで確定バーの値のみを使い、判定のブレを防ぎます。
  2. アンカー判定: 日付(セッション)が変わっていれば、VWAPの累積値をリセットします。
  3. 指標更新: VWAPを差分更新し、ATRの確定値を取得します。
  4. 乖離度の算出と判定: (終値 − VWAP) ÷ ATR で乖離度を求め、しきい値と比較してエントリー候補と見送りを振り分けます。セッション序盤は保留します。
  5. リスク幅設定・記録: 候補となった場合はATRを物差しにストップ幅を設計し、判定時の乖離度とその後の展開を記録して、どの水準が機能したかを後から検証できるようにします。

アンカー判定から指標更新、乖離度判定、リスク幅設定までの処理フロー図

どう活用するか

「基準線からの距離をボラティリティで正規化する」という骨格は、VWAPを移動平均やピボットに置き換えても崩れない、使い回しの効く設計です。自分で組んでみたい方は、Claude Codeを併走させたcBot開発の設計メモとして、本記事の構成をそのまま活用してみてください。複数のアンカーを切り替えて描画する実装例としてはVWAP Multi Anchorの紹介記事もあります。作るより相談したいという方は、ai-programming.xyzで個別の開発相談を承っています。体系的に学びたい方に向けては、スクールでこうした正規化設計を実装しながら学べます。

本記事は一般的な情報提供を目的としています。投資助言ではありません。 取引判断はご自身の責任で行ってください。