TRKR

AI agents / the tools

What your assistant can actually do

Connect TRKR and your assistant gains 7 tools over the run — 20 assets across 400 alternative futures. You never call these yourself; you ask in plain language and it picks. This page is here so you know what it is reaching for, and so you can tell when it has read something the wrong way.

Every response below was captured from run 7a0172dcff524712 on 2026-09-14, anchored 2026-08-27, through the real endpoint. They are shown as they came back, with long series cut at a visible Long decimals shortened for reading; nothing else altered. The numbers belong to that run, not to the one live now — the universe and the futures change when the engine republishes, which is why the first tool exists.

get_dataset_overview

What is in this run

The universe, the number of futures, the anchor date and the horizon. Ask for it first: the run is republished, and the assets and futures change with it, so anything assumed instead of read goes stale silently.

What data do you have access to?

</takes no arguments>

what it sends

{}

what comes back

{
  "futures": 400,
  "investableAssets": 20,
  "assets": [
    { "ticker": "SPY", "label": "SPDR S&P 500 ETF Trust" },
    { "ticker": "QQQ", "label": "Invesco QQQ Trust (Nasdaq-100)" },
    … 18 more, ending with the derived series …
    { "ticker": "CASH", "label": "Cash (compounded Fed Funds)" },
    { "ticker": "MSR_SIM", "label": "Max-Sharpe portfolio (simulated moments)" }
  ],
  "macroVariables": [
    { "name": "fedfunds", "label": "Effective Federal Funds Rate (DFF)" },
    … 6 more: dgs2, dgs10, credit, vix, ratevol, usd …
  ],
  "anchorDate": "2026-08-27",
  "tradingDaysSimulated": 2520,
  "yearsAhead": 10,
  "note": "The asset list includes derived series appended by the engine: CASH is a
     compounded fed-funds proxy, MSR_SIM and MSR_HIST are the optimizer's max-Sharpe
     portfolios. 20 of the 23 are investable assets."
}

Reading it

The asset list includes derived series the engine appends. CASH is a compounded fed-funds proxy and the two MSR entries are optimizer output, so a portfolio built from “everything in the list” is not what you meant.

get_asset_quantiles

One asset, every future

The distribution of one asset across every simulated future as p5/p25/p50/p75/p95 bands over time, with its real price history beside it. This is the ensemble view — the right tool whenever the question is what could happen rather than what did.

Show me the range of outcomes for SPY, against what actually happened.

tickerstring
A ticker from the overview. An unknown one comes back as an error naming every ticker the run holds.
pointsintegeroptional
How many points to downsample each series to. Higher costs the assistant more context.

what it sends

{ "ticker": "SPY", "points": 40 }

what comes back

{
  "ticker": "SPY",
  "simulated": [
    { "date": "2026-08-27", "p5": 771.1,  "p25": 771.1,   "p50": 771.1,   "p75": 771.1,   "p95": 771.1 },
    { "date": "2026-11-26", "p5": 683.51, "p25": 757.69,  "p50": 787.19,  "p75": 809.71,  "p95": 847.16 },
    … 37 more …
    { "date": "2036-04-24", "p5": 582.72, "p25": 1316.18, "p50": 1999.19, "p75": 2984.92, "p95": 4903.98 }
  ],
  "real": [
    { "date": "2006-01-31", "close": 87.55 },
    … 38 more …
    { "date": "2026-08-27", "close": 771.1 }
  ]
}

Reading it

Bands are across futures at each date, not one path over time — the p95 line is not a trajectory any single future takes.

get_path

One future, in detail

One future with the mechanism attached: prices for the assets you name, the macro environment, and the market regime per day. This is how an assistant explains why a future did what it did rather than just that it did.

Why does future #42 fall apart in 2031?

epochinteger
Which future, 0-based. Out of range comes back naming the run's real count.
tickersstring[]optional
Assets to include. Defaults to SPY.
macrostring[]optional
Macro variables to include. Defaults to all of them.
pointsintegeroptional
How many points to downsample each series to. Higher costs the assistant more context.

what it sends

{ "epoch": 42, "tickers": ["SPY", "GLD"], "macro": ["vix"], "points": 30 }

