microprediction

keyed-dynamic-universe

Maintain an online covariance over named series whose set changes over time (e.g. assets entering and leaving). Use when observations arrive as dicts keyed by name rather than fixed-length vectors. Wraps precise's keyed / FixedUniverse / DynamicUniverse adapters.

microprediction 337 59 Actualitzat fa 4 mesos
GitHub

Instal·la

npx skillscat add microprediction/precise/keyed-dynamic-universe

Instal·la des del registre de SkillsCat.

SKILL.md

Keyed covariance over a changing universe

In streaming/finance settings observations are dicts keyed by name, and the set of names changes. keyed
decorates any positional estimator to consume keyed dicts and emit keyed output.

pip install precise            # add [pandas] for to_frame()
from precise import keyed, EwaCovariance

est = keyed(EwaCovariance(r=0.05), dynamic=True)     # universe may change over time
est.partial_fit({"BTC": 0.01, "ETH": -0.02})         # river-style: also .update / .learn_one
est.partial_fit({"ETH": 0.00, "SOL": 0.03})          # BTC drops out, SOL enters

est.covariance_["ETH"]["SOL"]                         # dict-of-dicts over the live universe
est.to_frame()                                        # pandas DataFrame  (needs [pandas])

Fixed vs dynamic

  • keyed(est) / dynamic=False → FixedUniverse: one wrapped estimator; missing keys are imputed.
    Use when the set of names is stable and you just want dict ergonomics.
  • keyed(est, dynamic=True) → DynamicUniverse: tracks multiple live key-sets with staleness /
    longevity eviction and assembles a pairwise matrix. Use when names genuinely enter and leave.

Notes

  • The adapter adds no covariance math of its own — it wraps the positional estimator, so any estimator
    from the estimate-online-covariance skill works inside it (LedoitWolfCovariance, HuberCovariance,
    …).
  • The assembled matrix is projected to the nearest PSD; expect small adjustments when the live universe
    changes.
  • To score/compare keyed estimators, extract the dense covariance_ (e.g. via to_frame().values) and use
    the score-covariance-estimate skill.