Take one basket of 27,810 cards priced on every one of 24 consecutive days. No entries, no exits, no substitutions, no missing prices. Now build an index from it four different ways, all four of them standard, and two of them in use on this site. The answers are -1.99%, 0.00%, +4.37% and +7.72%. That is a spread of 9.72 index points over 23 days produced entirely by weighting, on constituents that never changed. If you have ever wondered why two Pokemon indices disagree, this is usually the whole reason.
Same cards, same days, four honest constructions
The four constructions are these. PRICE-WEIGHTED sums the raw dollar prices of every constituent and rebases the sum to 100; this is what a set value is, and it is what most dollar-denominated Pokemon indices are. EQUAL-WEIGHT divides each card by its own starting price and takes the mean of those ratios; this is buy one of each and hold. MEDIAN takes the median of the same ratios and reports what the typical constituent did. CHAIN-LINKED EQUAL-WEIGHT compounds the cross-sectional mean of each day's returns, which is what you get if you rebalance to equal weight every day.
Four indices over identical constituents, n = 27,810, 2026-08-30 = 100
| Date | Price-weighted | Equal-weight | Median card | Chain-linked equal-weight |
|---|---|---|---|---|
| 2026-08-30 | 100.00 | 100.00 | 100.00 | 100.00 |
| 2026-09-02 | 100.12 | 101.11 | 100.00 | 101.14 |
| 2026-09-05 | 100.58 | 101.88 | 100.00 | 103.36 |
| 2026-09-08 | 97.01 | 102.31 | 100.00 | 104.52 |
| 2026-09-11 | 97.57 | 103.10 | 100.00 | 105.61 |
| 2026-09-14 | 97.56 | 103.67 | 100.00 | 106.39 |
| 2026-09-17 | 96.97 | 104.14 | 100.00 | 107.15 |
| 2026-09-20 | 97.88 | 104.17 | 100.00 | 107.35 |
| 2026-09-22 | 98.01 | 104.37 | 100.00 | 107.72 |
| Total change | -1.99% | +4.37% | 0.00% | +7.72% |
All four are defensible and all four describe something real. Nothing Moves Together built a fifth variant, an equal-weight index over 741 cards that rose 41.0% across 51 weeks, and its method note is worth reading beside this table: it carried prices forward onto a common Monday grid and gated entry on a price above $5 at the FIRST grid date rather than the last, which is the right way round. Price-weighted says the total dollar value of the basket fell, which it did, because the expensive vintage end fell and it carries most of the dollars. Equal-weight says the average card rose, which it did, because the cheap end rose and there are far more cheap cards. The median says the typical card did nothing, which is the single most accurate one-line description of these three weeks. The question is never which is right; it is which question you asked.
The same three constructions rebuilt under price floors, 2026-08-30 to 2026-09-22
| Floor at the first day | Cards | Equal-weight | Price-weighted | Median card |
|---|---|---|---|---|
| no floor | 27,810 | +4.37% | -1.99% | 0.00% |
| $0.25 and up | 22,198 | +3.71% | -2.00% | 0.00% |
| $1 and up | 16,951 | +1.23% | -2.05% | 0.00% |
| $5 and up | 12,761 | +0.57% | -2.13% | 0.00% |
| $25 and up | 4,957 | -0.13% | -2.50% | 0.00% |
| $100 and up | 1,484 | -1.34% | -3.45% | 0.00% |
| $500 and up | 168 | -3.93% | -7.34% | 0.00% |
A chain-linked index prints +13.33% on a market that went exactly nowhere
Three of the four constructions above are safe. The fourth is not. We do not use it, and no moonstone index is built this way, but it is worth isolating because it is the one an engineer reaches for first. Compounding the cross-sectional mean of daily returns looks like the natural way to build a daily index that tolerates entries and exits. It is also biased upward, because the arithmetic mean of a set of returns exceeds the geometric one, and the noisier the quotes the larger the gap.
We tested it with a placebo rather than an argument. Take the same 27,810 cards, shuffle each card's daily returns into a random order, then force every card's last price back to exactly its own opening price. Every constituent now ends the window precisely where it started, so the market by construction went nowhere, while the quotes still bounce around exactly as much as they really did. Buy-and-hold equal weight reads 0.00%, correctly, on every draw. The chain-linked construction reads +13.33% over 23 days on the seed published here, and across twelve seeds it runs from 12.63% to 13.46%, with buy-and-hold reading 0.00% on every one of them. An independent rerun with a different generator and twelve different seeds gives 12.52% to 13.42%, and buy-and-hold reads exactly 0.00% on every draw there too. The exact figure is a draw; the bias is not, and it is the bias rather than the draw that anyone should try to reproduce.
Buy-and-hold equal weight against chain-linked daily means, same cards, by price band
| Slice | Cards | Buy and hold | Chain-linked | Gap |
|---|---|---|---|---|
| all | 27,810 | +4.37% | +7.72% | 3.35 points |
| under $0.25 | 5,612 | +6.97% | +13.60% | 6.63 points |
| $0.25 to $1 | 5,247 | +11.72% | +14.75% | 3.03 points |
| $1 to $5 | 4,190 | +3.25% | +4.08% | 0.83 points |
| $5 to $25 | 7,804 | +1.01% | +0.94% | -0.07 points |
| $25 to $100 | 3,473 | +0.39% | +0.55% | 0.15 points |
| $100 and up | 1,484 | -1.34% | +22.87% | 24.21 points |
| placebo: every card forced flat | 27,810 | 0.00% | +13.33% | 13.33 points |
The gap tracks quote noise exactly as the arithmetic predicts. Under 25 cents the median non-zero daily quote change is 10.53% and the bias is 6.63 points; between $5 and $25 the median change is 1.01% and the bias is effectively zero. The $100-and-up row is a different failure and a more alarming one.
A composition change is not a price move, and our own code has had to learn it more than once
Every figure above used a balanced panel precisely so that composition could not contaminate it. Real indices do not get that luxury. 595 products entered our daily tape inside this 23-day window and 299 left it. Take the balanced panel's ending value and let the entrants join it without adjusting anything, which is what an index with no divisor does, and the window reads -1.22% against the -1.99% the same constituents actually delivered. The 0.77-point difference is $5,578 of cards that were not in the basket at the start. Do the cruder thing and compare the total value of everything priced today against everything priced on day one, which also drops the 299 exits and the $12,254 they carried, and the same window reads -2.73%. Three numbers, one market, and the only one that describes the constituents is -1.99%.
The large version is what happens at the sizes real indices are built at. A sum-of-levels index over 40 constituents jumps by the entire price of any card that joins it, because a card contributes zero before its first quote and its full dollar price on the day it appears. There is no divisor, no chain-link and no continuity factor in that construction; there is just a bigger sum. The same defect in reverse means a card that stops reporting is carried forward at its last price forever, so a dead constituent keeps voting.
The seven sets whose 30-day change the guard now withholds, of 87 quoted on the landing tape, 2026-09-22
| Set | Change as published | Change with the step neutralised | Step date | Constituents either side |
|---|---|---|---|---|
| Jungle | -61.2% | -0.1% | 2026-09-07 | 64 and 64 |
| Gym Heroes | -54.7% | +2.0% | 2026-09-07 | 132 and 132 |
| Gym Challenge | -47.6% | +0.6% | 2026-09-07 | 138 and 138 |
| Neo Destiny | -49.4% | +1.4% | 2026-09-07 | 113 and 113 |
| Team Rocket | -47.5% | +1.7% | 2026-09-07 | 83 and 83 |
| Legendary Collection | +27.5% | +0.3% | 2026-09-11 | 110 and 110 |
| Aquapolis | +2.7% | -15.6% | 2026-09-07 | 185 and 185 |
The audit flagged an eighth set, 30th Celebration, at +64.6%. It is not in the table because it cannot be: that set was released on 2026-09-16 and carries four days of post-release tape, so the month-long window that figure claims does not exist at all. It is deliberately left unlinked here, because a set link beside a window claim its tape cannot support is exactly what our own audit rule is built to reject. Its number is a coverage ramp-in artifact, and it is withheld by the release-date rule rather than by the step guard, which is why the guard suppresses seven and not eight. Our own audit tooling raised exactly that objection against a draft of this table, which is the argument for the tooling. Now read the Aquapolis row twice, because it is the row that taught us the most. Its published change is +2.7% and neutralising its one step gives -15.6%, and an earlier draft of this study read that as a real decline the defect had been concealing. It is the opposite. Aquapolis holds a single $4,500 card, the Lugia, whose quote fell to $1,400 on 2026-09-02 and returned to $4,500 on 2026-09-07; that is $3,100 out and $3,100 back on a basket of 185 cards. The published +2.7% is the two legs cancelling, which is roughly right. The -15.6% is what you get by neutralising one leg of a round trip and leaving the other standing, which is a number about our arithmetic and not about Aquapolis. A single-step neutralisation assumes there was one step. Note also that our own price-weighted line in the four-construction table above steps down 3.58 index points between 2026-09-06 and 2026-09-07, from 100.58 to 97.00, on the same day those five vintage sets stepped. The equal-weight line rises across that same pair of days and the median line does not move at all. That is the whole argument for weighting on ratios rather than on dollars, visible in one day of one table.
Most constituents are not contributing information at all
5,191 of the 27,810 cards in the balanced panel, 18.67%, did not change price by a single cent across all 24 days. The median constituent's quote was rewritten on 3 of the 23 possible days, and the interquartile range runs from 1 to 6. An index over this feed is therefore mostly carrying forward stale quotes, which flatters any measure of stability and is the reason The Frozen Tape found 37.5% of week-apart quotes identical to the cent. It is also why the median construction reads exactly 100.00 on all 24 days in the table above. That is not a bug in the median; it is the median telling the truth about a market where most quotes do not move.
As of 2026-09-22. The balanced panel is every TCGplayer product in `price_history` carrying a price on ALL 24 days from day 20695 to day 20718 inclusive and joining a `cards` row on `tcg_id`: n = 27,810, against 43,800 priced on the two endpoints and 44,711 on the tape at all. Every panel is keyed on the TCGplayer product id and carries exactly one row per product. 51,719 catalogue rows carry a TCGplayer product id, and they resolve to 50,507 distinct ids: 1,212 ids are claimed by two rows each, 2,424 rows in all. Those pairs are not a Japanese print against its English twin, which is what we assumed before counting them. Every one of the 1,212 is a same-language pair, 972 Japanese and 240 English, and they are overwhelmingly one product indexed under two catalogue spellings of the same set, as the XY trainer kits are. Each id collapses to a single row, preferring an English row and then the lexically first catalogue id, so no product enters a cross-section, a factor sort or a census twice. The tie-break is stated rather than assumed away, because it decides which of the two spellings a shared product is filed under. Restricting to the balanced panel is what makes the comparison valid, since any difference between the four levels is then weighting and nothing else. Prices are flagship-printing TCGplayer market prices, which are ASKS. Price-weighted level at t is the sum of constituent prices at t, rebased so that day 20695 equals 100. Equal-weight level at t is the arithmetic mean over constituents of price at t divided by price at day 20695, rebased the same way. Median level uses the median of those same ratios, upper-middle on even samples. Chain-linked equal-weight compounds, day by day, one plus the cross-sectional arithmetic mean of that day's simple returns. The time-shuffle placebo permutes each card's sequence of daily gross returns with a fixed seed, leaving its 24-day outcome unchanged; the zero-drift placebo additionally overwrites each card's final price with its own opening price, so the correct index reading is exactly zero by construction. Leave-one-out influence recomputes the chain-linked level of the $100-and-up band with each constituent removed in turn, 1,484 recomputations. Entry and exit counts compare membership on day 20695 against day 20718 across the full 44,711-card tape. Days 20704 to 20713 are partial catalogue dumps; cards missing on any of them are excluded from the balanced panel by construction, which is why the panel is 27,810 rather than 43,800, and that exclusion is itself a selection that we state rather than hide: the balanced panel skews toward cards the dump reaches every day. The account of moonstone's own index constructions is read from source, not inferred: `src/server/market-index.ts` and `src/server/db/indices.ts` for the Pokemon Index and the species indices, `packages/core/src/ppt.ts` (`buildSetHistory`) for the set series, and `packages/core/src/pricing.ts` (`basketChangeOverDays`) for the guard. The set-index audit in the table above was run against the 87 sets quoted on the landing tape on 2026-09-22, which is the same universe the tape itself builds: every owned `sethist2:` series in the tape's set list, cut at the set's recorded release date, whose latest reading is $25 or more. A set is listed when the guard withholds its 30-day change; the neutralised column rescales the series from the largest single-reading step onward and re-reads the same window. The constituent column counts the priced cards in that set in `price_history` on the day before and the day of the step, which is a second source rather than a restatement of the first: on six of the seven sets that count's dollar sum equals the stored series level to the cent on both days, and on the seventh, Gym Challenge, the two differ by exactly $44.49 on both days, so one card sits in the provider's basket that our set-name join does not reach. A constant difference either side of a step is itself proof that no constituent entered or left across it. 30th Celebration is excluded from the table because it was released on 2026-09-16 and carries four days of post-release tape, so the 30-day window its flagged figure claims does not exist; it is withheld by the release-date rule, not by the guard, which is why the guard's count is 7 and the flagged count is 8. The guard withholds a change rather than adjusting it, so figures published after 2026-09-22 show fewer set moves, not different ones. Its constituent-count branch is live in code but inert on today's data: `buildSetHistory` emits a count on every point it writes from now on, and zero of the 61,681 points across the 200 stored series carries one, so every suppression on this tape came from the 20% step ceiling.