what comes back

{
  "epoch": 42,
  "dates":  ["2026-08-27", "2026-12-28", "2027-04-28", …],
  "prices": {
    "SPY": [771.1, 803.12, 874.71, 813.92, 909.29, …],
    "GLD": [422.6, 497.86, 522.53, 590.27, …]
  },
  "macro":   { "vix": [14.51, 18.753, 14.636, 17.954, …] },
  "regimes": [0, 0, 1, 1, 2, 2, 2, 2, …]
}

Reading it

Every series is index-aligned with `dates`: prices.SPY[i], macro.vix[i] and regimes[i] all describe the same day. This is ONE of the run's futures, not a forecast. Anything you conclude from it is a statement about this path only — check get_asset_quantiles before generalising.

get_quality

Is this data credible?

Evidence instead of assurance: faithfulness metrics, and per asset whether the real risk measurement lands inside the synthetic 5th–95th percentile band. Across the run it returns the tally and names the misses — a passing row carries no information the count does not.

How well does this synthetic data match real markets?

tickerstringoptional
Every risk row for one asset, instead of the misses across all of them.

what it sends

{}

what comes back

{
  "summary": "288 of 297 real risk measurements fall inside the synthetic p5–p95 band.",
  "byMetric": [
    { "metric": "ann return", "inside": 23, "scored": 23, "missedBy": [] },
    { "metric": "ann vol",    "inside": 22, "scored": 23, "missedBy": ["CASH"] },
    { "metric": "sharpe",     "inside": 22, "scored": 22, "missedBy": [] },
    … the rest of the metrics …
  ],
  "risk": [
    { "ticker": "CASH", "metric": "ann vol",   "real": 0.00122,  "band": [0.00034, 0.00076], "insideBand": false },
    { "ticker": "AGG",  "metric": "worst day", "real": -0.07085, "band": [-0.05899, -0.01153], "insideBand": false },
    … only the misses are listed …
  ]
}

Reading it

'Inside the band' means the real value is a plausible draw from the simulated distribution. Some rows are inapplicable (a Sharpe for the CASH leg) and score null. `risk` lists only the measurements that fall OUTSIDE the band, because the misses are the informative rows — naming them is more convincing than a clean sweep.

simulate_portfolio

Stress-test an allocation

Fixed weights through every future at once, returning the distribution of outcomes: a quantile fan over time, a histogram of final values, and p5/p50/p95 for final value, CAGR, volatility, drawdown and Sharpe. This is the tool for critiquing or designing an allocation.

Stress-test 60/30/10 SPY/AGG/GLD, rebalanced monthly.

weightsobject
Ticker to weight, e.g. { "SPY": 0.6 }. Normalised for you.
rebalancestringoptional
none · daily · weekly · monthly · quarterly. Default none (buy and hold).
initialnumberoptional
Starting value. Default 10000.

what it sends

{ "weights": { "SPY": 0.6, "AGG": 0.3, "GLD": 0.1 }, "rebalance": "monthly" }

what comes back

{
  "weights": { "SPY": 0.6, "AGG": 0.3, "GLD": 0.1 },
  "rebalance": "monthly",
  "initial": 10000,
  "epochs": 400,
  "stats": {
    "finalValue":  { "p5": 11168.92, "p50": 22409.59, "p95": 40085.95 },
    "cagr":        { "p5": 0.0111,   "p50": 0.0840,   "p95": 0.1489 },
    "vol":         { "p5": 0.0695,   "p50": 0.1029,   "p95": 0.1461 },
    "maxDrawdown": { "p5": 0.0912,   "p50": 0.1820,   "p95": 0.3758 },
    "sharpe":      { "p5": -0.1070,  "p50": 0.5930,   "p95": 1.3388 }
  },
  "histogram": [
    { "from": 4929,  "to": 9014,  "count": 8 },
    { "from": 9014,  "to": 13099, "count": 34 },
    … 10 more buckets …
  ],
  "fan": [ { "date": "…", "p5": …, "p25": …, "p50": …, "p75": …, "p95": … }, … 24 points … ]
}

