Catalogue · Endpoint
Get an alpha
What the alpha does and why: the hypothesis, the construction, every parameter and the paper behind it.
/v1/alphas/{alpha}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. |
Example request
curl
curl -H "Authorization: Bearer sxk_live_4f9c…" \ "https://api.simicx.com/v1/alphas/CausalHaarActivityDisplacement_0de63b8678a2_sp500pit_weekly_20260730t000858z_f358d1480d42"
Try it
Execute GET /v1/alphas/{alpha} 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}Example response
JSON · synthetic values, real schema
{
"data": {
"algo_id": "CausalHaarActivityDisplacement_0de63b8678a2_sp500pit_weekly_20260730t000858z_f358d1480d42",
"alpha_id": "CausalHaarActivityDisplacement_0de63b8678a2_sp500pit_weekly_20260730t000858z_f358d1480d42",
"name": "Causal Haar Activity-Displacement Reversal",
"tldr": "At weekly decisions, the alpha assesses active point-in-time S&P 500 members for temporary reversals following urgency-driven price displacement accompanied by unusual trading activity.",
"copyright": "Copyright (c) 2025-2026 SimicX Limited.",
"classification": {
"structure": "cross_sectional",
"method": "rule_based",
"frequency": ["weekly"],
"tags": ["Cross-Section", "Reversal", "Volume Based"]
},
"thesis": {
"hypothesis": "A large return with abnormal activity across causal scales is hypothesised to reflect urgency-driven displacement that partially reverses over five trading days.",
"mechanism": "Urgency-driven displacement partially reverses as patient liquidity returns.",
"who_loses": "Liquidity providers who absorb an urgent order and must reprice inventory before patient counterparties return.",
"economic_rationale": "A directional move with unusual volume at several persistence lengths may be costly urgency that leaves price temporarily too far from patient-counterparty value.",
"falsification_criteria": []
},
"signal": {
"score_direction": "Higher scores rank names expected to outperform over the holding horizon.",
"decision_timing": "Scored at the weekly rebalance close, traded at the next open.",
"core_math_framework": "z(j,t) = (d(j,t) - mean(D(j,t))) / max(sd_sample(D(j,t)), standard_deviation_floor), and S(t) = -sign(r(t)) * (1/J) * sum(j=1 to J) |z(j,t)|",
"signal_logic": "Fade the displacement in proportion to how unusual the activity was.",
"pseudocode": ["Read close and volume across the causal history ending at t", "..."],
"validity_rules": ["A decision is scored only when at least 400 names are eligible.", "..."],
"output_contract": "One score per eligible symbol per decision date."
},
"parameters": [
{
"name": "haar_max_scale",
"type": "integer",
"default": 3,
"search_values": null,
"range": [1.0, 3.0],
"tunable": true,
"unit": "trading days",
"description": "Largest causal Haar detail scale aggregating activity-shock evidence.",
"selected_value_by_test_year": { "2021": "3", "2022": "3", "2023": "3", "2024": "3", "2025": "3", "2026": "3" }
}
],
"data_requirements": {
"universe": "Point-in-time membership of the sp500_pit universe (equity traded on us_equity, xnys calendar), resolved at every decision from the registered point-in-time membership list. The strategy never names an instrument itself.",
"granularity": "daily",
"lookback_bars": 50,
"warmup_bars": 50,
"adjustment": "Split and dividend adjusted.",
"fields": [{ "name": "close", "category": "ohlcv", "required": true }],
"history_requirement": null
},
"source_papers": [
{
"title": "Fast and Accurate Anomaly Detection in Time Series",
"published_date": "2026-07-02",
"role": "seed",
"rationale": "Supplies the causal multi-scale detector the displacement score is built on."
}
]
},
"meta": { "request_id": "req_7f3a2c", "generated_at": "2026-07-30T14:03:12Z", "source": "alpha_research", "alpha_id": "CausalHaarActivityDisplacement_0de63b8678a2_sp500pit_weekly_20260730t000858z_f358d1480d42" }
}Response fields
Every field the response can carry, what it means, and how it is computed.
algo_idalpha_idnametldrcopyrightclassificationthesissignalparametersdata_requirementssource_papersmeta.alpha_idalgo_idstringThe alpha's identifier.
How it is computed
The collection name: the same value listed by GET /v1/alphas, and the same string as the source ZIP's filename and the id inside the sealed document.
alpha_idstringThe same identifier under its former name.
How it is computed
Identical to algo_id. Retained so callers written against the older name keep working; prefer algo_id in new code.
namestringThe alpha's display name.
How it is computed
The readable title from the run's research record. The client document holds the snake_case research id in the same field, so the readable one is preferred.
tldrstring | nullThe one-line thesis.
How it is computed
The client-facing wording, re-authored for delivery.
copyrightstring | nullCopyright line for the write-up, when sealed.
How it is computed
Passed through from the client description document; null when the research-spec fallback has none.
classificationobjectStructure, method, cadence and category tags.
How it is computed
frequency is a list of lowercase cadences (intraday, daily, weekly), because an alpha may claim more than one. It is served as the run sealed it, not relabelled: a run that decides every bar reads daily. tags are category labels. data_tier is deliberately absent.
thesisobjectThe claim, how it is detected, who pays and why it lasts.
How it is computed
Five fields: hypothesis, mechanism, who_loses, economic_rationale and falsification_criteria[]. mechanism is the plain-language account of how the strategy works; earlier seals filed it under signal and it is served here either way. falsification_criteria is a list of pre-committed kill conditions (metric, threshold, horizon) and is EMPTY on every currently delivered alpha: the field postdates their sealing, so those runs committed to none, and criteria written after a backtest are not pre-commitments. Alphas whose criteria were set before the run carry them here.
signalobjectHow the score is formed and when it is taken.
How it is computed
Seven fields: score_direction, decision_timing, core_math_framework, signal_logic, pseudocode[], validity_rules[] and output_contract. Every key is always present; a value the run did not seal is null.
parametersobject[]Every parameter, with the value the walk-forward chose per test year.
How it is computed
selected_value_by_test_year maps each out-of-sample year to the selected value. A parameter re-picked identically every year is a settled choice; one that moves every year is a fitted one.
data_requirementsobjectWhat the signal reads.
How it is computed
Universe, bar granularity, price adjustment and the field list, plus the history depth as lookback_bars and warmup_bars counted in the granularity unit. A run sealed before those counts existed states the same thing as history_requirement prose instead; exactly one of the two forms is populated.
source_papersobject[]The published work the idea came from, and what each contributes.
How it is computed
title, published_date, role and rationale. role is one of seed, mechanism, validation or contradiction. seed is the paper the method came from, and exactly one citation carries it. Empty when the run sealed none.
meta.alpha_idstringThe address as resolved for the call.
How it is computed
Echoes the alpha served.
- Authorisation comes before lookup: a key that may not read the alpha gets 403 alpha_not_allowed whether or not it exists, so a restricted key cannot map the catalogue by watching 403s turn into 404s. Every /v1/alphas/{alpha}/… endpoint guards the same way, but raises 403 run_not_allowed, because the run allow-list is checked first there.
- 404 alpha_description_not_found means the run sealed neither document. Today that is only the incomplete seals. The alpha itself is still listed and its data endpoints still answer.
- Every key in the payload is always present. A run that sealed a thinner document reads as null rather than as a missing key, so a client can address any field without guarding for its existence.