VWAPと移動平均を組み合わせる考え方 — 当日の重心と日をまたぐ方向を重ねて読む設計
VWAP(出来高加重平均価格)は、その日の始まりなどの起点から現在までの取引を出来高で重み付けした平均価格で、「当日の取引の重心」を示します。移動平均は、直近の一定本数の終値を平均した線で、日付の区切りに関係なく連続して計算されるため、「数日単位の方向」を示します。
どちらも価格の上下で強弱を読む「基準線」ですが、見ている時間の範囲がまったく違います。この2本を重ねると、「当日の流れ」と「より長い流れ」が揃っているのか、食い違っているのかを1枚のチャートで判定できます。本記事では、2本の基準線と価格の位置関係から相場の状態を4つに分けて読む設計を整理します。デイトレード帯でcBotを組みたい方、VWAPだけだと日をまたいだ文脈が抜け落ちると感じている方を想定しています。特定の設定が成果を保証するものではなく、設計の考え方の整理として読んでください。
VWAPの役割
まず、VWAPがどんな情報を持ち、どこで限界を迎えるのかを確認します。
VWAPは「価格 × 出来高」の累積を「出来高」の累積で割って求めます。多く取引された価格帯ほど平均に強く反映されるため、単純な平均よりも「その日、実際に取引が集まった水準」に近い値になります。価格がVWAPの上にあれば当日の参加者の平均コストより上で推移している状態、下にあれば下で推移している状態と読むのが基本です。指標の詳細はVWAPの基礎で解説しています。
単独使用時の限界は2つあります。第一に、日をまたぐ文脈を持たないことです。VWAPは起点で毎日リセットされるため、前日まで強い下落が続いていたかどうかを知りません。当日の値動きだけを見て「VWAPの上だから強い」と読むと、大きな下落の途中の一時的な戻りを見誤る可能性があります。第二に、セッション序盤は値が不安定なことです。起点直後は累積されたサンプルが少なく、1本ごとにVWAPが大きく動くため、位置関係の判定そのものが揺らぎます。
移動平均の役割
次に、日をまたいだ方向を担う移動平均の性格を整理します。
移動平均は、決められた本数の価格を平均した線です。単純移動平均(SMA)はすべての足を均等に、指数移動平均(EMA)は新しい足ほど重く扱います。日付の区切りでリセットされないため、前日・前々日の値動きも含んだ「数日単位の方向」を反映します。基本的な読み方は移動平均線の基礎にまとめています。
単独使用時の観察軸は、価格が線の上か下か、線の傾きが上向きか下向きか、の2点が中心です。
一方で限界もあります。移動平均は過去の価格の平均なので、方向転換の反映が遅れます。また、出来高の情報を持たないため、薄商いの時間帯に付いた価格も、取引が集中した時間帯の価格も同じ重さで扱います。さらに、当日の始まりから何が起きたかという「当日の区切り」を持たないので、今日の参加者がどちらに傾いているかは移動平均だけでは読み取りにくいと考えられます。
なぜこの組み合わせか
2本の基準線の弱点がどう噛み合うのかを、理屈の面から整理します。
VWAPは「当日の重心」を持つ代わりに「日をまたぐ文脈」を持たず、移動平均は「日をまたぐ方向」を持つ代わりに「当日の区切り」と「出来高の重み」を持ちません。互いに欠けている情報を補い合う関係なので、補完性のある組み合わせと考えられます。
判定は、価格が2本の線のどちら側にあるかで4つの状態に分けると整理しやすくなります。
- 価格がVWAPの上・移動平均の上 → 当日の流れと数日単位の流れが上方向で揃っている状態と読む材料
- 価格がVWAPの下・移動平均の下 → 両方の流れが下方向で揃っている状態と読む材料
- 価格がVWAPの上・移動平均の下 → 長めの下方向の中で当日だけ戻している状態。流れが食い違っているため判断を保留する材料
- 価格がVWAPの下・移動平均の上 → 長めの上方向の中で当日だけ押している状態。押し目の候補か、方向転換の初期かを見極める段階として扱う材料
揃っている状態だけを採用候補にし、食い違っている状態は見送る、というのが最も単純な使い方です。食い違いの状態は「何もしない」と決めておくことで、一方の線だけを根拠にした判断を減らすノイズフィルターとして機能することが期待されます。
もう一つの観察軸は、2本の線どうしの距離です。VWAPと移動平均が離れているときは、当日の重心が数日単位の平均から大きくずれている状態で、価格がどちらかへ寄っていく過程で2本の間を往復しやすくなります。逆に2本が接近しているときは、基準線が1つの価格帯に重なっているため、その水準を価格が抜けるかどうかが状態の切り替わりを読む材料になります。距離の大きさはATR(平均真の値幅)で割って正規化しておくと、銘柄や日ごとのボラティリティの違いに左右されにくくなります。
ただし、限界も明記しておきます。価格が2本の線の間を細かく行き来する局面では、状態判定が足ごとに切り替わり、揃った状態が出てもすぐに崩れることがあります。また、VWAPは出来高データの質に依存するため、ティックボリュームしか得られない銘柄では「出来高の重み」の意味合いが弱まる点も理解しておく必要があります。
パラメータをどう考えるか
唯一の正解はないため、ここでは選択の方向性のみを整理します。
VWAPで決めるべきは、主に起点(アンカー)です。日付の切り替わりを起点にするのが一般的ですが、FXのように24時間取引される銘柄では、サーバー時間の0時、東京・ロンドン・ニューヨークの各セッション開始など、どこを1日の始まりとみなすかで値が変わります。運用する時間帯の参加者が多いセッションに合わせる、という考え方が検討の出発点になります。
移動平均は、種類(SMA/EMA)と期間の選択になります。この組み合わせでは、VWAPが「当日」を担当するため、移動平均には当日より長い範囲を担当させるのが役割分担として自然です。たとえば15分足なら、数日分に相当する本数を目安にする、といった考え方です。期間を短くすると移動平均がVWAPに近づき、2本を組み合わせる意味が薄れます。長くしすぎると、方向転換の反映がさらに遅れます。上位足の移動平均を参照する構成も選択肢で、考え方はMTF移動平均の組み合わせも参考になります。
どの設定でも、自分の運用銘柄と時間足でバックテストを行い、状態ごとの出現頻度、揃った状態の持続本数、食い違いからの移行パターンを確認してから採用する手順は省かないことが重要です。
cBot化する際の考慮点
ここからは、cTraderのcBotへ組み込む際の設計ポイントを整理します。
VWAPは自前で累積計算する: cTraderの標準インジケーターにはVWAPが含まれていないため、cBot側で「価格 × 出来高」と「出来高」の累積を持ち、起点でリセットします。代表価格には終値か、高値・安値・終値の平均(典型価格)を使うのが一般的です。
アンカーの判定: 確定足の開始時刻を見て、日付(またはセッション開始時刻)が前の足と変わったら累積をリセットします。週明けや祝日で足が欠けている場合も、時刻で判定していれば誤動作しにくくなります。
セッション序盤の保留: リセット直後はVWAPが不安定なため、起点から一定本数は状態判定を行わない分岐を入れます。この区間は移動平均だけが有効な状態として扱い、新規判定は保留する設計が安全です。
起動直後の足不足: cBot起動時点が当日の途中だと、起点からの足を遡って累積し直す必要があります。OnStartで当日の起点までの確定足をループして初期値を作っておきます。移動平均も期間分の足が揃うまでは判定しません。
確定足で判定する: 判定はOnBarで行い、インデックスは確定済みの1本前(Last(1))を使います。未確定足で判定すると、状態が足の途中で切り替わって何度も発火する原因になります。
ポジション管理との連携: 揃った状態で採用した場合、状態が食い違いへ移行した時点を手仕舞い判断の材料にするか、損切は別途ATRや直近安値で決めるかを、エントリー条件と同時に設計しておきます。
// 例: VWAPの累積更新と4状態の判定(OnBarで呼び出す想定)
var ma = Indicators.ExponentialMovingAverage(Bars.ClosePrices, 96);
var atr = Indicators.AverageTrueRange(14, MovingAverageType.Simple);
DateTime barDate = Bars.OpenTimes.Last(1).Date;
if (barDate != anchorDate) // 起点が変わったら累積をリセット
{
anchorDate = barDate;
cumPV = 0; cumVol = 0; barsSinceAnchor = 0;
}
double tp = (Bars.HighPrices.Last(1) + Bars.LowPrices.Last(1) + Bars.ClosePrices.Last(1)) / 3.0;
double vol = Bars.TickVolumes.Last(1);
cumPV += tp * vol;
cumVol += vol;
barsSinceAnchor++;
if (cumVol <= 0 || barsSinceAnchor < WarmupBars) return; // 序盤は保留
double vwap = cumPV / cumVol;
double close = Bars.ClosePrices.Last(1);
double maVal = ma.Result.Last(1);
bool aboveVwap = close > vwap;
bool aboveMa = close > maVal;
double lineGap = Math.Abs(vwap - maVal) / atr.Result.Last(1); // 2本の距離(ATR比)
// aboveVwap・aboveMa の組み合わせと lineGap を判断材料とする
実装の流れ
全体の処理を、入力から出力までの流れで整理します。
- 入力: 対象銘柄・時間足の確定足を
OnBarで受け取る - アンカー判定: 足の開始時刻から起点の切り替わりを確認し、切り替わっていればVWAPの累積と経過本数をリセットする
- 計算: VWAPを差分更新し、移動平均とATRの確定値を取得する
- 状態分類: 価格とVWAP・移動平均の位置関係から4状態のどれかに分類し、2本の距離をATR比で求める。序盤の保留区間では分類しない
- 出力: 揃った状態への移行を採用候補として発注またはログへ渡し、食い違いの状態は見送りとして記録する
VWAPの累積処理と状態分類を別のメソッドに分けておくと、アンカーをセッション開始に変える、移動平均を上位足に差し替える、といった変更を局所的に行えます。状態の遷移を毎足ログに残しておくと、検証時にどの状態で判断が分かれたのかを追いやすくなります。
どう活用するか
最後に、立場別の使い方をまとめます。
自作派の方は、本記事の「アンカー判定 → 累積更新 → 4状態分類」の構成を設計書として、Claude Code を使ったcBot開発の下敷きにしてみてください。起動直後の初期化とリセット処理はバグが出やすい箇所なので、まずはインジケーターとしてチャートに描画し、手計算と照合する進め方がおすすめです。委託派の方は、ai-programming.xyzへの相談時に「当日VWAPと数日単位の移動平均の位置関係で状態を分け、揃ったときだけ候補にしたい」と伝えていただくと、要件のすり合わせが進めやすくなります。教育派の方は、スクールで累積計算と状態管理を学ぶ題材として活用できます。
本記事は一般的な情報提供を目的としています。投資助言ではありません。 取引判断はご自身の責任で行ってください。