GET
Temporal alpha decomposition for a trader
Addressed by trader: /api/traders/{address}/temporal, not /api/wallets/{address}/temporal.

What it answers

A headline Sharpe ratio cannot distinguish a trader with genuine entry timing from one who simply held through a favourable regime. This decomposition separates them by attributing realized P&L across time partitions and testing whether the concentration is real.

Two attribution modes

realization

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

exposure

Attributes P&L across the life of the position. Answers “when was the risk held”.
They disagree for any trade held across a partition boundary, and the disagreement is informative rather than a defect. Both are returned unless you pass ?mode=.

Three partitions

session, weekpart, and hour_of_day. Pass ?partition= to trim the tables to one. The window definitions, the classification, and the caveats are always included even when you filter, because a table without them is a number without its method.

Every label needs a p-value

The module refuses to classify rather than guessing. Every style label requires a permutation p-value as well as a magnitude.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 be made on a pattern that random reshuffling reproduces.

404 is not a finding

Do not render this as “no alpha concentration detected”.

Served from a snapshot

A live decomposition paginates fills and funding and runs 2,000 permutations per window — a nightly-cron cost, not a per-request one. The endpoint serves the published snapshot and ships age_s so you know how stale it is.
Three Hyperliquid API facts shaped this module, and they will bite anything else reading fills:
  • Funding is hourly, not on an 8-hour cadence. The 3-a-day assumption uses a denominator 8× too small.
  • Spot fills are labelled Buy/Sell, not Close Long/Close Short, and the reducing leg still carries a populated closedPnl. Filtering on dir.startswith('Close') silently drops them — on one live account that attributed 5,299ofa5,299 of a 515,191 book.
  • userFillsByTime and userFunding cap at 2,000 rows with no cursor. You get a correct measurement of the wrong period, with no error.
See Temporal alpha methodology.
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.

Path Parameters

address
string
required

A 40-hex-character 0x address.

Pattern: ^0x[a-fA-F0-9]{40}$

Query Parameters

mode
enum<string>

Return one attribution mode instead of both.

Available options:
realization,
exposure
partition
enum<string>

Trim the concentration tables to one partition.

Available options:
session,
weekpart,
hour_of_day

Response

The decomposition.

address
string
analysed
boolean
modes
object

realization and exposure attribution

partitions
object

session, weekpart, hour_of_day concentration tables

classification
object

Style label plus the permutation p-value that licensed it

caveats
string[]
age_s
number