Charizard ex HoloPSA 10$1,6110.4%
Cubone NormalPSA 10$3366.5%
Charmander HoloPSA 10$6690.3%
Ivysaur HoloPSA 10$3553.2%
Squirtle HoloPSA 10$5292.9%
Poliwrath UnlimitedPSA 10$8890.8%
Clefairy UnlimitedPSA 9$2574.0%
Vulpix UnlimitedPSA 10$1130.1%
Nidoqueen HoloPSA 9$1253.6%
Hitmonlee 1st Edition GalaxyPSA 9$2854.9%
Arbok ex HoloPSA 10$922.6%
Gengar GalaxyPSA 8$3310.3%
Blastoise ex HoloPSA 9$1752.6%
Venusaur ex HoloPSA 10$4950.2%
Zapdos UnlimitedPSA 9$2003.3%
Mew ex HoloPSA 10$2212.1%
Venusaur UnlimitedPSA 9$6412.5%
Magikarp UnlimitedPSA 9$625.2%
Machoke HoloPSA 10$1890.1%
Clefable HoloPSA 9$1310.5%
Alakazam UnlimitedPSA 7$821.4%
Venomoth HoloPSA 9$850.0%
Venusaur ex HoloPSA 10$1343.1%
Charizard 1st Edition ShadowlessPSA 10$58,20135.7%
Zapdos ex HoloPSA 10$4610.7%
Clefable PrereleasePSA 9$7,7750.0%
Flareon NormalPSA 10$32232.2%
Dragonite 1st Edition GalaxyPSA 9$2,4950.2%
Gengar 1st EditionPSA 10$1,39920.0%
Pikachu HoloPSA 10$6002.3%
Item Finder 1st Edition ShadowlessPSA 8$13731.1%
Gengar 1st Edition GalaxyPSA 10$28,1040.0%
Nidorino UnlimitedPSA 9$4623.5%
Alakazam ex HoloPSA 10$3561.5%
Voltorb UnlimitedPSA 9$5521.2%
Charmeleon HoloPSA 10$5253.3%
Potion UnlimitedPSA 10$7821.1%
Pikachu 1st EditionPSA 10$1,0472.0%
Jolteon 1st EditionPSA 10$72620.3%
Bulbasaur HoloPSA 10$3382.3%
Vulpix 1st Edition ShadowlessPSA 8$6919.3%
Snorlax 1st EditionPSA 9$2,6571.3%
Squirtle 1st Edition ShadowlessPSA 6$11219.2%
Articuno 1st Edition GalaxyPSA 10$11,2090.0%
Raichu GalaxyPSA 6$417.0%
Flareon 1st EditionPSA 10$7,3090.0%
Magikarp 1st Edition ShadowlessPSA 6$13318.6%
Zapdos 1st Edition GalaxyPSA 10$4,0120.0%
Mr. Mime HoloPSA 6$3517.9%
Moltres 1st Edition GalaxyPSA 10$4,3940.0%

Fair Value Methodology

TCGBerg's fair-value estimator produces a single dollar figure for every atom, the (printing, grader, grade) tuple, that we track. The estimator runs daily against the trailing 30-sale window per atom, USD-converted, and emits two outputs: the point estimate and a 0-100 confidence score capturing uncertainty in that estimate. Fair value is not a recent sale, not an asking price, and not a dealer markup. It is a confidence-scored blend of four statistical estimators (sale-rank EWMA, trimmed median, recent-window robust, and trend projection) with adaptive weights tuned per atom based on dispersion, sample density, and recency. Outliers are winsorized rather than dropped, so a shill bid or charity sale is neutralized without shrinking a thin sample. The result is a value designed to be stable through outlier sales yet responsive to genuine regime shifts. This page is the public spec; the PDF linked below is the full technical document the implementation follows.

Download PDF spec

The Atom Model

The atom is the (printing, grader, grade) tuple. A printing is a specific physical print run of a card: "Charizard Base Set 1st Edition Shadowless" is a different printing from "Charizard Base Set Unlimited" even though they share the card identity. A grader is PSA, BGS, or CGC; we treat each grader's scale independently because their condition standards differ. A grade is the quality level (PSA 9, BGS 9.5) that the grader assigned.

