Does the CPI-Anchored VWAP Mean Anything? I Tested It.
This morning is a CPI morning. My thesis candidate was Bank of America, which reports before the open and picked up a compliance fine overnight. While building the plan, I wanted one more level on the chart: an anchored VWAP from past CPI releases. The idea is common: the release day resets positioning, so the volume-weighted price from that moment forward is a line the market “remembers,” and price should respect it as support or resistance.
Before trusting it, I tested it. The short version: on BAC, CPI-anchored VWAPs hold no better than VWAPs anchored on any other day. That’s true in the months after each release, and in the release window itself.
The two events this morning (October 14, 2026):
- Bank of America Q3 earnings: reported before the open on October 14, 2026. Adjusted EPS was $1.08 against a $1.10 consensus, a miss. Reported EPS was $0.91 after the $1.2 billion anti-money-laundering fine. Revenue was $30.12 billion against $30.69 billion expected. (Source: Reuters/LSEG earnings summary.)
- September CPI: scheduled for release October 14, 2026, at 8:30 a.m. ET. Consensus is 0.6% month over month for headline and 0.2% for core (3.6% and 2.5% year over year).
The study below covers the 56 CPI releases from January 12, 2022, through September 11, 2026. Today’s release is the 57th anchor; it will enter the data once its sessions have traded.
What I measured
An anchored VWAP starts at a chosen moment and accumulates price × volume from there. To decide whether a line is real support or resistance, I needed a definition I could count:
- Touch: a bar whose high–low range crosses the line.
- Hold: that bar closes back on the side price came from. The line turned price away.
A line that holds “most of the time” sounds impressive until you notice that any line drawn through a price series gets touched and closes on the original side a fair amount of the time. So the only question that matters is a comparison: does the CPI anchor hold more often than an anchor with no event behind it?
Two tests
1. The sessions after each release (daily bars). For each of the 56 CPI releases from January 2022 through September 2026, I anchored a VWAP on the release day and counted touches and holds for up to a year afterward, skipping the first three sessions while the line is still forming. The baseline is every non-CPI day in the same period, anchored and measured the same way: tens of thousands of touches.
2. The release window itself (5-minute bars). That first test can’t see the most interesting part: the hours right after the 8:30 ET release, when the reaction is still being priced. So I anchored at 8:30 ET on each release day and counted touches from the release through the close of the next session. The control is the same weekday one week earlier, anchored at the same clock time. Same time of day, same session structure; the only difference is whether CPI came out.
For significance I used a two-proportion z-test of CPI holds against the baseline (|z| ≥ 1.96 is the usual bar). For individual anchors I used a one-sided binomial test, and compared the count of “significant” anchors to the number you’d expect by chance from testing 56 of them.
Results
| Test | CPI-anchored hold rate | Baseline hold rate | z |
|---|---|---|---|
| Sessions after the release (1-year window) | 55.0% | 54.3% | +0.43 |
| Sessions after the release (60-session window) | 54.3% | 52.5% | +0.80 |
| Sessions after the release (20-session window) | 56.3% | 52.7% | +1.17 |
| Release day, 8:30 → 16:00 ET | 52.4% | 52.5% (same weekday a week earlier, both days pooled) | −0.60 |
| The next session | 50.8% | (same control) | +0.57 |
None of these clears the bar. In the per-anchor test, one release out of 56 came in under p < 0.05 in one of the windows. Testing 56 anchors, you’d expect two or three by chance alone.
Two things stand out:
- Anchored VWAP is weak support/resistance on BAC in general. Any anchor, event or not, holds only slightly better than a coin flip on daily bars, and right at a coin flip on 5-minute bars.
- CPI doesn’t make it special. The release window is where I expected an edge if there was one, and it’s indistinguishable from the same morning a week earlier.
This doesn’t mean CPI doesn’t move BAC; it obviously can. It means the line anchored to the release isn’t where that move turns. If there’s an edge on CPI mornings, it’s more likely in range expansion or direction than in this level.
Caveats
- One stock. BAC is a large, liquid bank. Rate-sensitive instruments (TLT, the index ETFs) might behave differently, and that’s the next test.
- My definition of “hold.” A close back on the same side is one reasonable definition; others (a bounce of N × ATR, a hold over the next few bars) could give different answers. The tool makes the window and line age adjustable.
- Release dates. I take them from FRED’s CPI release calendar, which also lists annual seasonal-revision dates. The tool keeps the last date in each month, which is the release itself, including the delayed releases in late 2025.
Run it yourself: falcon-stats avwap-study
I turned the test into a command in falcon-stats, my trading-statistics tool:
# Sessions after each CPI release vs every non-CPI anchor
falcon-stats avwap-study BAC
# The release window: CPI day + next session, 5-minute bars,
# vs the same weekday one week earlier
falcon-stats avwap-study BAC --intraday
# Options
# --since 2022-01-01 --window 250 --min-age 3 --minutes 5 --json
It needs a FRED API key (free) for the release calendar and a market-data key for bars, read from your environment. It makes one request for the calendar and one for daily bars, or two per release in intraday mode, spaced to stay well under rate limits.
The takeaway
The useful habit here isn’t the answer about BAC. It’s asking “compared to what?” before adding a line to the chart. A level that holds 55% of the time looks meaningful until you measure the 54% that an arbitrary line gets for free. On this ticker, the CPI anchor didn’t earn its place, so this morning it stayed off my board, and the plan’s levels came from the week’s actual range instead.