Anchored VWAP : formule et utilisations
L’anchored VWAP commence sa moyenne cumulée à la bougie choisie et ne se réinitialise jamais. Découvrez sa formule en Python et l’effet du point d’ancrage.
L’anchored VWAP est un prix moyen pondéré par les volumes dont les cumuls commencent à la bougie que vous choisissez et ne sont jamais réinitialisés. Le VWAP de séance recommence à chaque ouverture. Il répond donc uniquement à la question suivante : à quel prix moyen les actions ont-elles échangé aujourd’hui ? La version ancrée répond à une autre question : à quel prix moyen les actions ont-elles échangé depuis le moment choisi comme point de départ ?
Qu’est-ce que l’anchored VWAP ?
Les deux versions reposent sur le même calcul. Pour chaque bougie depuis le début, multipliez le prix de la bougie par son volume et conservez un cumul. Conservez séparément un cumul des volumes. Divisez le premier par le second. Formellement, l’anchored VWAP de la bougie n correspond à la somme des produits prix-volume depuis la bougie d’ancrage jusqu’à la bougie n, divisée par la somme des volumes sur ces mêmes bougies.
Le prix d’une bougie est généralement son prix typique, c’est-à-dire la moyenne de son plus-haut, de son plus-bas et de sa clôture. Il peut aussi s’agir du VWAP de la bougie lorsque le flux de données en publie un.
Rien n’est jamais retiré de l’un ou l’autre cumul. Une moyenne mobile à 50 jours élimine son observation la plus ancienne chaque fois qu’elle en ajoute une nouvelle. C’est ce qui lui permet de changer de direction. L’anchored VWAP ne fait qu’ajouter des observations. Sa mémoire est donc permanente. Le VWAP de séance applique le même calcul, mais remet les deux cumuls à zéro à chaque ouverture. Il s’agit donc d’un anchored VWAP dont l’ancre est la cloche d’ouverture.
Quelle est la différence entre le VWAP et l’anchored VWAP ?
Le panneau ci-dessous calcule les deux indicateurs sur les barres quotidiennes d’Apple pendant un trimestre. La colonne session_vwap correspond au prix moyen pondéré par les volumes à l’intérieur de chaque séance. Elle fournit un nouveau chiffre chaque jour. La colonne anchored_vwap commence lors de la première séance de la période et cumule les données à partir de cette date.
Le SQL exact derrière chaque chiffre
SELECT
toString(date) AS session_date,
formatDateTime(date, '%b %e') AS bar_label,
round(toFloat64(vwap), 2) AS session_vwap,
round(
sum(toFloat64(vwap) * toFloat64(volume)) OVER (ORDER BY date ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW)
/ sum(toFloat64(volume)) OVER (ORDER BY date ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW)
, 2) AS anchored_vwap
FROM global_markets.stocks_daily_aggs
WHERE ticker = 'AAPL'
AND date >= '2026-04-01'
AND date <= '2026-06-30'
ORDER BY dateSur 62 séances, de Apr 1 à Jun 30, la série quotidienne suit les échanges tandis que la série ancrée évolue lentement. La ligne ancrée commence à 255.02, car lors du premier jour une seule séance constitue tout l’historique. Elle atteint 286.86 à la fin de la période, contre un VWAP de séance final de 288.09. La forme des courbes est instructive. La ligne ancrée suit d’abord étroitement la ligne quotidienne, puis s’aplatit à mesure que le volume cumulé augmente.
Où les opérateurs placent-ils l’ancre ?
Les ancres courantes sont une publication de résultats, la première bougie d’un gap, un plus-bas sur 52 semaines ou le premier print d’une action nouvellement cotée. Le raisonnement est toujours le même. Tous les investisseurs ayant effectué une transaction après ce moment ont payé, en moyenne, l’anchored VWAP. Un cours supérieur à cette ligne signifie donc qu’un participant moyen affiche une plus-value latente.
Voici ce qui est généralement passé sous silence. Le choix de l’ancre relève d’un jugement, et le résultat en dépend. Le panneau ci-dessous ancre la même action au début de chacun des douze derniers mois. Il calcule ensuite le prix moyen payé entre chaque mois et une même date de fin.
Le SQL exact derrière chaque chiffre
WITH
monthly AS (
SELECT
toStartOfMonth(date) AS m,
sum(toFloat64(vwap) * toFloat64(volume)) AS pv,
sum(toFloat64(volume)) AS vol
FROM global_markets.stocks_daily_aggs
WHERE ticker = 'AAPL'
AND date >= '2025-07-01'
AND date <= '2026-06-30'
GROUP BY m
),
anchored AS (
SELECT
m,
sum(pv) OVER (ORDER BY m ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING)
/ sum(vol) OVER (ORDER BY m ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING) AS avwap
FROM monthly
),
final_close AS (
SELECT toFloat64(argMax(close, date)) AS last_close
FROM global_markets.stocks_daily_aggs
WHERE ticker = 'AAPL'
AND date >= '2026-06-01'
AND date <= '2026-06-30'
)
SELECT
formatDateTime(a.m, '%b %Y') AS anchor_from,
round(a.avwap, 2) AS anchored_vwap,
round(100 * (f.last_close / a.avwap - 1), 2) AS close_vs_avwap_pct
FROM anchored AS a
CROSS JOIN final_close AS f
ORDER BY a.mAvec une ancre placée en Jul 2025, le prix moyen payé s’établit à 259.52. La dernière clôture de la période ressort à 11.5% par rapport à ce niveau. Le chiffre est positif lorsque la clôture se situe au-dessus de la ligne. Une ancre placée en Jun 2026 donne 294.07 et -1.6%. Même action, même dernier cours, mais douze conclusions différentes sur la situation des détenteurs depuis l’ancre. Le calcul ne choisit pas l’ancre à votre place. Une date d’ancrage choisie a posteriori peut être déplacée jusqu’à confirmer le message que le graphique est censé transmettre. C’est pourquoi la date d’ancrage doit figurer dans la légende de tout graphique d’anchored VWAP que vous consultez.
Comment calculer l’anchored VWAP en Python ?
Les deux séries sont obtenues en parcourant les barres une seule fois. Le script ci-dessous utilise Python 3 et sa bibliothèque standard, sans package ni connexion réseau. Il lit trente barres et affiche la série de séance à côté de la série ancrée. Il indique ensuite la première barre où le prix repasse à travers la ligne ancrée. Les barres sont fictives et servent uniquement à la démonstration. Il suffit d’appliquer la même boucle à des barres réelles pour conserver le même calcul.
"""Session VWAP and anchored VWAP from the same running totals. Standard library only."""
import csv
import io
# Illustrative bars, not market data: three sessions of ten 30 minute bars.
BARS = """bar,price,volume
2026-03-02 09:30,100.40,240000
2026-03-02 10:00,100.90,180000
2026-03-02 10:30,101.30,150000
2026-03-02 11:00,101.10,130000
2026-03-02 11:30,100.60,120000
2026-03-02 12:00,100.20,110000
2026-03-02 12:30,99.80,120000
2026-03-02 13:00,99.50,140000
2026-03-02 13:30,99.70,170000
2026-03-02 14:00,99.40,260000
2026-03-03 09:30,99.10,300000
2026-03-03 10:00,98.70,210000
2026-03-03 10:30,98.90,160000
2026-03-03 11:00,98.40,150000
2026-03-03 11:30,98.10,140000
2026-03-03 12:00,98.30,120000
2026-03-03 12:30,98.80,130000
2026-03-03 13:00,99.20,150000
2026-03-03 13:30,99.60,190000
2026-03-03 14:00,99.90,280000
2026-03-04 09:30,100.20,320000
2026-03-04 10:00,100.60,230000
2026-03-04 10:30,100.90,170000
2026-03-04 11:00,101.40,160000
2026-03-04 11:30,101.20,140000
2026-03-04 12:00,101.60,130000
2026-03-04 12:30,102.10,140000
2026-03-04 13:00,102.40,160000
2026-03-04 13:30,102.20,200000
2026-03-04 14:00,102.60,290000
"""
ANCHOR = "2026-03-02 10:30" # the bar the anchored series starts on
session_pv = session_vol = 0.0
anchor_pv = anchor_vol = 0.0
current_day = None
anchored = False
start_side = None
crossover = None
print(f"{'bar':<18}{'price':>8}{'session':>10}{'anchored':>10}")
for row in csv.DictReader(io.StringIO(BARS)):
stamp = row["bar"]
day, price, vol = stamp[:10], float(row["price"]), float(row["volume"])
if day != current_day: # the session totals reset at every open
session_pv = session_vol = 0.0
current_day = day
session_pv += price * vol
session_vol += vol
session_vwap = session_pv / session_vol
anchored = anchored or stamp == ANCHOR
if not anchored:
print(f"{stamp:<18}{price:>8.2f}{session_vwap:>10.2f}{'.':>10}")
continue
anchor_pv += price * vol # the anchored totals never reset
anchor_vol += vol
anchored_vwap = anchor_pv / anchor_vol
print(f"{stamp:<18}{price:>8.2f}{session_vwap:>10.2f}{anchored_vwap:>10.2f}")
gap = price - anchored_vwap
if start_side is None and abs(gap) > 1e-9:
start_side = gap > 0
elif start_side is not None and crossover is None and (gap > 0) != start_side:
crossover = stamp
print("first bar back through the anchored VWAP:", crossover or "no crossing here")
Les deux paires de compteurs constituent l’essentiel du mécanisme. session_pv et session_vol sont remis à zéro lorsque la date change. anchor_pv et anchor_vol ne le sont jamais. Tout le reste concerne l’affichage.
Pourquoi la ligne ancrée évolue de moins en moins
Un anchored VWAP devient plus difficile à faire bouger avec le temps, pour une raison mécanique. Chaque nouvelle barre entre dans la moyenne avec un poids égal à son propre volume divisé par le volume total depuis l’ancre. Le deuxième jour, une séance peut représenter la moitié du volume total. Deux cents séances plus tard, cette même séance ne représente plus qu’une fraction de un pour cent. Le panneau ci-dessous mesure ce poids sur les barres d’Apple, par blocs de dix séances.
Le SQL exact derrière chaque chiffre
WITH running AS (
SELECT
row_number() OVER (ORDER BY date) AS n,
toFloat64(volume)
/ sum(toFloat64(volume)) OVER (ORDER BY date ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS weight
FROM global_markets.stocks_daily_aggs
WHERE ticker = 'AAPL'
AND date >= '2026-01-02'
AND date <= '2026-06-30'
)
SELECT
intDiv(n - 1, 10) * 10 + 10 AS bars_since_anchor,
round(100 * avg(weight), 2) AS newest_bar_weight_pct
FROM running
GROUP BY bars_since_anchor
ORDER BY bars_since_anchorAu cours des dix premières séances, la nouvelle barre représente en moyenne 30.09% de la ligne. La barre d’ancrage elle-même en représente la totalité. À la séance 130, la nouvelle barre ne pèse plus que 2.14%. Deux conclusions se dégagent de ces graphiques. Une ancre ancienne produit une ligne presque horizontale, qui réagit à peine aux évolutions actuelles. Une ancre récente produit une ligne qui oscille autour du prix et le recroise fréquemment. Aucune des deux n’est plus exacte. Il s’agit de la même formule, appliquée à des historiques de durées différentes. Pour mesurer directement le volume entrant par rapport à la normale, le volume quotidien moyen et le volume relatif sont les indicateurs appropriés.
Que prétend montrer l’anchored VWAP ?
L’interprétation habituelle porte sur le positionnement. Lorsque l’ancre correspond à un événement, la ligne représente le prix moyen payé par tous les investisseurs ayant effectué une transaction depuis cette date. Un prix supérieur à la ligne signifie donc que la majorité des détenteurs affiche une plus-value latente. Un prix inférieur indique la situation inverse. Le panneau ci-dessous ancre cinq grandes actions connues au plus-bas de clôture quotidien atteint par chacune au cours des douze derniers mois. Il compare ensuite la dernière clôture de la période avec la moyenne obtenue.
Le SQL exact derrière chaque chiffre
WITH
bars AS (
SELECT
ticker,
date,
toFloat64(vwap) AS px,
toFloat64(volume) AS vol,
toFloat64(close) AS c
FROM global_markets.stocks_daily_aggs
WHERE ticker IN ('AAPL', 'MSFT', 'NVDA', 'KO', 'SPY')
AND date >= '2025-07-01'
AND date <= '2026-06-30'
),
lows AS (
SELECT
ticker,
argMin(date, c) AS low_date
FROM bars
GROUP BY ticker
)
SELECT
b.ticker AS symbol,
formatDateTime(l.low_date, '%b %e, %Y') AS anchored_at,
round(sumIf(b.px * b.vol, b.date >= l.low_date) / sumIf(b.vol, b.date >= l.low_date), 2) AS anchored_vwap,
round(argMax(b.c, b.date), 2) AS last_close,
round(100 * (argMax(b.c, b.date)
/ (sumIf(b.px * b.vol, b.date >= l.low_date) / sumIf(b.vol, b.date >= l.low_date)) - 1), 1) AS close_vs_avwap_pct
FROM bars AS b
INNER JOIN lows AS l ON b.ticker = l.ticker
GROUP BY b.ticker, l.low_date
ORDER BY close_vs_avwap_pct DESCLes cinq actions s’échelonnent de SPY à 10.4% jusqu’à MSFT à 1.3%. Chacune est mesurée par rapport à sa propre date d’ancrage. Cet écart décrit ce qui s’est produit. Il faut toutefois en préciser les limites. L’anchored VWAP est une statistique descriptive calculée à partir de prix et de volumes déjà exécutés. Ce n’est ni une prévision ni une règle dont l’avantage aurait été établi par des travaux de recherche publiés. Il ne contient aucune information que l’historique des prix et des volumes ne contienne déjà. En outre, l’ancre a été choisie par une personne. Lu comme un résumé des échanges depuis une date donnée, l’indicateur est pertinent. Lu comme une conclusion, il reflète surtout le choix de l’ancre.
FAQ
Quelle est la différence entre le VWAP et l’anchored VWAP ?
Le VWAP de séance remet ses cumuls à zéro à chaque ouverture de marché. Il ne décrit donc que la séance en cours. L’anchored VWAP commence ses cumuls à la bougie de votre choix et ne les réinitialise jamais. Il décrit ainsi le prix moyen payé au cours de toutes les séances depuis cette bougie.
Où les traders placent-ils l’ancre d’un VWAP ?
Les choix courants sont une date de publication de résultats, la première bougie d’un gap, un sommet ou un creux de marché, ainsi que le premier jour de cotation d’une nouvelle valeur. N’importe quelle bougie peut servir d’ancre. La date d’ancrage est indispensable pour interpréter la ligne.
L’anchored VWAP est-il réinitialisé pendant la nuit ?
Non. C’est sa propriété fondamentale. La somme cumulée des produits prix-volume et la somme cumulée des volumes se poursuivent après la clôture. Elles reprennent à la séance suivante, quelle que soit la durée de l’intervalle entre les deux.
L’anchored VWAP permet-il de prévoir quelque chose ?
Il s’agit d’une statistique descriptive, et non d’une prévision. Elle résume les prix déjà payés depuis l’ancre. Modifier l’ancre modifie la ligne et peut inverser la conclusion apparente. Toute interprétation fondée sur cette ligne dépend donc de la pertinence de la date d’ancrage.
Peut-on calculer un anchored VWAP sur des barres quotidiennes ?
Oui. Les panneaux de cette page utilisent des barres quotidiennes, le VWAP de chaque séance servant de prix de la barre. Les graphiques intraday utilisent à la place des barres de quelques minutes. La formule reste identique dans les deux cas. Seule la taille des incréments change.
Chaque panneau ci-dessus est accompagné du SQL qui l’a produit. Vous pouvez donc l’ouvrir et modifier vous-même la date d’ancrage. Pour calculer les mêmes cumuls depuis une date qui vous intéresse, formulez votre demande en anglais courant dans le terminal Strasmore.