Reference/Trade Performance Data Gaps

Trade Performance Data Gaps

This note explains the current data gap behind Alpha execution-quality and forward-outcome metrics. It is written for operators reviewing the Performance page after Alpha trades have synced.

Current State

The Alpha feed is synced and the Performance page can score whether Alpha trades were directionally consistent with the dashboard's available market context at execution time. That does not mean every context group is complete. Some groups are available, some are partial, some are unavailable, and some are deliberately not sourced.

What remains limited is instrument-level valuation data for the actual traded MSTR and COIN options:

  • Execution benchmarks need sourced bid/ask/mid quotes near the trade timestamp.
  • Execution-quality liquidity needs traded-contract OI, volume, spread, and quote-age inputs. BTC proxy liquidity is market backdrop only.
  • Forward outcomes need sourced option marks at 1d, 7d, and 30d horizons. If the requested horizon falls after option expiry, the backfill can attempt a terminal option quote near expiry instead of looking for a non-existent live quote at the later horizon.
  • Realized P&L needs an authoritative accounting, settlement, or validated lifecycle source.

Unavailable economics must stay blank or labelled unavailable. They must not display as zero.

The source-authority policy for direct, proxy, estimated, stale, pending, unavailable, unsupported, and not-entitled states is maintained in the Source Authority Register.

The derivative-equivalent identity policy for exact listed, adjusted, fallback, SMA/OTC mapped, unsupported, and unmapped contracts is maintained in Derivative Identity And Proxy Mapping.

The preparatory plan for converting these gaps into reliable source diagnostics is maintained in Data Ingestion Readiness Plan. Future SMA-specific source fields and mapping questions are maintained in SMA Ingestion Requirements.

Current Production Snapshot

As of the 2026-05-10 production API check for source=alpha_sync, lookback_days=365, and limit=1000:

AreaCurrent production stateRemaining issue
Opportunity context749/751 scored; 2 insufficientContext is populated for nearly the full loaded Alpha sample. Missing context is not the main blocker.
Execution benchmarks331/751 quoted, 420/751 unavailableQuoted coverage exists for part of the book, but many adjusted 2MSTR/2COIN rows and some standard MSTR/COIN rows still have no usable fresh quote.
Execution liquidity331 partial, 250 unavailable, 170 not sourced; 0 contract-volume rows and 0 open-interest rowsFresh bid/ask supports partial execution reads where quoted, but full execution-liquidity coverage needs traded-contract volume and open interest from Amberdata or another source.
7d forward outcomes177/751 available, 1 pending, 573 unavailable in the 7d outcome state tableFallback added sourced marks for a subset, but most 7d marks remain unavailable. Some unavailable rows expired before the 7d horizon and need terminal quote, settlement, or accounting source logic.
1d forward outcomesPartially availableFallback added a small number of adjusted-contract 1d marks; most adjusted and standard missing marks remain unavailable.
30d forward outcomesMostly pending or unavailableMany 30d horizons have not matured yet; matured rows still need sourced marks.
BTC proxy liquidity749 partial, 2 unavailableBTC OI/backdrop is context only. It still does not provide MSTR/COIN traded-contract execution liquidity.
Smile751/751 not sourcedIntentionally not sourced for Alpha MSTR/COIN rows unless a trade-level smile method is approved.
Realized P&LNot sourcedRequires authoritative accounting, PMS, broker, settlement, or validated lifecycle source.

The adjusted-contract fallback is intentionally source-labelled as:

amberdata_tradfi_level1_standard_root_fallback

That label means the row used standard MSTR/COIN quote lookup for an adjusted Alpha root such as 2MSTR or 2COIN. It is an explicit temporary analysis decision, not proof that the adjusted contract deliverable is identical to the standard contract.

Expiry-aware outcome marks are separately source-labelled:

amberdata_tradfi_level1_expiry_quote
amberdata_tradfi_level1_standard_root_expiry_quote_fallback

