The question nobody answers

A headline Sharpe ratio cannot distinguish a trader with genuine entry timing from one who held through a favourable regime. Both produce the same number. Decomposing realized P&L across time partitions separates them.

Two attribution modes, always both

realization

Attributes P&L to when the position closed. “When did the money land.”

exposure

Attributes P&L across the position’s life. “When was the risk held.”
They disagree for any position held across a partition boundary, and the two modes legitimately have different totals. The disagreement is informative — a trader whose realization concentration is sharp but whose exposure concentration is flat is being credited for exits, not for holding.

Windows

  • Partitions (session, weekpart, hour_of_day) tile the span exactly once.
  • Overlay windows deliberately do not tile, so they may overlap.
Window definitions, classification, and caveats are always returned even when you filter, because a concentration table without its window definition is a number without its method.

Every label needs a permutation p-value

The module refuses to classify rather than guessing. A style label requires both a magnitude and a permutation p-value — 2,000 permutations per window.A 40-trade account concentrates by accident. “Your top trader is a funding arbitrageur” is a claim about a named stranger, and it should not rest on a pattern that random reshuffling reproduces.

Three Hyperliquid facts that corrupt naive implementations

These were verified against live data and will affect anything else reading fills, not just this module.
Verified against live userFunding: all 24 hours present, minute == 0 on 233 of 233 events.The 8-hour cadence is Binance’s. Anything assuming three settlements a day is using a denominator 8× too small.
The reducing leg on a spot fill still carries a populated closedPnl.A dir.startswith('Close') filter silently drops them. On one live account that attributed 5,299ofa5,299 of a 515,191 book.The correct rule: a non-zero closedPnl is realized P&L, whatever the leg is called.
Oldest-first from startTime, with no cursor and no error.Four active accounts all returned exactly 2,000; one covered 96 minutes of a 180-day request. You do not get an error or an empty result — you get a correct measurement of the wrong period.The module paginates: advance to last_ts + 1, dedupe on tid/time/hash/coin, with a 40-page cap.
A fourth trap, from the same family: Hyperliquid sometimes reports an outer window’s pnl as exactly 0.0 while an inner window is non-zero. Nested-window subtraction turns that into a phantom loss equal to minus the inner window. Treat an outer 0.0 as unreported, not flat.

Cost and freshness

A live decomposition paginates fills and funding and runs 2,000 permutations per window — a nightly-cron cost, not a per-request one. Endpoints serve the published snapshot and ship age_s. Pass live=true on the MCP tool to force a re-run.

Access

Full specification: docs/methodology/temporal-alpha-decomposition-v1.md.
Scienter publishes impersonal market signals of general and regular circulation. Nothing here is investment, legal, or tax advice, or a recommendation to buy, sell, or hold any asset. Scienter is not a registered investment adviser or broker-dealer. Trading digital assets can result in the total loss of your funds — see Disclaimers for the full text.