Skip to content
SimicX

Signals · Endpoint

Get a rebalance week

Every symbol's score, rank and target weight for one rebalance week — the richest payload in the API.

GET/v1/alphas/{alpha}/rebalances/{date}

Parameters

Path parameters

NameTypeRequiredDefaultDescription
alphastringrequiredalpha_id (e.g. CausalHaarActivityDisplacement_0de63b8678a2_sp500pit_weekly_20260730t000858z_f358d1480d42). Use the value returned by GET /v1/alphas.
dateYYYY-MM-DDrequiredA rebalance date from the rebalances index endpoint. A date that was not a rebalance returns 404.

Query parameters

NameTypeRequiredDefaultDescription
symbolstringoptionalKeep one ticker, or a comma-separated list — symbol=A or symbol=A,AA.
direction1 | long | -1 | short | 0 | flat | neutraloptionalKeep 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_weightnumber ≥ 0optionalDrop symbols whose absolute target weight is below this. Acts on the weight column named by book.
booklong_short | long_onlyoptionallong_shortSelects 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.
sortscore | rank | weight | symboloptionalscoreSort key. weight sorts on the book column; rank is average_rank.
orderasc | descoptionaldesc for score/weight, asc for rank/symbolSort direction; a ticker tiebreak keeps paging over equal scores stable.
limitinteger 1–5000optional100Rows per page. Below 1 or above 5000 is a 400 bad_request naming the parameter and the constraint it broke.
offsetintegeroptional0Rows 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

GEThttps://api.simicx.com/v1/alphas/{alpha}/rebalances/2026-06-26?book=long_short&sort=score&limit=100&offset=0

Example 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.dateYYYY-MM-DD

    The 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_symbolsinteger

    Rows 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.bookstring

    The weight column book acted on.

    How it is computed

    Echoes the book parameter (default long_short).

  • data[].symbolstring

    Ticker 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 | −1

    Which 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[].scorenumber

    The 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_scorenumber

    The 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_znumber

    Cross-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_size

    The 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_sizeinteger

    How 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 returned

    average_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) | null

    Realised 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 | null

    When 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_tradeableboolean

    Whether 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 | null

    When 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 | null

    Why 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 | null

    Why 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 mirrored

    Selected 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.limitoffsetinteger

    The page window applied.

    How it is computed

    Echoes the request parameters (or their defaults — 100 rows, 500 on /equity-curve).

  • pagination.returnedinteger

    Rows in this page.

    How it is computed

    data.length — below limit on the last page.

  • pagination.totalinteger

    Rows matching the query across all pages.

    How it is computed

    Server-side count before paging.

  • pagination.has_moreboolean

    Whether another page exists.

    How it is computed

    offset + returned < total — false on the last page; stop paging there.

  • meta.runstring

    The alpha that served the response.

    How it is computed

    Echoes the resolved alpha_id. Retain for reproducible analysis.

  • meta.alpha_idstring

    Source 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

one rebalance week · score_z across 496 namesbottom decile → shorttop decile → long-3-2-10+1+2+3score_z

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.