VWAP(Volume Weighted Average Price, 売買高加重平均価格)とは、当日の東京証券取引所のオークション市場で成立した価格を価格毎の売買高で加重平均した価格をいいます。VWAP は、より取引実態に近い平均的な約定値段として、主に機関投資家の執行価格の目標値として用いられています。
日本取引所グループの用語集 [1] より引用
東証の取引時間中、特定銘柄について 1 秒間隔で株価と出来高(累計)を取得して分析していますが、生成 AI (Microsoft Copilot) に VWAP の算出と活用方法についてアドバイスをもらったので、備忘録にまとめました。
VWAP の計算式
英語版の Wikipedia [2] に VWAP の計算式が示されていたので、それを引用して株価にあてはめました。
\[ P_{VWAP} = \frac{\sum_j {P_j \times Q_j}}{\sum_j Q_j} \]- \(P_{VWAP}\) : VWAP(売買高加重平均価格)
- \(P_j\) : 取引\(j\) の株価
- \(Q_j\) : 取引\(j\) の出来高
- \(j\) : 定義された期間内に発生する個々の取引
Microsoft Copilot にお願いをして、VWAP の活用方法、長所・短所についてまとめてもらいました。
VWAP の活用例
- エントリー・エグジットの判断基準
- VWAP より安く買えれば「割安」、高く売れれば「割高」と判断できる
- 機関投資家は VWAP 付近で約定することを目指すことが多い
- トレンドの中心線として利用
- VWAP は滑らかに推移するため、価格の上下動を相対的に評価できる
- GUI 上では基準線として表示されることが多い
- アルゴリズム取引の基準価格
- VWAP は多くのアルゴリズム取引で「目標価格」として使われる
- 特に大量注文を分割して執行する際に、VWAP を基準にすることで市場への影響を抑える
VWAP の長所
| 長所 | 内容 |
|---|---|
| 市場の平均的な約定価格を示す | 実際の取引に基づいた価格なので信頼性が高い |
| 滑らかでノイズに強い | 短期的なスパイクに左右されにくく、トレンド把握に適している |
| 逐次更新が可能 | リアルタイムでVWAPを更新できるため、ティックデータにも対応しやすい |
| 機関投資家の行動と親和性が高い | 実需に基づいた価格判断が可能 |
VWAP の短所・注意点
| 短所 | 内容 |
|---|---|
| 過去のデータに依存する | 累積的な指標のため、直近の急変には反応が遅れる |
| 時間帯によって意味が変わる | 前場と後場で市場の性質が異なるため、VWAP の解釈も変わることがある |
| 出来高が極端に偏ると歪む | 特定の時間帯に出来高が集中すると、VWAP がその価格に引っ張られる |
| 単独では売買シグナルにならない | 他の指標(RSI、MACDなど)と組み合わせることで真価を発揮する |
まとめ
- VWAP は、市場の平均的な取引価格を把握するための強力なツールです。
- 特に短期売買やアルゴリズム取引においては、VWAP を基準にすることで、合理的なエントリー・エグジット判断が可能になります。
- ただし、VWAP はあくまで「過去の加重平均」であり、未来の価格を予測するものではないことに注意が必要です。
- 他のテクニカル指標と組み合わせて使うことで、より精度の高いトレード判断ができるでしょう。
JupyterLab でプロット
Excel ファイルの保存したティックデータ(シート名は銘柄コード)を読み込んで、VMAP と、株価との乖離率を算出してプロットした例を示します。
必要なパッケージのインポート
import datetime import os import matplotlib.font_manager as fm import matplotlib.pyplot as plt import pandas as pd from matplotlib import dates as mdates
Matplotlib の設定(省略可)
FONT_PATH = "../fonts/RictyDiminished-Regular.ttf" fm.fontManager.addfont(FONT_PATH) # FontPropertiesオブジェクト生成(名前の取得のため) font_prop = fm.FontProperties(fname=FONT_PATH) font_prop.get_name() plt.rcParams["font.family"] = font_prop.get_name() plt.rcParams["font.size"] = 12
ティックデータの読込
Excel ファイルはデータを取得した時刻を UNIX 形式のタイムスタンプに変換して保持していますが、このままででは扱いにくいので、Pandas の日付時刻形式に変換してインデックスにしています。
file = "ticks_20251006.xlsx"
body = os.path.splitext(os.path.basename(file))[0]
path_excel = os.path.join("..", "collection", file)
code = "7011"
df = pd.read_excel(path_excel, sheet_name=code)
df.index = pd.to_datetime([datetime.datetime.fromtimestamp(ts) for ts in df["Time"]])
df
VWAP と 株価との乖離率 の算出
常に過去データを扱うのであれば、Pandas でスマートに VMAP を算出できるのですが、リアルタイムでデータを逐次取得することを想定しているので、転用しやすいように敢えてループ処理をしています。
cum_pv = 0.0
cum_vol = 0.0
volume_prev = None
vwap_list = []
vwap_deviation_list = []
# データを逐次取得することを想定して、ループで処理
for price, volume in zip(df["Price"], df["Volume"]):
if volume_prev is None:
vol_diff = 0.0
else:
# ティックデータの出来高は累積出来高であるため
vol_diff = volume - volume_prev
cum_pv += price * vol_diff
cum_vol += vol_diff
volume_prev = volume
# VWAP の算出
vwap = cum_pv / cum_vol if cum_vol > 0 else price
vwap_list.append(vwap)
# 株価と VWAP の乖離率
vwap_deviation = (price - vwap) / vwap
vwap_deviation_list.append(vwap_deviation)
df["VWAP"] = vwap_list
df["VWAPdev"] = vwap_deviation_list
df
株価と VWAP のプロット
fig, ax = plt.subplots(figsize=(6, 3))
ax.plot(df["Price"], linewidth=1, label="株価")
ax.plot(df["VWAP"], linewidth=1, label="VWAP")
ax.xaxis.set_major_formatter(mdates.DateFormatter("%H:%M"))
ax.set_ylabel("VWAP")
ax.grid()
ax.legend(fontsize=7)
ax.set_title(f"{code} in {file}")
plt.tight_layout()
# plt.savefig(f"{body}_{code}_vwap.png")
plt.show()
株価と VWAP の乖離率
fig, ax = plt.subplots(figsize=(6, 3))
ax.plot(df["VWAPdev"], linewidth=1, color="C2", label="VWAP 乖離率")
ax.xaxis.set_major_formatter(mdates.DateFormatter("%H:%M"))
ax.set_ylabel("VWAP 乖離率")
ax.grid()
ax.legend(fontsize=7)
ax.set_title(f"{code} in {file}")
plt.tight_layout()
# plt.savefig(f"{body}_{code}_vwap_dev.png")
plt.show()
参考サイト
- 用語集 | 日本取引所グループ VWAP
- Volume-weighted average price - Wikipedia
- pandasでExcelファイル(xlsx, xls)の読み込み(read_excel) | note.nkmk.me
にほんブログ村
#オープンソース






0 件のコメント:
コメントを投稿