These labels mean the requested outcome horizon was after option expiry, so the backfill tried to source a terminal option quote near the expiry timestamp. They are not modelled intrinsic value and they are not authoritative realized P&L. If no expiry quote is available, the row remains unavailable with expiry_mark in missing_fields.

Performance Backfill And Sourcing Plan

This table separates what already exists as dashboard context, what can be backfilled from stored history, and what still needs a real source for the traded MSTR/COIN contracts.

AreaField / metricCurrent statusNeeds sourced data?Needs backfill?Notes
Opportunity contextmarket_proxy / BTC-linked backdropSourced for current Alpha sampleNoNo current gapKeep BTC as the regime/opportunity proxy only. Do not use it as execution-quality liquidity.
Opportunity contextspot_at_trade, dvol, iv_30d, rv_30d, vrp, gamma_regime, stationarity_status, term_structure_stateSourced for current Alpha sampleNo current source gapNo current gapThese were backfilled from stored BTC context history where defensible.
Opportunity contextdvol_percentileSourced for current Alpha sampleNo current source gapNo current gapDerived from stored DVol history.
Opportunity contextsmile_rich_cheapIntentionally unsourced for current Alpha proxy rowsYes, if trade-level smile is desiredNo until a decision is madeKeep not_sourced unless the product explicitly approves a trade-level smile method.
Execution qualitybenchmark_bid, benchmark_ask, benchmark_mid331/751 quotedYesYes, after sourcingCurrent source is Amberdata TradFi level-1 quotes plus the explicitly labelled adjusted-standard fallback. Remaining gaps need authoritative adjusted-contract mapping, more complete quote coverage, or another source.
Execution qualityfill_vs_mid, fill_vs_mid_usd, fill_vs_mid_bps, spread_captureAvailable only for quoted rowsNo, if quotes already existYesDerived from benchmark quote rows once bid/ask/mid data are present.
Execution qualitybenchmark_mark, benchmark_iv, fill_vs_surface_markPartialYes or model fallbackYesCan be quote-based or explicitly estimated, but source labels must stay explicit.
Outcome quality1d / 7d / 30d forward marksPartial / incompleteYesYes, after sourcingNeeds sourced marks for the traded MSTR/COIN contract at the target horizons. Adjusted fallback added a small number of marks but did not solve most gaps.
Outcome qualityforward_pnl, return_on_premium, realized_vol_captureNot completeNo, if marks already existYesDerived from the forward marks and entry economics.
Lifecycle / realized P&LOpen/closed grouping, realized closed P&LNot completeYesYes, after groupingNeeds lifecycle intent or defensible pairing before it becomes user-facing realized P&L.
UI / aggregationavailable_count, unavailable_count, estimated_count, stale_count, proxy_mapped_countNeeded everywhereNoYesEvery aggregate should expose coverage and missingness so gaps cannot be mistaken for zero.

Outstanding Data Issues

These are the data issues that remain after the current backfills and adjusted-standard fallback.

