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:
| Area | Current production state | Remaining issue |
|---|---|---|
| Opportunity context | 749/751 scored; 2 insufficient | Context is populated for nearly the full loaded Alpha sample. Missing context is not the main blocker. |
| Execution benchmarks | 331/751 quoted, 420/751 unavailable | Quoted 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 liquidity | 331 partial, 250 unavailable, 170 not sourced; 0 contract-volume rows and 0 open-interest rows | Fresh 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 outcomes | 177/751 available, 1 pending, 573 unavailable in the 7d outcome state table | Fallback 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 outcomes | Partially available | Fallback added a small number of adjusted-contract 1d marks; most adjusted and standard missing marks remain unavailable. |
| 30d forward outcomes | Mostly pending or unavailable | Many 30d horizons have not matured yet; matured rows still need sourced marks. |
| BTC proxy liquidity | 749 partial, 2 unavailable | BTC OI/backdrop is context only. It still does not provide MSTR/COIN traded-contract execution liquidity. |
| Smile | 751/751 not sourced | Intentionally not sourced for Alpha MSTR/COIN rows unless a trade-level smile method is approved. |
| Realized P&L | Not sourced | Requires 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.
| Area | Field / metric | Current status | Needs sourced data? | Needs backfill? | Notes |
|---|---|---|---|---|---|
| Opportunity context | market_proxy / BTC-linked backdrop | Sourced for current Alpha sample | No | No current gap | Keep BTC as the regime/opportunity proxy only. Do not use it as execution-quality liquidity. |
| Opportunity context | spot_at_trade, dvol, iv_30d, rv_30d, vrp, gamma_regime, stationarity_status, term_structure_state | Sourced for current Alpha sample | No current source gap | No current gap | These were backfilled from stored BTC context history where defensible. |
| Opportunity context | dvol_percentile | Sourced for current Alpha sample | No current source gap | No current gap | Derived from stored DVol history. |
| Opportunity context | smile_rich_cheap | Intentionally unsourced for current Alpha proxy rows | Yes, if trade-level smile is desired | No until a decision is made | Keep not_sourced unless the product explicitly approves a trade-level smile method. |
| Execution quality | benchmark_bid, benchmark_ask, benchmark_mid | 331/751 quoted | Yes | Yes, after sourcing | Current 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 quality | fill_vs_mid, fill_vs_mid_usd, fill_vs_mid_bps, spread_capture | Available only for quoted rows | No, if quotes already exist | Yes | Derived from benchmark quote rows once bid/ask/mid data are present. |
| Execution quality | benchmark_mark, benchmark_iv, fill_vs_surface_mark | Partial | Yes or model fallback | Yes | Can be quote-based or explicitly estimated, but source labels must stay explicit. |
| Outcome quality | 1d / 7d / 30d forward marks | Partial / incomplete | Yes | Yes, after sourcing | Needs 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 quality | forward_pnl, return_on_premium, realized_vol_capture | Not complete | No, if marks already exist | Yes | Derived from the forward marks and entry economics. |
| Lifecycle / realized P&L | Open/closed grouping, realized closed P&L | Not complete | Yes | Yes, after grouping | Needs lifecycle intent or defensible pairing before it becomes user-facing realized P&L. |
| UI / aggregation | available_count, unavailable_count, estimated_count, stale_count, proxy_mapped_count | Needed everywhere | No | Yes | Every 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.
| Issue | Current evidence | Required next step |
|---|---|---|
Adjusted 2MSTR / 2COIN contract precision | Fallback 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 gaps | Representative 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 limit | Single 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 marks | Production 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 liquidity | BTC 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 richness | smile_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&L | Derived 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 flags | Alpha 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
- Keep BTC proxy context for opportunity analysis as-is.
- Backfill
trade_market_contextfrom stored snapshot history for all Alpha rows. - Source and backfill execution benchmark rows for MSTR/COIN quotes where coverage exists.
- Source and backfill forward outcome marks for 1d, 7d, and 30d horizons.
- Keep realized P&L and trade-level smile richness explicitly unavailable until the product decides to source them.
- 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
MSTRorCOIN - 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:
| Direction | Fill-vs-mid formula | Interpretation |
|---|---|---|
| Buy | fill_price - benchmark_mid | Positive means the fill was worse than mid; negative means better than mid. |
| Sell | benchmark_mid - fill_price | Positive 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:
0slippage means the fill exactly matched mid.unavailablemeans 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:
| State | Meaning |
|---|---|
available | Fresh traded-contract quote plus contract 24h volume and open interest are sourced. |
partial | Fresh traded-contract bid/ask is sourced, but volume or open interest is missing. |
stale | A quote was found but is outside the configured freshness tolerance. |
unavailable | No usable quote was found. |
not_entitled | Provider rejected the lookup due to entitlement/permission. |
not_sourced | The 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 daytrade_time + 7 daystrade_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:
| Direction | Forward P&L formula |
|---|---|
| Buy | mark_premium_usd - entry_premium_usd |
| Sell | entry_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:
0P&L means the trade broke even.unavailablemeans the mark needed to compute P&L is missing.pendingmeans 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 200with emptydata. - 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
2MSTRand2COINare not the same contract identifier as standardMSTRorCOIN. 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.
-
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.
-
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.
-
Add an explicitly estimated path. If the business accepts model marks, stale quotes, or nearest-session marks, label them
estimatedorstale. 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:
| Field | Meaning |
|---|---|
missing_benchmark | No persisted execution benchmark row exists yet. |
unavailable_benchmark | A benchmark row exists, but no defensible fresh quote was available. |
quoted_benchmark | A fresh sourced bid/ask/mid benchmark was found. |
available_outcomes | Rows with sourced forward marks and computable P&L. |
pending_outcomes | Rows whose selected horizon has not matured. |
unavailable_outcomes | Rows 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:
| Field | Meaning |
|---|---|
quote_recovery_enabled | Enables broader nearest-session quote search beyond the initial tight window. Defaults to false. |
quote_recovery_window_minutes | Maximum minutes before/after the target timestamp to search. Example: 180 searches up to three hours either side. |
quote_recovery_chunk_minutes | Maximum duration of each Amberdata request. Must be 60 or less to respect the level-1 request limit. |
quote_recovery_max_requests | Maximum 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.