Strasmore Research
Apprendre Matt ConnorPar Matt Connor

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.

RequêteVWAP de la séance comparé à un VWAP ancré à une date donnée (AAPL)
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 date
Run this yourself

Sur 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.

RequêteLa même action et le même dernier cours, douze ancres différentes (AAPL)
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.m
Run this yourself

Avec 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.

RequêteImpact de la séance la plus récente sur un VWAP ancré (AAPL)
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_anchor
Run this yourself

Au 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.

RequêteAncré sur le cours de clôture le plus bas de chaque valeur au cours des douze derniers mois
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 DESC
Run this yourself

Les 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.