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

















































