import type { Metadata } from "next"; import Link from "next/link"; import { Page, PageHeader } from "@/components/ui/section"; export const metadata: Metadata = { title: "Methodology", description: "How Market Atlas forms canonical prices: observations, consensus, freshness semantics, confidence, source families, reliability scores and derived metrics.", alternates: { canonical: "/methodology" } }; export default function MethodologyPage() { return (

1. Observations, not prices

The atomic unit is an observation: one field (last price, bid, ask, volume, yield…) for one instrument, from one source, at one time. Every observation keeps its source timestamp when the source publishes one, the moment Market Atlas received it, its data-rights status, its real-time class and a reference to the raw payload it was extracted from (layers L0 raw → L1 parsed → L2 normalized → L3 canonical → L4 derived).

2. Instrument resolution

A ticker alone never identifies a security. Each source symbol (BTC-USD, BTC/USD, BTCUSD, BRK.B, BRK-B…) is resolved through a per-source alias table to one stable Market Atlas id such as eq_us_xnas_aapl, crypto_btc_usd, fx_eur_usd or index_us_spx. USD and USDT crypto pairs are different instruments. Listed US equities come from the Nasdaq Trader symbol directories and the SEC company directory (CIK), which is how filings link to instruments.

3. Source Mesh: observation types, comparability, roles

One instrument → many observers → one canonical market state. Every observation carries an observation type that says what the value is: TRADE (last trade on a venue), MID, QUOTE (bid/ask), INDEX_VALUE, INDICATIVE, STABLECOIN_PROXY (a fiat rate implied by a USDT/USDC market), DERIVED, OFFICIAL_FIX (central-bank fixing), REFERENCE_RATE (policy rate, par yield), SETTLEMENT, EOD_CLOSE, NAV. Types map to three comparability classes: LIVE (trades, mids, quotes, index values, proxies), FIX (official fixings, reference rates) and EOD (settlements, daily closes). Values of different classes are never compared: an ECB fixing at 16:00 CET is not a live EUR/USD mid, and last week's close is not divergent from today's. The canonical value uses the best class available — live real markets first, then official fixings, then end-of-day closes, then live proxies alone (labelled indicative) — and other classes are reported in the matrix as not_comparable. Inside a class, observations must also be close in time (live: within two minutes of the freshest; fixings/closes: same UTC day), otherwise temporal_mismatch.

Each fresh, comparable observation then plays one of three roles:

  • Votes — observations from real markets and official publishers set the canonical value (weighted median).
  • Confirms — proxies (stablecoin markets, derived crosses, indicative values) join the median with reduced weight (35 % when a real market exists) and never count as an independent family; the number of proxies agreeing within 50 bp is shown as proxy_count.
  • Validates — sources whose data rights forbid redistribution (for example nasdaq.com's delayed quote) are compared to the consensus but never vote and are never displayed (validation_only); agreement within 25 bp raises confidence, disagreement beyond 50 bp is flagged validator_disagrees.

Redundancy targets. Instruments are tiered: A (majors — AAPL, SPX, BTC, EUR/USD, gold…) target ≥ 3 independent families and 5 observations; B (liquid crypto, FX, indices, ETFs) ≥ 2 families and 3 observations; C (long tail) 1 family and 2 observations; D (official reference series such as Treasury par yields or policy rates) one official source is the truth. The source coverage page scores every quoted instrument against its target (65 % family attainment + 35 % observation attainment) and lists the expansion queue.

Statistical lineage. Two sources whose last prices coincide (identical value within two seconds) on at least 92 % of 120+ aligned samples very likely redistribute the same upstream vendor. Market Atlas then treats them as one family — even without contractual knowledge of the vendor — and publishes the pair on the coverage page. Hidden commercial relationships are never asserted; the similarity is shown as what it is.

4. Consensus

For every instrument and field, the engine keeps the latest observation of each source, then computes:

  • Freshness window. Real-time observations count for 15 seconds, delayed feeds for 30 minutes, indicative values for one hour, end-of-day values for ten days (weekly-refreshed official datasets). While a venue is closed, the last session value stays valid for up to four days and is reported as at close. Anything older is excluded and marked stale.
  • Comparability. Only observations of the canonical class (see section 3) that are close in time are compared; other classes are reported as not_comparable or temporal_mismatch, never mixed and never counted as divergence.
  • Weights. weight = source reliability × timestamp quality (exchange 1.0, source 0.9, connector 0.75) × real-time class (real time 1.0, delayed 0.6, indicative 0.5, end of day 0.4) × official-source bonus (×1.6 for rates and yields, ×1.15 otherwise) × freshness decay. For crypto, a venue's weight also scales with its share of the 24-hour notional volume among voters, so a thin venue never outweighs the deepest markets.
  • Source families. Sources believed to share an upstream — declared, or inferred statistically — count as one vote; extra members of a family receive a quarter of their weight. The number of independent sources shown everywhere is the number of distinct voting families; proxies and validators are counted separately.
  • Outliers. With three or more candidates, values more than 2 % away from the weighted median are excluded (reason outlier).
  • Canonical value. The weighted median of the remaining candidates. Dispersion is the spread between the highest and lowest included value, in basis points.

5. Confidence

Confidence is a 0–1 score of Market Atlas' own agreement, redundancy and freshness — never a prediction or a view on the instrument: 0.15 + 0.35 × agreement + 0.25 × redundancy + 0.10 × freshness + 0.15 × mean reliability, capped at 0.995 so the interface never claims false precision. Agreement falls to zero at 1 % dispersion; redundancy is 1 − e^(−(families + ½ proxies + ½ validators)/2) (one family ≈ 0.39, three ≈ 0.78, five ≈ 0.92); freshness decays with the age of the newest observation (fixed at 1 while a venue is closed). A single stale observation yields confidence 0.

6. Data status labels

Label Meaning
Live At least one real-time source within the freshness window (crypto venue feeds).
Delayed Value from a feed that is contractually delayed (Cboe quotes are 15 minutes behind).
At close The venue is closed; the value is the last session's, shown with the closing time.
End of day Official or licensed daily value (ECB/Bank of Canada fixings, Treasury par yields, daily bars).
Indicative Only proxies (stablecoin markets, derived crosses) are fresh — the value is a live approximation, not a quote from a real market for the instrument.
Stale No source within its window; the last known value is displayed with its age and confidence 0.
Withheld The value exists but its data rights do not allow public redistribution; provenance metadata is still shown.

7. Source reliability

Each connector carries an operational score from 0 to 100: 40 % availability (share of minutes healthy), 20 % parse success, 15 % latency (p95 under 1 s = full marks), 15 % connection stability, 10 % error rate. It measures how well the integration behaves, not the quality of the venue. The best score across a source's connectors feeds the consensus weight.

8. Events

Ticks are noisy; events are meaningful. Derived events use per-instrument baselines: a price move fires when the change since the last event exceeds max(0.5 %, 8 × the typical tick move); session highs/lows require 200 observations and a 0.1 % improvement; a volatility spike compares realized volatility over the last 30 ticks with an exponentially weighted baseline (≥ 4×); source divergence fires when voting sources of the same comparability class disagree by more than 100 bps (at most once an hour per instrument). Venue and regulator events (halts, filings) are deduplicated on their native identifiers; additional sources confirming the same event increase its source count instead of creating a duplicate.

9. Bars and derived metrics

One-minute bars are aggregated from canonical prices and rolled up to 5m/15m/1h/1d; daily history for equities, indices, FX, crypto and continuous futures comes from licensed end-of-day bars. Market Atlas never overwrites an official daily bar with a derived one. Returns, volatility, drawdown, correlation, breadth and “what changed” counts are computed from these bars and labelled derived.

10. Market hours

Session states (pre, open, post, closed, holiday, early close) come from a calendar engine using IANA time zones, per-venue sessions and holiday tables; US holidays are refreshed from the Nasdaq Trader schedule page by an HTML change-detection connector. Nothing is hard-coded to 09:30–16:00.

11. Limitations

  • Equity and index quotes are delayed 15 minutes; Market Atlas does not hold real-time US equity redistribution rights.
  • Rates and yields are official reference values, published once a day. Major FX pairs are live from Kraken's and Bitstamp's fiat markets (real trades, keyless) with stablecoin-market proxies as confirmations; central-bank fixings remain the FIX-class reference and are never mixed with live values.
  • Intraday history starts when Market Atlas first observed an instrument live; gaps are never interpolated.
  • Coverage measures Market Atlas observation, not market size or quality.

See also: data rights, sources, developer documentation.

); }