VWAPとATRを組み合わせる考え方 — 実勢平均からの乖離を変動幅の物差しで測る設計
「その日の取引の重心」を示すVWAPと、「値動きの平均的な振れ幅」を示すATR。本記事では、この2つを組み合わせて、価格がいまどれだけ実勢平均から離れているのかを、銘柄や日ごとのボラティリティに左右されない一貫した物差しで測る設計を整理します。想定読者は、デイトレード帯の時間軸でcBotを組みたい方、乖離の大小を毎回目分量で判断することに限界を感じている方です。特定の設定が成果を保証するという話ではなく、実装へ落とし込む際の考え方を共有することが目的です。
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の倍数で上下にバンドを引く構成が分かりやすい形です。
- 価格がVWAPの上側で、乖離が1ATR以内 → 買い方優勢の流れが平常の範囲で続いている状態と読む材料
- 乖離が2ATRを超えて拡大 → 短期的な行き過ぎ(平均への回帰余地)を疑う材料
- 価格がVWAPを挟んで細かく往復 → 方向感の乏しい状態として、エントリー候補から外す判断材料
固定幅のバンドと違い、この距離はATRを介して毎日その日のボラティリティに合わせて再計算されます。経済指標の発表などで値動きが荒くなればバンドは自動的に広がり、静かな日なら「行き過ぎ」と映る乖離も平常の範囲として扱われる——環境の変化に追従するノイズフィルターとして機能することが期待できる仕組みです。
もちろん万能ではありません。強いトレンドが出た日には、価格がVWAPの片側に張り付いたまま乖離が縮まらないことがあり、「平均に戻るだろう」という前提そのものが崩れます。どの銘柄・時間帯でどの程度機能するかは対象しだいであり、採用前にバックテストで確かめる工程が前提になります。
パラメータをどう考えるか
この設計で決めるべきは、大きく3つです。
- アンカー(起点): 日足セッションの開始に置くのが標準的ですが、週初やニューヨーク時間の開始に置く設計もあります。デイトレード帯なら「当日の始まり」が素直な選択です。
- ATRの期間: 14が広く使われる出発点で、短くするほど直近の変動に敏感になります。乖離の物差しに使う場合、極端に短い期間ではバンド自体が暴れやすくなる点に注意します。
- バンドの倍率: 1倍・2倍・3倍のように段階を設け、どの段階を「平常」「行き過ぎ」の目安とするかを検証で決めます。「この倍率が正解」という値は存在せず、時間足と狙う値動きの性質に合わせて調整する領域です。
なお、VWAPはセッションをまたぐと意味合いが変わる指標のため、日をまたぐスイング用途よりも、当日内で完結する時間軸に向いた設計と考えられます。時間足の選び方は時間足の基礎も参考になります。
cBot化する際の考慮点
cTraderにはVWAPが標準搭載されていないため、cBot側で累積計算するのが基本になります。実装時に気を配りたい点を整理します。
- アンカーのリセット: バーの日付が変わったら累積値をゼロに戻します。サーバー時刻とチャート表示のタイムゾーンのずれで「1日の区切り」が意図とずれることがあるため、リセット条件は実データで必ず確認します。
- 累積の持ち方: 毎バー全履歴を再計算するのではなく、Σ(価格×出来高)とΣ(出来高)を変数に持って差分更新すると、計算負荷を抑えられます。
- 出来高の性質: FXのVolumeはティックボリューム(値動きの更新回数)であり、株式のような約定数量ではありません。あくまで実勢平均の近似として扱う、という前提を理解した上で使います。
- セッション序盤の不安定さ: アンカー直後はサンプルが少なく、VWAPが1本ごとに大きく動きます。開始から数本はシグナル判定を保留する、といった安全弁を検討します。
- 計算順序とイベント: VWAP更新 → ATR取得 → 乖離度の算出、という順序を崩さないようにします。判定はOnBar(足の確定)ベースで十分成立します。
判定部分の骨組みを疑似コードで示します。
// 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を基準にしたストップ幅の決め方を加えて、細部を詰めていくことになります。
実装の流れ
処理の流れを上流から並べると、次のようになります。
- 足の確定: OnBarで確定バーの値のみを使い、判定のブレを防ぎます。
- アンカー判定: 日付(セッション)が変わっていれば、VWAPの累積値をリセットします。
- 指標更新: VWAPを差分更新し、ATRの確定値を取得します。
- 乖離度の算出と判定: (終値 − VWAP) ÷ ATR で乖離度を求め、しきい値と比較してエントリー候補と見送りを振り分けます。セッション序盤は保留します。
- リスク幅設定・記録: 候補となった場合はATRを物差しにストップ幅を設計し、判定時の乖離度とその後の展開を記録して、どの水準が機能したかを後から検証できるようにします。
どう活用するか
「基準線からの距離をボラティリティで正規化する」という骨格は、VWAPを移動平均やピボットに置き換えても崩れない、使い回しの効く設計です。自分で組んでみたい方は、Claude Codeを併走させたcBot開発の設計メモとして、本記事の構成をそのまま活用してみてください。複数のアンカーを切り替えて描画する実装例としてはVWAP Multi Anchorの紹介記事もあります。作るより相談したいという方は、ai-programming.xyzで個別の開発相談を承っています。体系的に学びたい方に向けては、スクールでこうした正規化設計を実装しながら学べます。
本記事は一般的な情報提供を目的としています。投資助言ではありません。 取引判断はご自身の責任で行ってください。