Why this granularity? Because the market values atoms, not cards. A 1st Edition Shadowless PSA 10 and an Unlimited PSA 10 share a card identity but are economically distinct: the supply curves, demand patterns, and price discovery mechanisms have little overlap. Aggregating them into one "Charizard PSA 10" mean would obscure both individual prices and the printing-driven scarcity premium.

A single card may correspond to dozens of atoms: three or four printings, times the PSA grade ladder, plus other graders and raw. TCGBerg tracks thousands of atoms across the sets currently live, with coverage expanding as new sets onboard.

The atom is also the unit at which we publish data. Every page on TCGBerg either renders an atom's metrics (card detail page) or aggregates atoms (set page, index page, market cap rollups). The fair-value engine runs once per atom per day.

Winsorization, Not Trimming

Before any estimator runs, the sample is winsorized: prices below the 1st percentile are raised to it, and prices above the 99th percentile are lowered to it (applied only when the sample has at least 5 sales; smaller samples skip the step). Winsorizing rather than dropping preserves sample size, which is critical for thinly traded cards where every observation matters, while neutralizing the distortion of erroneous transactions, shill bids, and charity sales.

Why 1/99 instead of 5/95? With samples capped at 30 sales, the 1st/99th percentile only touches the actual extremes; a 5/95 cut would aggressively clip normal variance. The 1/99 cut intervenes only when something is genuinely anomalous. Whether winsorization touched any price is recorded and feeds the confidence score's outlier sub-score.

Four Blending Methods

The estimator uses four methods, each capturing a different signal in the sale stream. The final fair value is a weighted blend; weights adapt per atom based on the sample's statistical properties.

Method A: Sale-rank EWMA. Exponentially weighted moving average over the last 10 sales, where the weight depends on the sale's rank, not its calendar date, with a half-life of 3 sales (the most recent sale weighs 1.0, the third-most-recent 0.50). Tracks short-run momentum without being too jumpy. Default weight: 40% of the blend.

Method B: Trimmed median. Median of the last 10 sales, post-winsorization (the winsorization step has already neutralized extremes, so no further trimming is applied). More robust than the mean when the sale distribution is skewed, which is typical for cards. Default weight: 40%.

Method C: Recent-window robust. Median of all sales in the trailing 30 calendar days, computed only when that window holds at least 5 transactions; otherwise it outputs no signal and the other methods absorb its weight. When it fires, it anchors the estimate to current market conditions. Default weight: 20%.

Method D: Trend projection. OLS regression of log-price against days-ago over the last 20 sales, projected to today. Only contributes when the regression's R-squared is at least 0.5; a weaker trend is statistically meaningless and gets zero weight. Captures sustained drifts that pure averaging lags. Default weight: 0% (activates only on strong trends).

Three adaptive rules then adjust the default 40/40/20/0 weights:
  1. High dispersion (price coefficient of variation above 0.30): boost the trimmed median (+0.20), dampen EWMA and recent (-0.10 each). When the sale stream is noisy, the median is the more reliable signal.
  2. Strong trend (R-squared at least 0.50): boost EWMA (+0.10) and activate trend projection (+0.20), dampen median (-0.20) and recent (-0.10). When prices are genuinely trending, recent sales are more informative.
  3. High recent density (8 or more sales in the trailing 30 days): boost recent-window robust (+0.20), dampen EWMA and median (-0.10 each). A deep recent sample deserves more trust than longer-horizon estimators.

Multiple rules can fire together. Methods that returned no value are excluded, negative weights are clamped to zero, and the remaining weights renormalize to sum to 1.0. The point estimate is the weighted sum of the surviving method outputs.

Confidence Scoring

