Skip to content

Methodology

How SilphCo Price works — and why you can trust it

Last updated:

SilphCo Price is the canonical valuation you see across the platform — on card pages, in your portfolio, and over the API. The headline number is the Midprice: a two-sided mark that averages what sellers are actually asking against what buyers actually paid. When a card has no usable two-sided quote, we fall back to Last — the most recent daily clearing price from the sales tape. We never invent a number when neither exists.

What Is Midprice?Link copied!

Most price sites show the last sale or a simple average — both of which can be noisy or misleading for illiquid collectibles. A last sale tells you what one person paid on one day; an average tells you about the past, not the market in front of you. Midprice resolves this by pricing both sides of the book: it averages the prevailing ask across venues against the median of recent qualifying sales. That gives you a mark that moves when supply moves, not only when a trade happens to print.

Midprice is computed per cohort — a specific card, finish, grade, language, and edition — so a PSA 10 reverse holo is never priced off a raw near-mint sale. Every mark carries the sample size behind it.

How the Price Is ChosenLink copied!

There is one current-price job, resolved by a two-step gate. We take the first source that clears its bar:

PriorityConditionDisplayed Price
1 — MidpriceA two-sided quote exists for this exact cohort, and the mark is above zeroMidprice — the average of the prevailing ask and the median of recent qualifying sales
2 — LastNo usable two-sided quote, but the card has tradedLast — the most recent daily clearing price from the sales tape
3 — NothingNeither a quote nor a qualifying saleNo price. We show the gap rather than estimate one

Asks alone are not a price — anyone can list a card at any number, and a one-sided quote tells you what someone hopes to get, not what the card is worth. Sales alone go stale the moment the market moves. Midprice needs both sides to agree before it speaks, which is why a thin or one-sided card falls through to Last instead of being marked off a single optimistic listing.

Adaptive WindowsLink copied!

A Charizard Base PSA 10 trades dozens of times a month; a vintage PSA 10 might trade once a year. A single fixed window would overreact for one and ignore the other. Wherever we need a lookback — the sales median inside a midprice, and the momentum trend — the window scales with trailing 30-day volume via an adaptive half-life:

30d SalesWindowWhy
10 or more14 daysFast-moving; recent prices matter most
3–930 daysSteady; balanced view
1–260 daysSparse; need more history
090 daysFloor fallback only

Outlier RejectionLink copied!

A $50,000 Charizard sale might be a wash trade, a typo, or a bundled deal. SilphCo Price uses a modified Z-score filter to detect and exclude these outliers before averaging — conservative enough to catch genuine anomalies without discarding legitimate market moves.

Confidence LevelsLink copied!

Every midprice carries a status describing the shape of the book behind it. Only ok and thin are shown as the headline price. The rest are published for traders who want to see the book, but they never become the number on the card.

ok
Asks and sales both present and in agreement. The strongest signal, and the only one with no caveat.
thin
Two-sided, but backed by few observations. Shown as the headline with a thin-sample marker.
wide
Bid and ask are far apart. A midpoint between two numbers that disagree is not a price anyone would trade at, so this falls through to Last.
one_sided_ask
Listings exist but nothing has sold. Supply without demand — an asking price, not a clearing price.
one_sided_sale
Sales exist but nothing is currently listed. Tells you what it went for, not what it would go for now.
inverted
The best ask sits below the recent sale median. Usually a print or grade mismatch upstream; never used as a mark.

Two-sided coverage is genuinely scarce: today about 8% of card-and-grade cohorts clear the ok/thin bar. The rest of the market is priced off Last. We would rather tell you that than dress up a one-sided listing as a market price.

direct and direct_offchain prices are backed by actual sales. set_estimate and grader_estimate are directional only — useful for trends, not for setting exact listing prices.

Grade InferenceLink copied!

Not every grade trades regularly. A PSA 10 Charizard sells weekly, but a PSA 8 can go months between sales. Rather than showing a stale price, SilphCo infers it from nearby grades using historical premiums — computed from 90-day co-occurrence data, falling back to set-level medians then global defaults.

Rules of thumb:

  • We never infer across more than 2 grade steps (PSA 10 can infer PSA 9 and PSA 8, but not PSA 7).
  • Collectible grades (8–10) never mix with low grades (1–6) — the markets behave differently.
  • Inferred prices never feed further inference. A PSA 9 inferred from PSA 10 will not be used to infer PSA 8.

On-Chain vs Off-ChainLink copied!

SilphCo blends two sources of sales data:

On-Chain Sales

Sales recorded on the blockchain via Courtyard (Polygon), Collector Crypt, Phygitals, Beezie, and Magic Eden (Solana). These are cryptographically verified — the transaction hash proves the sale happened at the stated price. On-chain data is our primary source when it is fresh.

Off-Chain Sales

Sales from eBay, TCGPlayer, and PokemonPriceTracker Business. These represent the traditional paper market. Off-chain data fills gaps when on-chain sales are stale or missing, especially for vintage cards that rarely trade on-chain.

On-chain is primary. If it is fresh, we use it. If stale or missing, off-chain fills the gap. Both sources land in the same sales tape and are normalized to the same cohort grain, so they are directly comparable and feed one mark rather than two.

StalenessLink copied!

Every SilphCo Price carries a staleness score from 0 to 1:

  • 1.0 — Very fresh. Sales within the adaptive window.
  • 0.5 — Borderline. Sales exist but are aging.
  • Below 0.5 — Stale. The UI shows "Estimated" to warn you the underlying data is old.

Staleness is the weighted average age of sales relative to the adaptive half-life. A 14-day-window card with its last sale 10 days ago is fresher than a 90-day-window card with its last sale 60 days ago.

MomentumLink copied!

When a card shows a statistically significant trend, SilphCo attaches a momentum signal.

Momentum is measured on its own internal time-weighted series, not on the headline price — a mark that switches between Midprice and Last would produce trend artifacts at every switch. We reconstruct weekly snapshots of that series going back twice the adaptive half-life and fit a trend line. If the slope is strong enough to distinguish from noise, we label it Up or Down. If not, we label it Flat with no directional signal.

The forecast horizon matches liquidity: fast-trading cards get a 7-day forecast, sparse cards up to 45 days. Confidence bands widen with less data — wide at 4 snapshots (reflecting genuine uncertainty), narrowing as more history accumulates.

Technical SummaryLink copied!

For developers and data scientists who want the exact formulas:

  • Midprice = mean(mid_ask, sales_median) per cohort, where the ask leg is p25 at 3 or more asks, the median at 2, and the lone ask at 1.
  • Asks are fenced at write time: an ask below 8% or above 15x the finish-matched mark is dropped before it can enter the book.
  • The internal momentum series uses exponential decay weights w = exp(-ln(2)/H * age) where H is the adaptive half-life in days.
  • Outlier rejection uses modified Z-score with median absolute deviation (MAD), threshold = 3.5.
  • Grade premiums are computed from 90-day card-level co-occurrence, falling back to set-level medians and then global defaults.
  • Cross-grader premiums are era-aware (pre-2010, 2010-2020, 2021-plus) with same-era pairs weighted 2x.
  • Momentum uses decay-weighted least squares (WLS) on reconstructed weekly snapshots of that series. Significance gate: |t-statistic| >= 1.5.
  • Prediction bands use the t-distribution with n-2 degrees of freedom, converging to +/- 1.96 sigma as data grows.