Reading it

The spread IS the result. Quoting p50 alone describes a future that is no more likely than the ones either side of it; p5 is the case a client has to be able to live through.

get_engine_portfolios

What the optimizer chose

The optimizer's max-Sharpe allocations — MSR_SIM fitted on the simulated ensemble, MSR_HIST on real history — with their weights and metrics. A starting point or a benchmark when co-building an allocation.

What does the max-Sharpe portfolio look like?

</takes no arguments>

what it sends

{}

what comes back

{
  "riskFree": { "sim": 0.0240, "hist": 0.0175 },
  "portfolios": {
    "MSR_SIM": {
      "weights": { "QQQ": 0.2306, "XLV": 0.0959, "IEF": 0.412, "GLD": 0.2616 },
      "metrics": {
        "sim":  { "ret": 0.0822, "vol": 0.0754, "sharpe": 0.7715 },
        "hist": { "ret": 0.0819, "vol": 0.0845, "sharpe": 0.7619 }
      }
    },
    "MSR_HIST": {
      "weights": { "QQQ": 0.249, "XLV": 0.1011, "IEF": 0.4606, "GLD": 0.1893 },
      "metrics": { … }
    }
  }
}

Reading it

These are optimizer output, not advice: max-Sharpe weights are notoriously sensitive to the estimated moments, and MSR_HIST in particular is fitted on one realized history.

compare_portfolios

Which of these two is better

Two allocations through the same futures, with the outcome bands differenced for you. Use it instead of two separate simulations when the question is which is better: the deltas come back directly and it costs the assistant less context.

Is 60/30/10 with gold actually better than plain 60/40?

aobject
{ weights, rebalance?, initial? } — the same shape simulate_portfolio takes.
bobject
The second portfolio, same shape.

what it sends

{
  "a": { "weights": { "SPY": 0.6, "AGG": 0.4 } },
  "b": { "weights": { "SPY": 0.6, "AGG": 0.3, "GLD": 0.1 }, "rebalance": "monthly" }
}

what comes back

{
  "a": { "stats": { "finalValue": { "p5": 10250.14, "p50": 21146.63, "p95": 43646.10 }, … } },
  "b": { "stats": { "finalValue": { "p5": 11168.92, "p50": 22409.59, "p95": 40085.95 }, … } },
  "bMinusA": {
    "finalValue":  { "p5": 918.7756, "p50": 1262.9546, "p95": -3560.1488 },
    "cagr":        { "p5": 0.0086,  "p50": 0.0063,  "p95": -0.0098 },
    "vol":         { "p5": -0.0037, "p50": -0.005,  "p95": -0.0112 },
    "maxDrawdown": { "p5": -0.0131, "p50": -0.027,  "p95": -0.0434 }
  },
  "epochs": 400
}

Reading it

Both ran through the SAME futures, so these differences are paired — a better p50 with a worse p5 is a real trade, not noise. Here the gold sleeve bought a higher floor and a lower ceiling: +919 at p5, −3,560 at p95.

Counts as two calls against the rate limit — it runs the whole ensemble twice.

Things worth knowing

Mistakes come back as answers, not errors
Ask for a ticker this run does not hold and the reply names every ticker it does. That is deliberate: the model built the arguments, so the correction has to reach the model rather than surfacing to you as a failed call.
Nothing returns the raw grid
Series come back downsampled and distributions as bands. Partly cost — your assistant pays per byte — and partly a guarantee: because no tool hands over per-path outcomes, it is structurally impossible to pick futures by how they turned out and then report a benchmark comparison on that slice.
Simulations queue
Your assistant's simulations share one queue with the playground on this site, so a busy moment means waiting rather than a slower site for everyone. Comparing two portfolios runs the ensemble twice and counts double.
None of it is a prediction
These are simulated markets for analysis and stress testing. A future is something that could plausibly happen, not something forecast to happen, and an assistant that says otherwise is over-reading its tools.

Connect it to your assistant.

Claude, ChatGPT, Gemini Spark or Antigravity — two of them never see a key at all. Your key, and the buttons that copy each command with it already filled in, live at /app/agents once you have an account.