IssueCurrent evidenceRequired next step
Adjusted 2MSTR / 2COIN contract precisionFallback recovered some rows but most adjusted rows remain unavailable. Fallback rows are labelled amberdata_tradfi_level1_standard_root_fallback.Source authoritative adjusted-contract symbology/deliverables from Alpha, broker/OMS, OCC/OPRA, OptionMetrics, or another approved vendor.
Standard MSTR/COIN quote gapsRepresentative Amberdata direct calls return HTTP 200 with empty data for exact native instruments and timestamps, while covered contracts return quote rows.Confirm Amberdata coverage/entitlement and symbol requirements, or use a second market-data source.
Amberdata one-hour request limitSingle level-1 quote requests wider than one hour are rejected.Use the opt-in chunked recovery controls for broader nearest-session recovery, or source a specific historical endpoint/vendor that supports broader search.
Expired-before-horizon outcome marksProduction probes showed many 7d gaps where the option expired before the 7d target, so live horizon quote lookup cannot work by construction.Attempt terminal option quotes at expiry. If terminal quotes are missing, source OCC/OPRA/settlement, accounting, PMS, broker, or Alpha realized outcome data.
Contract-level execution liquidityBTC proxy liquidity remains partial and is not MSTR/COIN execution liquidity.Source traded-contract volume, OI, bid/ask, mid/spread, and quote age near execution.
Trade-level smile richnesssmile_rich_cheap remains intentionally not sourced for all Alpha MSTR/COIN rows.Approve MSTR/COIN equity-option smile sourcing or an explicit proxy method; otherwise keep not_sourced.
Authoritative realized P&LDerived lifecycle coverage exists, but realized P&L remains withheld.Source accounting/PMS/broker/settlement P&L or validate lifecycle accounting before showing realized P&L.
Strategy intent and lifecycle flagsAlpha rows do not yet provide strategy intent, opening/closing flag, or parent-order grouping.Add source fields or business rules before treating buy/sell direction as full trade intent.

Backfill Strategy

  1. Keep BTC proxy context for opportunity analysis as-is.
  2. Backfill trade_market_context from stored snapshot history for all Alpha rows.
  3. Source and backfill execution benchmark rows for MSTR/COIN quotes where coverage exists.
  4. Source and backfill forward outcome marks for 1d, 7d, and 30d horizons.
  5. Keep realized P&L and trade-level smile richness explicitly unavailable until the product decides to source them.
  6. Expose quality states on every aggregate so missing data cannot be mistaken for zero.

Execution Benchmarks

Execution quality answers whether a trade filled well versus the market for the exact traded option. For the current Alpha scope, the benchmark source must be MSTR or COIN TradFi option data, not BTC option data.

For each execution, the dashboard needs a quote matching:

  • the same underlying, currently MSTR or COIN
  • the same expiry
  • the same strike
  • the same call/put side
  • a timestamp close to the Alpha execution time
  • a freshness window tight enough to trust

When a fresh quote exists:

DirectionFill-vs-mid formulaInterpretation
Buyfill_price - benchmark_midPositive means the fill was worse than mid; negative means better than mid.
Sellbenchmark_mid - fill_pricePositive means the fill was worse than mid; negative means better than mid.

If no fresh sourced bid/ask/mid exists, execution quality is unavailable.

That is not the same as zero slippage:

  • 0 slippage means the fill exactly matched mid.
  • unavailable means there is no defensible mid quote.

The dashboard must not infer good or bad execution from unavailable quote data.

Execution-Quality Liquidity

The current Performance source-group table may show BTC Proxy Liquidity. That is not the same as Alpha execution liquidity.

BTC proxy liquidity can describe broad crypto-vol market backdrop. It should not be used to judge whether a specific MSTR/COIN option trade was easy to execute.

To score execution-quality liquidity, the dashboard needs MSTR/COIN traded-contract data near the Alpha execution timestamp:

  • contract open interest
  • contract volume
  • bid
  • ask
  • mid and spread
  • quote timestamp / quote age
  • contract identifier match to the Alpha row

Current implementation stores traded-contract bid/ask, mid/spread, quote age, and bid/ask quote size when Amberdata returns a fresh MSTR/COIN level-1 quote. Sampled MSTR and COIN level-1 quote responses did not include 24h contract volume or open interest, so those fields remain null unless the provider returns explicit volume24h/contractVolume24h and openInterest-style fields. Missing volume/OI must not be shown as zero.

Execution-liquidity quality states:

StateMeaning
availableFresh traded-contract quote plus contract 24h volume and open interest are sourced.
partialFresh traded-contract bid/ask is sourced, but volume or open interest is missing.
staleA quote was found but is outside the configured freshness tolerance.
unavailableNo usable quote was found.
not_entitledProvider rejected the lookup due to entitlement/permission.
not_sourcedThe contract is deliberately not looked up, for example an adjusted Alpha contract that cannot be safely mapped to the standard OCC root.

