Signals · Endpoint
Get a rebalance week
Every symbol's score, rank and target weight for one rebalance week — the richest payload in the API.
/v1/alphas/{alpha}/rebalances/{date}Parameters
Path parameters
| Name | Type | Required | Default | Description |
|---|---|---|---|---|
alpha | string | required | — | alpha_id (e.g. CausalHaarActivityDisplacement_0de63b8678a2_sp500pit_weekly_20260730t000858z_f358d1480d42). Use the value returned by GET /v1/alphas. |
date | YYYY-MM-DD | required | — | A rebalance date from the rebalances index endpoint. A date that was not a rebalance returns 404. |
Query parameters
| Name | Type | Required | Default | Description |
|---|---|---|---|---|
symbol | string | optional | — | Keep one ticker, or a comma-separated list — symbol=A or symbol=A,AA. |
direction | 1 | long | -1 | short | 0 | flat | neutral | optional | — | Keep one side only; case-insensitive, and neutral is a synonym for flat. Anything else is a 400 bad_request naming the accepted values. |
min_abs_weight | number ≥ 0 | optional | — | Drop symbols whose absolute target weight is below this. Acts on the weight column named by book. |
book | long_short | long_only | optional | long_short | Selects which of the two target-weight columns min_abs_weight and sort=weight act on. Both columns are returned either way — this is a column choice, not a slice. |
sort | score | rank | weight | symbol | optional | score | Sort key. weight sorts on the book column; rank is average_rank. |
order | asc | desc | optional | desc for score/weight, asc for rank/symbol | Sort direction; a ticker tiebreak keeps paging over equal scores stable. |
limit | integer 1–5000 | optional | 100 | Rows per page. Below 1 or above 5000 is a 400 bad_request naming the parameter and the constraint it broke. |
offset | integer | optional | 0 | Rows to skip; pagination.has_more is false at the end. |
Example request
curl
curl -H "Authorization: Bearer sxk_live_4f9c…" \ "https://api.simicx.com/v1/alphas/CausalHaarActivityDisplacement_0de63b8678a2_sp500pit_weekly_20260730t000858z_f358d1480d42/rebalances/2026-06-26?direction=long&sort=rank"
Try it
Execute GET /v1/alphas/{alpha}/rebalances/{date} against the live API using your key. Paste a key below to send without signing in, or sign in to auto-fill from your profile — either way, the call counts towards your rate limits. Whether the route answers depends on your key's endpoint allow-list — /v1/me lists what is in force; a new key starts with only the self-service routes until an administrator grants more.
Sent server-side via a same-origin proxy; only the documented host(s) are allowed.
Paste an API key above to list alphas your key may access.
Request
https://api.simicx.com/v1/alphas/{alpha}/rebalances/2026-06-26?book=long_short&sort=score&limit=100&offset=0Example response
JSON · synthetic values, real schema
{
"data": [
{
"symbol": "AES",
"direction": 1,
"confidence": 0.0624,
"score": 0.0624,
"raw_score": -1.0833,
"score_z": 0.0812,
"average_rank": 241.0,
"cohort_size": 492,
"long_short_target_weight": 0.0,
"long_only_target_weight": 0.0,
"next_open_tradeable": true,
"fill_at": null,
"entry_at": "2023-10-16T13:30:00",
"maturity_at": "2023-10-23T13:30:00",
"forward_return": 0.0121,
"unavailability_reason": null,
"decision_reason": null,
"raw_direction": -1,
"raw_confidence": 1.0833,
"raw_score_z": -1.2140,
"raw_average_rank": 468.0,
"raw_long_short_target_weight": 0.0,
"raw_long_only_target_weight": 0.0,
"raw_fill_at": null,
"raw_decision_reason": null
}
],
"pagination": { "limit": 100, "offset": 0, "returned": 1, "total": 248, "has_more": true },
"meta": {
"run": "CausalHaarActivityDisplacement_0de63b8678a2_sp500pit_weekly_20260730t000858z_f358d1480d42",
"alpha_id": "causal_haar_activity_displacement_reversal_b3874c9db78d",
"book": "long_short",
"date": "2026-06-26",
"week_status": "traded",
"n_symbols": 496
}
}Response fields
Every field the response can carry, what it means, and how it is computed.
meta.datemeta.week_statusmeta.n_symbolsmeta.bookdata[].symboldata[].directiondata[].confidencedata[].scoredata[].raw_scoredata[].score_zdata[].average_rankdata[].cohort_sizedata[].percentile_rankdata[].forward_returndata[].entry_atmaturity_atdata[].long_short_target_weightdata[].long_only_target_weightdata[].next_open_tradeabledata[].fill_atdata[].unavailability_reasondata[].decision_reasondata[].raw_* mirrorspagination.limitoffsetpagination.returnedpagination.totalpagination.has_moremeta.runmeta.alpha_idmeta.dateYYYY-MM-DDThe requested rebalance week.
How it is computed
Echoes the path parameter.
meta.week_statustraded | pending | <skip reason>What the engine recorded for this decision. pending is not a skip.
How it is computed
As on the index endpoint.
meta.n_symbolsintegerRows in the week's full cross-section, before filters.
How it is computed
The week's own count; pagination.total tracks the filtered row count.
meta.bookstringThe weight column book acted on.
How it is computed
Echoes the book parameter (default long_short).
data[].symbolstringTicker of the name in the run's universe.
How it is computed
As traded on its primary exchange; one row per scored name per week. The week the decision belongs to travels in meta.date; the book acts on it at the next session open — see fill_at.
data[].direction+1 | 0 | −1Which side of the book the signal favours.
How it is computed
sign(score): +1 long inclination, −1 short inclination, 0 flat / no view (exact zero score).
data[].confidencenumber (≥ 0)Unsigned signal strength for the name, independent of side — not a probability or unit-interval confidence.
How it is computed
|score| after conditioning/smoothing. Units match the alpha's score (often a raw return-scale statistic); not normalised to [0, 1]. By construction score = direction × confidence. Sealed upstream; the API does not recompute it.
data[].scorenumberThe conditioned signal value used for trading.
How it is computed
Numeric conditioned signal used for ranking and books — identical on /rebalances/{date} and /scores. Materialised as `direction × confidence` (fallback: sealed `score` on older packing). Never falls back to `pre_smoothing_score` / `raw_score`. Units follow the alpha — not a fixed [0, 1] range.
data[].raw_scorenumberThe unconditioned signal before score-tape smoothing.
How it is computed
Sealed as `pre_smoothing_score`; published only as `raw_score` (the sealed name is dropped). Equals `raw_direction × raw_confidence`. Can differ from `score` in magnitude and sign. Present only when the key has raw-book access.
data[].score_znumberCross-sectionally standardised score within the week.
How it is computed
(score − mean_week) / stdev_week over the week's cohort. Comparable across weeks in a way the unstandardised score is not.
data[].average_rank1 – cohort_sizeThe name's position in the week's ordering. 1 is the strongest signal.
How it is computed
Rank of the score within the cohort; where the alpha ensembles component signals, the per-component ranks are averaged first — hence non-integer values.
data[].cohort_sizeintegerHow many names were ranked that week.
How it is computed
Count of symbols with a valid score. Can be below n_symbols when a name was unscorable (missing data, halted through the window).
data[].percentile_ranknot returnedaverage_rank rescaled to the unit interval. 1 is the top of the cohort.
How it is computed
No longer served. No seal in the corpus has ever carried it, so the column could only be null; publishing it implied a value might arrive. Derive it yourself as 1 − (average_rank − 1) / (cohort_size − 1), both of which are returned.
data[].forward_returnnumber (ratio) | nullRealised return of the name over the following rebalance period.
How it is computed
Open of the first bar strictly after this decision to the open of the first bar strictly after the next decision. Null on pending weeks, and on any week whose holding period has not yet been sealed. Powers the /metrics IC-decile ladder and weekly IC series when present — a week with a null return is dropped, never imputed.
data[].entry_atmaturity_atISO timestamp | nullWhen the resulting position is entered and when the forecast horizon matures.
How it is computed
entry_at is the next open at which the book acts; maturity_at is one rebalance period later. Sealed on current deliveries only. This endpoint returns the whole decision record and has no fields parameter, so they are here whenever the seal carries them; on /scores they are outside the core column set and need fields=all.
data[].long_short_target_weightnumber (signed)Target weight in the dollar-neutral long/short book, as a fraction of book equity.
How it is computed
Assigned to the top (long) and bottom (short) selection tails of the ranked cohort, scaled within each side; 0 when the name is outside the selection or gated untradeable. Positive long, negative short.
data[].long_only_target_weightnumber (≥ 0)Target weight in the long-only book, as a fraction of book equity.
How it is computed
The long-side selection renormalised to sum to 1 across held names; 0 when the name is not held.
data[].next_open_tradeablebooleanWhether the name could actually be traded at the next session open.
How it is computed
False when the name is halted, suspended, fails the liquidity screen, has no borrow, or has a price-data gap. False forces both target weights to 0 and sets unavailability_reason.
data[].fill_atISO timestamp | nullWhen the resulting order filled.
How it is computed
Execution timestamp of the fill that implemented this decision. Null when the week is pending (next open not yet on the tape), when the decision produced no trade in the name (routine hold), or the name was untradeable.
data[].unavailability_reasonstring | nullWhy a scored name could not be traded.
How it is computed
Machine-readable cause — halted, suspended, no_borrow, illiquid, data_gap — set whenever next_open_tradeable is false; null otherwise.
data[].decision_reasonstring | nullWhy the weight is what it is.
How it is computed
A machine-readable note from the decision layer — e.g. entered_selection, exited_below_threshold, carried_by_smoothing, gated_untradeable. Null for a routine hold.
data[].raw_* mirrorssame as the field mirroredSelected fields above, recomputed from the unconditioned signal.
How it is computed
Unconditioned counterparts of the public fields, present only when the key has raw-book access. Not every field is mirrored: the current corpus seals raw_direction, raw_confidence, raw_score_z, raw_average_rank, raw_long_short_target_weight, raw_long_only_target_weight, raw_fill_at and raw_decision_reason. raw_score is materialised from sealed pre_smoothing_score (equals raw_direction × raw_confidence).
pagination.limitoffsetintegerThe page window applied.
How it is computed
Echoes the request parameters (or their defaults — 100 rows, 500 on /equity-curve).
pagination.returnedintegerRows in this page.
How it is computed
data.length — below limit on the last page.
pagination.totalintegerRows matching the query across all pages.
How it is computed
Server-side count before paging.
pagination.has_morebooleanWhether another page exists.
How it is computed
offset + returned < total — false on the last page; stop paging there.
meta.runstringThe alpha that served the response.
How it is computed
Echoes the resolved alpha_id. Retain for reproducible analysis.
meta.alpha_idstringSource label associated with the alpha, when present.
How it is computed
Informational; address data endpoints with alpha_id / meta.run.
- ~500 rows per week × 291 weeks per run ≈ 145,000 decision rows per alpha — page with limit/offset.
- score is the conditioned signal (direction × confidence) the books trade; raw_score is the unsmoothed signal (sealed as pre_smoothing_score, published only under raw_score). They can differ in magnitude and even in sign — the example is one such name. confidence is |score| in the alpha's own units, not a 0–1 probability.
- raw_* fields (including raw_score) appear only when the key has raw-book access; they are stripped otherwise. Weights are 0 for a mid-cohort name; the tails of the distribution are where non-zero weights live (see the chart below).
- A date that is not a rebalance returns 404 — and the error's details name the first, last, previous and next dates that do exist, so clients never bisect the calendar.
- week_status pending means the live increment wrote the cross-section before the next session open was on the tape. The week is served (scores and usually weights are there); fills and forward_return are null, so /metrics IC and the decile ladder omit it until those returns are sealed. It is not a skip, and there is no date cutoff on this endpoint.
Illustration
Illustrative synthetic data — one page of GET /v1/alphas/{alpha}/rebalances/{date}. Most names sit near zero and stay out of the book; the ranked tails carry the long_short_target_weight.

