Skip to content

Price each week with the multiplier in force that week (Russell 2x, blocked on marketdata#24) #25

Description

@mspinola

Consumer half of mspinola/marketdata#24. Blocked on it: the regimes table has to exist before this package can read it.

What changes here

exposure.point_values() returns one multiplier per symbol and market_exposure applies it to every week:

out["notional_usd"] = out["net_contracts"] * pv * out["price"]

That becomes a per-DATE multiplier from marketdata.point_value_asof(symbol, out.index), falling back to the current contract_specs value for symbols with no regime rows, so the 46 unaffected markets are byte-identical.

Why it matters here specifically

RTY is understated 2x across 740 of its 1,247 priced weeks. Because aggregate_exposure ranks each week against an expanding window of its own history, an under-scaled first half compresses the reference distribution, so the error does not stay in the past: every post-2016 Russell reading ranks as more extreme than it is, and the Equities composite is understated about 11.9% before the cut.

Evidence and the reproducer are in docs/analysis/2026-08-22-effective-dated-contract-multipliers.md.

Done when

  • market_exposure prices each week with the multiplier in force that week
  • symbols with no regime rows produce identical output to today, pinned by a test
  • a test pins the 2016-12-06 boundary: the week before doubles, the week after does not
  • point_values() either gains an as-of form or is documented as the current-regime lookup it is, so a future caller does not reach for the wrong one
  • no change to aggregate_exposure's shape or to the numeraire path
  • the corrected Russell share of Equities notional written up fresh, NOT by amending the point-in-time analysis doc

Note for whoever picks this up

Do not treat the correction as a licence to promote the dollar-risk percentile to a signal-level metric. Fixing the input removes a data-correctness objection; whether the metric predicts anything is a pre-registered question for the ladder in npf, judged by a session other than the one that proposes it.

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't working

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions