Skip to content
SimicX

Portfolio · Endpoint

Equity curve

Derived equity, cumulative return and drawdown series for a book.

GET/v1/alphas/{alpha}/equity-curve

Parameters

Path parameters

NameTypeRequiredDefaultDescription
alphastringrequiredalpha_id (e.g. CausalHaarActivityDisplacement_0de63b8678a2_sp500pit_weekly_20260730t000858z_f358d1480d42). Use the value returned by GET /v1/alphas.

Query parameters

NameTypeRequiredDefaultDescription
bookstringoptionallong_shortOne of the books listed by /books — long_short and long_only, plus their raw_ twins for keys with raw-book access. A book the key may not see is rejected exactly like one that does not exist.
fromYYYY-MM-DDoptionalwindow startFirst trading day, inclusive.
toYYYY-MM-DDoptionalwindow endLast trading day, inclusive.
limitinteger 1–5000optional500Rows 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/equity-curve?book=long_short&from=2026-06-19&to=2026-06-26"

Try it

Execute GET /v1/alphas/{alpha}/equity-curve 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}/equity-curve?book=long_short&limit=500&offset=0

Example response

JSON · synthetic values, real schema

{
  "data": [
    { "date": "2026-06-19", "timestamp": "2026-06-19T20:00:00Z", "starting_equity": 1.2798, "ending_equity": 1.2798, "period_return": 0.0, "cumulative_return": 0.0, "peak_equity": 1.2798, "drawdown": 0.0, "drawdown_pct": 0.0, "gross_exposure": 1.94, "net_exposure": 0.03, "turnover": 0.31 },
    { "date": "2026-06-22", "timestamp": "2026-06-22T20:00:00Z", "starting_equity": 1.2798, "ending_equity": 1.2741, "period_return": -0.004454, "cumulative_return": -0.004454, "peak_equity": 1.2798, "drawdown": 0.0057, "drawdown_pct": 0.4454, "gross_exposure": 1.95, "net_exposure": 0.01, "turnover": 0.02 },
    { "date": "2026-06-23", "timestamp": "2026-06-23T20:00:00Z", "starting_equity": 1.2741, "ending_equity": 1.2802, "period_return": 0.004788, "cumulative_return": 0.000313, "peak_equity": 1.2802, "drawdown": 0.0, "drawdown_pct": 0.0, "gross_exposure": 1.96, "net_exposure": 0.02, "turnover": 0.01 },
    { "date": "2026-06-26", "timestamp": "2026-06-26T20:00:00Z", "starting_equity": 1.2802, "ending_equity": 1.2867, "period_return": 0.005077, "cumulative_return": 0.005392, "peak_equity": 1.2867, "drawdown": 0.0, "drawdown_pct": 0.0, "gross_exposure": 1.96, "net_exposure": 0.02, "turnover": 0.11 }
  ],
  "pagination": { "limit": 500, "offset": 0, "returned": 4, "total": 4, "has_more": false },
  "meta": {
    "run": "CausalHaarActivityDisplacement_0de63b8678a2_sp500pit_weekly_20260730t000858z_f358d1480d42",
    "alpha_id": "CausalHaarActivityDisplacement_0de63b8678a2_sp500pit_weekly_20260730t000858z_f358d1480d42",
    "source_alpha_id": "causal_haar_activity_displacement_reversal_b3874c9db78d",
    "book": "long_short",
    "summary": {
      "book": "long_short",
      "first_date": "2026-06-19",
      "last_date": "2026-06-26",
      "sessions": 4,
      "starting_equity": 1.2798,
      "ending_equity": 1.2867,
      "peak_equity": 1.2867,
      "total_return": 0.005392,
      "cumulative_return_pct": 0.5392,
      "max_drawdown": 0.0057,
      "max_drawdown_pct": 0.4454,
      "max_drawdown_date": "2026-06-22"
    }
  }
}

Response fields

Every field the response can carry, what it means, and how it is computed.

  • datetimestampYYYY-MM-DD / ISO timestamp

    The observation point.

    How it is computed

    Every trading session in the window; timestamp is the engine's UTC instant for the session.

  • starting_equityending_equityratio

    Ledger equity at the open and close of the session.

    How it is computed

    As in the portfolio ledger — growth multiples of initial equity, net of modelled costs.

  • period_returnratio | null

    The session's return.

    How it is computed

    (ending − starting) / starting; null — never an exception, never a silent 0 — when starting equity is missing or zero.

  • cumulative_returnratio | null

    Compounded return within the requested window.

    How it is computed

    Running product of (1 + period_return), so the window starts at 0 — a 2023 query answers 2023's return, not a slice of an off-screen baseline.

  • peak_equityratio

    Running peak within the window.

    How it is computed

    max of starting and ending equity seen so far — the opening equity counts, so a first-session loss registers as drawdown.

  • drawdowndrawdown_pctequity units (≥ 0) / percentage points

    Decline from the running peak.

    How it is computed

    peak_equity − ending_equity; _pct is that as a percentage of the peak. The window's worst values land in meta.summary.max_drawdown*.

  • gross_exposurenet_exposureturnoverratio

    The session's exposures and traded fraction.

    How it is computed

    Carried through from the same day's portfolio ledger row — see /portfolio.

  • meta.summaryobject

    Whole-window figures over the full series, not just the page.

    How it is computed

    { book, first_date, last_date, sessions, starting_equity, ending_equity, peak_equity, total_return, cumulative_return_pct, max_drawdown, max_drawdown_pct, max_drawdown_date }. Computed over the full series before pagination so each page shares the same baseline.

  • 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.

Illustration

equity · long_short book (normalised to 1.00)1.10drawdown vs running peakmax -12.7%1.161.00

Illustrative synthetic data — the shape of GET /v1/alphas/{alpha}/equity-curve. Equity is normalised to 1.00 at inception; the lower panel is drawdown against the running peak, whose minimum is the max_drawdown metric.