Forward Outcome Marks

Forward outcomes answer what happened after the trade at a defined horizon. For each trade, the dashboard looks for a sourced mark for the same MSTR or COIN option around:

  • trade_time + 1 day
  • trade_time + 7 days
  • trade_time + 30 days

If the requested horizon is after option expiry, the backfill attempts a terminal option quote around the expiry timestamp. A successful terminal quote is persisted with outcome_state = terminal_mark and an expiry quote source label. A missing terminal quote remains unavailable; the dashboard does not substitute intrinsic/model value as realized P&L.

When a fresh sourced mark exists, forward P&L can be computed:

DirectionForward P&L formula
Buymark_premium_usd - entry_premium_usd
Sellentry_premium_usd - mark_premium_usd

When no fresh sourced mark exists, forward P&L remains null. When the target horizon is still in the future, the outcome is pending.

That is not the same as zero P&L:

  • 0 P&L means the trade broke even.
  • unavailable means the mark needed to compute P&L is missing.
  • pending means the horizon has not matured.

Hit rates and average P&L must exclude unavailable and pending rows.

Why The Gap Exists

The likely causes are source and mapping constraints rather than dashboard calculation logic:

  • Amberdata TradFi coverage does not return rows for every historical MSTR/COIN option contract. Direct probes for representative missing standard contracts returned HTTP 200 with empty data.
  • Amberdata TradFi level-1 quote requests reject single windows wider than one hour, so broader nearest-session recovery uses bounded chunked polling or another endpoint/source.
  • Adjusted Alpha roots such as 2MSTR and 2COIN are not the same contract identifier as standard MSTR or COIN. The current fallback is explicitly labelled and temporary.
  • Alpha trade contract fields may not map exactly to every market-data provider's option identifier format.
  • Some target timestamps fall outside regular market hours, on weekends, on holidays, or after expiry.
  • Some horizons are legitimately pending because the target timestamp has not happened yet.
  • Expiry or realized P&L needs settlement, accounting, or another authoritative source; the dashboard does not substitute intrinsic value as realized P&L.

How To Fix It

There are three defensible paths.

  1. Fix source coverage. Confirm Amberdata entitlement and coverage for historical MSTR and COIN option level-1 quotes. If coverage exists, fix symbol or contract mapping and rerun backfills. If wider search is needed, enable chunked quote recovery within Amberdata's one-hour request limit. For expired-before-horizon rows, use the expiry-aware terminal quote path.

  2. Use another authoritative source. Source execution quotes, forward marks, terminal marks, and realized outcomes from Alpha, broker/OMS, OPRA, OptionMetrics, OCC/settlement, accounting, or PMS data.

  3. Add an explicitly estimated path. If the business accepts model marks, stale quotes, or nearest-session marks, label them estimated or stale. Do not populate bid/ask/mid from estimates, and do not call model-derived values realized P&L.

Where Operators Should Look

Trade Book is the source-row and sync control surface. It is where operators confirm that Alpha rows are loaded and reconciled.

Performance is the measurement surface. It is where operators check:

  • opportunity alignment
  • source-group quality
  • execution benchmark availability
  • forward outcome availability
  • pending/unavailable states
  • whether P&L is sourced enough to read

Backfill routes are admin-only production operations. They are not currently ordinary Trade Book buttons.

Status Check Command

Use this command before and after backfills:

curl -sS \
  'https://vol-backend-244916812493.us-east4.run.app/api/internal/trades/analytics/status?source=alpha_sync'

Key fields:

