こんにちは!こんばんは!
今回は筆者が自作ツール(mvwap_timing.py)でも活用しているMVWAP(Modified Volume Weighted Average Price)について、理論的背景から具体的なトレード戦略までを解説します。単なる「使い方」ではなく、なぜこの指標が機能するのかという本質的な理解を目指します。
VWAPとMVWAPの本質的な違い
まず混同しやすい点を整理します。通常のVWAPは当日のセッション開始から現在までの累積計算です。一方MVWAPは直近N本分のローソク足だけを対象とするローリング計算で、複数日・複数週にわたって機能します。
TP = (高値 + 安値 + 終値)÷ 3
【通常VWAP(当日セッション累積)】
VWAP = Σ(TP × 出来高) ÷ Σ(出来高) ※セッション開始からの累積
【MVWAP(ローリング、期間N)】
MVWAP(N) = Σi=t-N+1t(TPi × Voli) ÷ Σi=t-N+1t(Voli)
具体的な計算例(N=5の場合)
| 期間 | 高値 | 安値 | 終値 | 典型価格(TP) | 出来高(万株) | TP × 出来高 |
|---|---|---|---|---|---|---|
| t-4 | 1,020 | 998 | 1,010 | 1,009.3 | 120 | 121,120 |
| t-3 | 1,035 | 1,008 | 1,028 | 1,023.7 | 95 | 97,247 |
| t-2 | 1,042 | 1,015 | 1,038 | 1,031.7 | 140 | 144,430 |
| t-1 | 1,055 | 1,030 | 1,048 | 1,044.3 | 210 | 219,310 |
| t(現在) | 1,062 | 1,040 | 1,058 | 1,053.3 | 185 | 194,861 |
| 合計 | 750万株 | 776,968 | ||||
この例では出来高が最大のt-1期(210万株)の典型価格1,044円が最もMVWAPを引き上げる要因となっています。出来高の大きな足が価格決定に支配的な影響を持つ、というVWAPの本質が見て取れます。
期間Nの選択と特性
| 期間N | 感応度 | ノイズ | 適した場面 |
|---|---|---|---|
| 5〜10本 | 高い | 多い | 短期スキャルピング、高ボラ相場 |
| 15〜25本 | 中程度 | 中程度 | スイングトレード(主力推奨帯) |
| 30〜50本 | 低い | 少ない | トレンド確認、中長期ポジション管理 |
mvwap_timing.pyではATR(真のレンジ平均)をNの動的調整に使うアプローチを採用しており、ボラティリティが高い局面では自動的にNを延ばしてシグナルの質を維持する設計にしています。主要なトレーディング戦略
価格がMVWAPを上抜け + 出来高増加 → 買い
価格がMVWAPを下抜け + 出来高増加 → 売り
MVWAPをエントリー後のトレーリングストップ基準としても使用可。
価格がMVWAP±2σ超の乖離 → 平均回帰を期待
ボリンジャーバンドのMVWAP版として機能。
RSIの過買い・過売りとの同時確認が有効。
MVWAP(10)がMVWAP(30)を上抜け → ゴールデンクロス
MVWAP(10)がMVWAP(30)を下抜け → デッドクロス
SMAクロスより出来高を加味した分、だましが少ないとされる。
MVWAPが機関の平均取得コストに近似 → 大口が損益分岐点で攻防する「価格帯の壁」として機能。
IPO・増資銘柄での初動分析に特に有効。
リスク管理:ATRとの組み合わせ
MVWAPを使う場合、ストップロスの設定にはATR(Average True Range:真のレンジ平均)との組み合わせが標準的です。
買いエントリー時:ストップ = エントリー価格 − (ATR × 係数k)
推奨係数:k = 1.5〜2.5(ボラティリティにより調整)
【乖離率フィルター】
|(現在価格 − MVWAP) ÷ MVWAP| > 閾値θ のときシグナル有効
推奨θ:日足 0.5〜1.5%、5分足 0.1〜0.3%
① 急激なニュース駆動型の価格変動(決算サプライズ・政策変更等)には対応が遅れます。BOJ会合前後のような政策不確実性が高い局面では信頼性が低下します。
② 低流動性銘柄では出来高の偏りによりMVWAPが歪み、誤シグナルが増加します。1日の出来高が1億円未満の銘柄への適用は非推奨です。
③ MVWAPのみでのシステマティック取引は危険であり、RSI・ボリンジャーバンド・出来高プロファイル等との多層確認が必須です。
日本株市場での実装上の留意点
ta.vwap()関数を期間指定で応用できます。Pythonでの実装例(pandasを使用):
def mvwap(df, n=20):
tp = (df['High'] + df['Low'] + df['Close']) / 3
tpv = tp * df['Volume']
mvwap = tpv.rolling(n).sum() / df['Volume'].rolling(n).sum()
return mvwap
# ATRベースのシグナル生成
def generate_signal(df, n=20, atr_mult=2.0, dev_threshold=0.005):
df['mvwap'] = mvwap(df, n)
df['atr'] = df['Close'].diff().abs().rolling(14).mean()
df['deviation'] = (df['Close'] - df['mvwap']) / df['mvwap']
df['signal'] = 0
df.loc[df['deviation'] > dev_threshold, 'signal'] = 1 # 買い
df.loc[df['deviation'] < -dev_threshold, 'signal'] = -1 # 売り
return df
まとめ
MVWAPは「出来高という市場の民主的投票」を移動平均に組み込むことで、価格の重心を可視化する指標です。機関投資家のコスト基準に近い水準を示すことから、大口の攻防が集中する「磁石のような水準」として機能することが多いとされています。
ただしMVWAPはあくまでも後追い指標であり、使用局面の選別と複数指標との組み合わせなくして安定した運用は困難です。筆者のmvwap_timing.pyにおいても、MVWAPはあくまでATRストップ計算の基準値として機能しており、単独のエントリー・イグジット根拠とは位置付けていません。
このツールで試験的にトレードしてみようと考えていますが、運用方法は特殊です。原則として信用取引はしないので、上昇トレンドの時だけ賭けます。なので、上昇トレードを形成している銘柄を見つけてツールを使ってエントリー価格と損切り価格を計算します。エントリ価格付近で約定したら、損切り価格で売るための注文を長期でいれます。そして、毎日市場クローズ後に再度ツールで損切り値を計算して訂正注文をします。上昇トレードが終われば損切り価格で売却され利益が確定するというトレードです。
BOJ政策会合以降に試しにこのトレードを実行しようと思っています。途中経過などはこのブログで発表していくつもりです。トレード銘柄は日経平均x2ETF(1579)です。
現状
上昇トレンド中ですが、下げていますので未エントリーです。| 項目 | 6/3 | 6/4 | 6/5 |
|---|---|---|---|
| 終値 | 828.70円 | 806.40円 | 784.90円 |
| TSL(損切りライン) | 732.92円 | 763.89円 | 763.89円 |
| 短期MVWAP | 750.45円 | 766.19円 | 776.30円 |
① Berkowitz, S. A., Logue, D. E., & Noser, E. A. (1988). "The Total Cost of Transactions on the NYSE." Journal of Finance, 43(1), 97–112.
② Kissell, R. (2013). The Science of Algorithmic Trading and Portfolio Management. Elsevier Academic Press.
③ 東京証券取引所「売買高等の推移」各年版(JPX公式統計)
④ TradingView Pine Script v5 Reference Manual —
ta.vwap() 関数仕様⑤ 日本証券業協会「証券市場の基礎知識」2025年版
※本記事は情報提供を目的としており、特定の金融商品の売買を推奨するものではありません。投資判断は自己責任において行ってください。