Every fair value is published with a 0-100 confidence score that quantifies how trustworthy the point estimate is. The score is a weighted sum of five sub-scores, each independently 0-100:
  - Sample adequacy (weight 25%): a saturating curve over the sale count; roughly half-score at 3-4 sales, near 100 by 15.
  - Recency (weight 30%): 100 when the latest sale is within a week, then exponential decay with a 30-day half-life (a 30-day-old latest sale scores about 50, a 90-day-old one about 12).
  - Density (weight 15%): the mean gap between consecutive sales; 100 at a 14-day-or-tighter cadence, falling to 0 at 90-day gaps.
  - Price stability (weight 20%): the inverse of dispersion; 100 when the coefficient of variation is at or below 0.10, falling to 0 at 0.50.
  - Outlier penalty (weight 10%): a flat 70 when winsorization had to clip any price, else 100.

The weighted sum lands in 0-100 and buckets into labels: 80-100 very high, 60-79 high, 40-59 medium, 20-39 low, 1-19 very low, and 0 meaning no data at all. The score drives the confidence badges across TCGBerg and is what downstream consumers filter or weight on: indices dampen low-confidence atoms, and the deal screener requires trustworthy fair values before flagging a listing.

Edge Cases and Limitations

A few cases warrant explicit handling:
  - Thin samples. Even a single recent sale produces a fair value, with appropriately low confidence; methods that need more data simply drop out of the blend. The pipeline returns no value only when no sales exist at all.
  - No sales. No fair value is published and the atom shows an empty state until a transaction lands.
  - Currency conversion. EUR, GBP, and JPY sales are converted to USD using the daily ECB reference rate for the fair-value calculation date. Historical backfills use the corresponding historical rate.
  - Sale venues are not weighted. An auction-house hammer price and an eBay sale enter the sample equally; venue premiums are not deflated. Winsorization absorbs only egregious extremes.
  - Raw (ungraded) cards. The raw values shown on TCGBerg are market prices per condition sourced from ungraded-sale aggregators, not fair-value engine output; there is no raw fair value yet.
  - Ambiguous attributions. Sales that cannot be confidently attributed to a specific printing are excluded from the sample rather than risk cross-printing pollution.

For the full algorithmic spec including formulas, worked examples, and the persistence schema, see the methodology PDF linked at the top of this page.

Frequently asked

Is fair value the same as the last sale?
No. Fair value is a confidence-scored blend of four estimators over the trailing 30-sale window. A single sale 20% above the prior fair value moves the output a few percent at most, exactly because one outlier sale should not dominate.
How often does fair value update?
Daily, after the overnight ingestion completes. The estimator recomputes every atom's fair value and confidence score from the latest sale data; re-running for the same date is idempotent.
Why are the four methods weighted 40/40/20/0 by default?
The defaults balance momentum (EWMA) against robustness (median) with a smaller anchor to the very recent window, and keep the trend projection dark unless a trend is statistically strong. They are starting points, not dogma: the adaptive rules shift weight per atom based on dispersion, trend strength, and recent density, and the thresholds are config-tunable.
What happens if the four methods disagree?
Each contributes its dollar estimate at its weight, so the blend lands between them. Wide disagreement usually coincides with high dispersion, which both shifts weight toward the robust median and lowers the price-stability sub-score, so the published confidence drops at the same time.
Does TCGBerg use machine learning?
No. The fair-value estimator is a transparent statistical blend. The trading card market does not generate enough labeled data to train robust models at the atom level, and interpretability matters: a five-figure fair value needs an auditable derivation, not a black-box output. Every published value persists its method blend and sub-scores.
How is confidence different from accuracy?
Confidence is a self-reported uncertainty measure computed from the input sample's properties: size, recency, density, dispersion, and outliers. It says how much evidence backs the estimate, not how close the estimate will be to the next sale. Empirical accuracy is monitored separately and the two generally move together.
Why winsorize instead of dropping outliers?
Dropping discards information, which hurts most exactly where samples are thinnest. Winsorizing clips an anomalous price to the sample's 1st/99th percentile, neutralizing the distortion while keeping the observation's place in the sample, and the confidence score still records that the sample needed cleaning.
Are international sales included?
Yes. EUR, GBP, and JPY sales convert to USD before entering the sample using the daily ECB reference rate for the fair-value calculation date.