FieldMeaning
missing_benchmarkNo persisted execution benchmark row exists yet.
unavailable_benchmarkA benchmark row exists, but no defensible fresh quote was available.
quoted_benchmarkA fresh sourced bid/ask/mid benchmark was found.
available_outcomesRows with sourced forward marks and computable P&L.
pending_outcomesRows whose selected horizon has not matured.
unavailable_outcomesRows without sourced forward marks.

Backfill Commands

Set the admin secret without printing it:

ADMIN_SECRET="$(gcloud secrets versions access latest --secret=vol-admin-secret)"

Optional nearest-session recovery controls:

FieldMeaning
quote_recovery_enabledEnables broader nearest-session quote search beyond the initial tight window. Defaults to false.
quote_recovery_window_minutesMaximum minutes before/after the target timestamp to search. Example: 180 searches up to three hours either side.
quote_recovery_chunk_minutesMaximum duration of each Amberdata request. Must be 60 or less to respect the level-1 request limit.
quote_recovery_max_requestsMaximum chunked API calls per trade or per outcome mark. Use this to bound backfill cost.

Quotes recovered outside the initial tight window are source-labelled as amberdata_tradfi_level1_chunked_recovery. Adjusted 2MSTR / 2COIN rows still require allow_adjusted_standard_fallback=true and remain source-labelled separately.

Execution benchmark dry run:

curl -sS -X POST \
  'https://vol-backend-244916812493.us-east4.run.app/api/internal/trades/execution-benchmarks/backfill' \
  -H "x-admin-secret: ${ADMIN_SECRET}" \
  -H 'Content-Type: application/json' \
  -d '{"source":"alpha_sync","limit":100,"dry_run":true,"window_minutes":30,"max_staleness_minutes":15,"allow_adjusted_standard_fallback":true,"quote_recovery_enabled":true,"quote_recovery_window_minutes":180,"quote_recovery_chunk_minutes":60,"quote_recovery_max_requests":8}'

Execution benchmark write:

curl -sS -X POST \
  'https://vol-backend-244916812493.us-east4.run.app/api/internal/trades/execution-benchmarks/backfill' \
  -H "x-admin-secret: ${ADMIN_SECRET}" \
  -H 'Content-Type: application/json' \
  -d '{"source":"alpha_sync","limit":100,"dry_run":false,"window_minutes":30,"max_staleness_minutes":15,"allow_adjusted_standard_fallback":true,"quote_recovery_enabled":true,"quote_recovery_window_minutes":180,"quote_recovery_chunk_minutes":60,"quote_recovery_max_requests":8}'

Forward outcome marks dry run:

curl -sS -X POST \
  'https://vol-backend-244916812493.us-east4.run.app/api/internal/trades/outcomes/backfill' \
  -H "x-admin-secret: ${ADMIN_SECRET}" \
  -H 'Content-Type: application/json' \
  -d '{"source":"alpha_sync","limit":100,"lookback_days":365,"horizons":[1,7,30],"dry_run":true,"quote_window_minutes":30,"max_mark_staleness_minutes":60,"allow_adjusted_standard_fallback":true,"quote_recovery_enabled":true,"quote_recovery_window_minutes":180,"quote_recovery_chunk_minutes":60,"quote_recovery_max_requests":8}'

Forward outcome marks write:

curl -sS -X POST \
  'https://vol-backend-244916812493.us-east4.run.app/api/internal/trades/outcomes/backfill' \
  -H "x-admin-secret: ${ADMIN_SECRET}" \
  -H 'Content-Type: application/json' \
  -d '{"source":"alpha_sync","limit":100,"lookback_days":365,"horizons":[1,7,30],"dry_run":false,"quote_window_minutes":30,"max_mark_staleness_minutes":60,"allow_adjusted_standard_fallback":true,"quote_recovery_enabled":true,"quote_recovery_window_minutes":180,"quote_recovery_chunk_minutes":60,"quote_recovery_max_requests":8}'

Run dry-runs first. Only persist when the output is understood. Persisted unavailable records are valid quality-state evidence; they should not be interpreted as failed trades.