AlphaEngine & Platform Reference.
Everything you need to run parameter sweeps locally in Python, govern research across a pod in the portal, or use the self-serve individual workspace.
Local Python simulator, parameter sweeps, trial counting, and Bakeoff.
Ideate, Strategize, Deliver, Trace, View, and shared PM/quant governance.
Watchlist crowding scanner, historical catalyst replay, and dossiers.
Part one · The terminal
Start here
AlphaEngine 1.1.2 is the published release. Anyone can pip install alphaengine free. The alphaengine library and its math run offline; login, workflows, reporting and sealing use the network; full return series are sent only with --share-series. Firms get ae_live_ keys through Connect in the portal; retail has no CLI and no ae_live_ keys. A separate model key is your own provider, read from the environment at call time.
pip install alphaengine==1.1.2
pip install "alphaengine[tui]==1.1.2"
alphaengine demo
alphaengine screen --data prices.csv
alphaengineA stop is a result and exits 0. When a workflow refuses because the series is too short, or the universe could not be measured, that is the system working, not a failure. A non-zero exit would make every CI pipeline treat an honest refusal as a broken build, which is precisely the pressure that gets honesty controls switched off.
Commands that remain
The product is the sentence, the stack, and the trace. alphaengine commands prints the verbs grouped, and alphaengine commands run expands one with its flags and examples. run <name> still opens a workflow directly. Login, a model key, load, thesis, status, and quit remain.
Get started
demo | Run the built-in example offline. No account, no data of your own. |
workflows | What the server offers, what each needs, and which reproduce. |
commands [verb] | The directory, or one command in full. |
key [which] | Enter a credential, or see which rungs are unlocked. Session only. |
Do the work
run <workflow> | Open one workflow directly. Scripted and reproducible. |
<a sentence> | The session. The model chooses tools, one per turn, up to eight, then done. |
status | The current run, and what is loaded. Session only. |
Bring your data
--data FILE | A local CSV: wide, long, or a single series. |
--universe NAME | A universe you registered here, with the closes you stored. |
--project MODULE | A Python module. The only door that can carry a simulator. |
Session
logout | Remove stored credentials from this machine. |
version | Print the version. |
help | The short list. Session only. |
quit | Leave the session. |
A command and a sentence are different products. run <workflow> runs that workflow. A sentence builds a stack. The model may include a workflow when the account offers one. The same inputs still produce the same figures. An answer that cites a number no tool returned is refused.
The session
The session is the simulator in AlphaEngine 1.1.2. You type a sentence. The model chooses the next tool. Each tool is deterministic. Up to eight calls, one per turn, then done.
What you watch is the trace: the stack of tool calls, the figures each one returned, and a short answer at the end. While the stack runs, the session draws a live parameter surface and lights each tool as it returns. The status line reads 1.1.2. After the trace, the session asks. yes writes that trace to a text file on the machine. no leaves the file unwritten. The report is the stack and the answer.
The tools are profile, align, regime, price, reprice, correlation, covariance, cointegration, portfolio, overlap, performance, var, process, workflow, bakeoff, and done. Align keeps dates and counts gaps, and leaves them open. Regime is a two-state Hamilton filter. Price is Black-Scholes for one contract you state. Reprice is a full second price under a spot move and a vol move. Portfolio is hierarchical risk parity, or risk parity when asked. Process fits an OU, GBM, jump, or GARCH process and stresses it. A portal workflow is the tool named workflow, and only when the logged-in account offers it.
Macro and prices come from what you loaded. Nothing is fetched inside a formula. An omitted cash rate is a pinned print: the H.15 3-month Treasury constant maturity, investment basis, 4.21% as of 2026-10-06 (DGS3MO). Passing 0 means excess of zero.
A stop is a result. A refusal exits cleanly. The terminal does not place orders and does not file share counts. Your data stays on your machine. A series longer than 512 values is refused at the boundary. Posted figures are summaries.
Bakeoff
A bakeoff is a closed room inside the session. You ask for one in a sentence: bakeoff, bake-off, or bake off. Generators propose strategies. An adversary tries to break them. A referee, which is deterministic code, ranks the configurations. The models do not.
A generator may submit one rule: equal, hrp, risk_parity, inverse_vol, momentum, or reversion. Momentum and reversion take a trailing lookback. The engine builds the return series from the loaded book. A model cannot hand in its own returns. An adversary may name one attack: last_half, first_half, drop_best, or high_vol. drop_best removes the proposal’s best days. high_vol keeps the days the book itself was violent. Neither side may name a winner. A reply that does is ignored. Neither side may start a second bakeoff.
The room is small on purpose. Two generators propose, then the adversary attacks. That happens twice. Six model calls, then it stops. The clock defaults to 45 seconds and cannot be stretched past 60. When time runs out, the call still in flight is dropped and the referee scores only what already came back. One sentence gets one bakeoff.
The standing of a proposal is its worst Sharpe across the full sample and every attack that was actually submitted. The highest standing survives. Every proposal counts, including the ones that broke. That count is the multiple-testing denominator, and its source is bakeoff. The survivor is then deflated for that search. A pretty in-sample spike that dies on the adversary’s attack does not win.
Constant-weight rules are fit on the first half of the book and then applied to the whole path, so the second half is a holdout. Momentum and reversion are walk-forward: each day uses only the trailing window. A bakeoff needs a model key, because the generators and the adversary are model calls. The referee is not a model call.
Bakeoff ships in 1.0.2. Two generators, then one attack, twice. Six model calls. The clock defaults to 45 seconds and stays inside 30 to 60. Lookbacks for momentum and reversion are 5 to 60. n_trials_source is bakeoff. The survivor is then passed to deflated Sharpe.
One-shot workflows
These eight names are the workflow tool in the session, the one-shot shell, and the steps the portal agents run. Data profiles coverage, gaps, and split spikes. Test writes the shortlist, the information coefficient, the deflated Sharpe, and the overlap. Risk writes the drawdown, the cost, and the gates. Strategy returns a weight.
A ninth would have to name a step none of these completes. The admission test is stricter than that: a workflow has to close on an artifact that is an INPUT to somebody’s next verb. A run whose output is only prose about itself does no work.
Coverage, gaps, and split spikes
alphaengine run diagnose_data --universe sp500Profiles the panel before anything is computed on it: how much history each name has, where the gaps are, which series end early, and how many spikes look like splits rather than moves. Reports; repairs nothing. A gap stays a gap, because filling one invents observations nobody supplied and makes every coverage figure downstream a lie.
Rank and a bounded shortlist
alphaengine run screen_universe --universe sp500 --input rank_by=rsiRanks your universe and returns a bounded shortlist. If most of the universe could not be measured it refuses rather than ranking the survivors, because the names that drop out are the young, the illiquid and the recently listed, so the bias has a direction and it flatters.
Information coefficient and quantile decay
alphaengine run evaluate_signal --project research.factorThe information coefficient through time, the spread between quantiles, and how fast the edge decays. The gate that matters here runs the other way: an implausibly HIGH IC stops the run, because nothing real ranks a wide cross-section that well and a leak does it effortlessly. A fabricated edge that ships is worse than any overfit one, and this is the cheapest place in the system to catch it.
Deflated Sharpe and the trial count
alphaengine run validate_study --project research.momentumSweeps your grid, then deflates the result for the number of configurations actually tried. Most results that look good do not survive this, which is the reason to run it. A result that holds at exactly one point in its parameter space is a fitted result; the workflow refuses it rather than dressing the problem up as a smaller number.
Drawdown and the cost where the edge thins
alphaengine run stress_study --data returns.csv --input turnover=0.2Subperiod stability, the drawdown anatomy, and the cost ladder: what execution costs the edge, and the basis-point level at which the strategy stops being one. Supply no turnover and the ladder is not drawn and says so, rather than reporting a cost of zero.
Correlation and beta through the drawdowns
alphaengine run check_overlap --data returns.csvCorrelation and beta of the candidate to what the book already holds, and the correlation through time rather than only on average. An idea that averages 0.2 to the book and runs at 0.9 in every drawdown is the book again exactly when being the book again costs money, and the average says the opposite.
A target weight from the risk budget
alphaengine run size_position --data returns.csv --input risk_budget=0.01A target weight, never a share count. If the track record is too short to tell the result from luck it refuses to size it at all. A small position is still a claim there is something there, and the caveat does not follow the number into a book.
Drawdown and volatility against the gates
alphaengine run monitor_sleeve --data returns.csv --input tolerances='{"max_drawdown_pct": 12}'Measures a live sleeve against the tolerances you gave it, and reports every limit’s margin rather than only the ones that broke. A monitor does not stop on a breach. Every other workflow stops when a gate refuses, but withholding a monitor’s artifact on a breach withholds it exactly when it matters. The status is four-way: ok, breached, undetermined, unchecked. That is because “nothing crossed” and “nobody was watching” must never read the same.
Install
The package requires numpy>=1.24 and scipy>=1.10 (our server pins numpy==2.2.6 and scipy==1.15.3 for exact golden parity). The alphaengine library and its math run offline; login, workflows, reporting and sealing use the network; full return series are sent only with --share-series. Anyone can pip install alphaengine free.
pip install alphaengine==1.1.2
# factor decomposition and cointegration need statsmodels
pip install 'alphaengine[factors]==1.1.2'pip install alphaengine==1.1.2 installs the 1.1.2 release. The library import requires only numpy and scipy. The full-screen session is alphaengine[tui]. A stack in the session uses your model key. The referee inside a bakeoff is deterministic code. Firms get ae_live_ keys through Connect; retail has no CLI. See access for where the desk line falls and why.
Your first sweep
The library does not backtest anything. It runs your backtest once per combination in a grid, then measures the result against the size of the search that produced it.
from alphaengine import sweep
r = sweep(
my_backtest, # YOUR function
{"fast": [5, 10, 20], "slow": [50, 100, 200]}, # the search
data=prices, # passed through untouched
)
r.n_trials
# 9That number is why the API is shaped this way. The correction that makes a Sharpe ratio honest needs to know how many variants you tested. Ask a person for it and you get the number that flatters them, not from dishonesty, but because nobody counts what they threw away. Running the grid makes the count len(grid), so the question never has to be asked.
n_trials is a property with no setter. There is no argument anywhere in this package that lets you tell it how many things you tried.
Reading the surface
Before any verdict, look at the neighbourhood. A result sitting on a broad plateau is robust. A single spike surrounded by failures is a result fitted to its own parameters.
r.surface()
# {
# 'shape': 'knife_edge',
# 'n_ok': 9,
# 'n_failed': 0,
# 'best_sharpe': 1.9143,
# 'median_sharpe': 0.221,
# 'share_within_20pct_of_best': 0.1111,
# 'plateau_centre': None,
# 'reading': 'One configuration performs and its neighbours do not. '
# 'Usually a fitted result.',
# }- shape
- plateau, ridge or knife_edge (API literal). Share of the grid within 20% of the best result: ≥30% plateau, ≥10% ridge, else knife_edge.
- share_within_20pct_of_best
- The number behind the shape, so you are free to disagree with the thresholds.
- plateau_centre
- Per parameter, where the robust region sits and how wide it is. The actionable half: it tells you where to re-centre, not merely that your number was flattered.
- reading
- The shape in one sentence. The same string every time, so it can be quoted.
Reading the verdict
The verdict deflates the best result for the search that actually produced it, and reports what it needed in order to say so.
v = r.verdict()
v["n_trials"] # 9
v["n_trials_source"] # 'derived_from_grid'
v["deflated_sharpe"] # 0.3106
v["verdict"] # 'inconclusive'
v["data_hash"] # a content hash of what it ran on
v["min_track_record_length"] # how long this record must run to beat luckn_trials_source travels with the figure on purpose. A count that was asserted and a count that was counted are different claims, and every deflated number downstream rests on which one it is. When this package produces the figure the source is always derived_from_grid, because there is no other way to produce it here.
Probability of backtest overfitting is reported alongside, and is deliberately not the gate:
v["selection"]
# {
# 'question': 'was the choice among configurations informative?',
# 'not_a_verdict_on_the_edge': True,
# 'pbo': 0.48, ...
# }PBO answers a different question, and returns roughly 0.5 for genuinely near-tied top configurations even when the underlying edge is real. Treating it and the deflated Sharpe as two readings of the same thing would be a mistake, so the shape of the return says they are not.
The study file
A study is a JSON artifact holding what was tried, what came back, and a content hash of the data it ran on. Readable in a text editor, diffable, and versioned so it still parses in two years.
r.save("study.json")
# PosixPath('study.json')
from alphaengine import load
s = load("study.json")
s.schema_version # load() refuses an unknown MAJOR version
s.data_hash # a label can be changed to escape a history; an array cannot
s.n_trials_source # 'derived_from_grid'The version rule here is stricter than semver: a bump is required whenever a computed value changes, even when the signature is untouched. Once the numbers are published they are a contract, and somebody’s saved study has to reproduce.
A study written on a laptop with no account opens unchanged in the portal. That is the entire join between the two halves of this page.
AlphaEngine CLI + quantOS
The alphaengine library and its math run offline; login, workflows, reporting and sealing use the network; full return series are sent only with --share-series. Anyone can pip install alphaengine free. Firms get org-scoped ae_live_ keys through Connect in the portal (/portal/data) and sync via ae remote add quantos, ae push, and ae pull; retail has no CLI and no ae_live_ keys. See the dedicated AlphaEngine CLI + quantOS guide for the full protocol reference.
pip install alphaengine==1.1.2
ae init
ae seal study.json
ae verify study.json
export QUANTOS_API_KEY="ae_live_..."
ae remote add quantos https://api.qosai.app
ae push
ae pull- Local-first vs. synced
- The alphaengine library and its math (`sweep()`, `ae seal`, `ae verify`, custom `.py` strategy modules) run offline; login, workflows, reporting and sealing use the network; full return series are sent only with `--share-series`. Synced (`POST /api/workspace/sync`, `GET /api/workspace/pull`): sealed studies, idea objects (`thesis`, `kill_rule`, `status`, `family`), run records, and `trial_ledger` entries update the shared Firm Hypothesis Board and Experiment Ledger.
- What `ae push` sends
- Sealed study metadata (`content_sha256`, `n_trials`, `n_trials_source`, 64-hex `data_hash` / `dataset_hashes`, `deflated_sharpe`, `psr_vs_zero`, `sr0_expected_max`, `min_track_record_length`, `selection` with CSCV `pbo`, `surface`, `performance`, `trial_ledger`), idea objects, run records, and 1D figure curves capped at 512 points (or full return series only when explicitly opted in with `--share-series`).
- What `ae push` never sends
- Raw datasets (`raw_dataset`, `raw_data`, `price_matrix`, `return_matrix`, `ohlcv`, CSV/Parquet files, 2D return matrices), proprietary `.py` strategy code, unhashed parameter values (`store_params` is off by default), and local LLM API keys.
- Plan limits (server-enforced)
- Anyone can `pip install alphaengine` free for local math. Retail tiers ($79 Starter, $149 Pro, $299 Power) are web-only and have no CLI or `ae_live_` keys. Firm tiers (`firm_core` $10K/mo, `firm_pro` $15K/mo, `firm_enterprise` $25K/mo) get org-scoped `ae_live_` keys through Connect and full team workspace sync & pull across all pod members.
Wiring your own backtest
Your function is called once per combination and must return a sequence of per-period returns. It is called as backtest_fn(data=data, **params) when data is given, and backtest_fn(**params) when it is not.
def my_backtest(*, data, fast, slow):
fast_ma = data.close.rolling(fast).mean()
slow_ma = data.close.rolling(slow).mean()
signal = (fast_ma > slow_ma).shift(1)
return (signal * data.close.pct_change()).dropna().to_numpy()
r = sweep(my_backtest, {"fast": [5, 10, 20], "slow": [50, 100, 200]}, data=px)- data
- Passed through untouched. Only hashed, never inspected, never stored.
- store_params
- OFF by default. Hashes are always kept, so runs stay comparable without the parameter values leaving your machine. The grid is often bigger intellectual property than the return series.
- on_error
- 'record' (the default) marks a failing combination and continues, because one bad corner of a grid should not lose the other ninety-nine results. 'raise' propagates.
The result holds the full trial matrix, which is what PBO needs and what a single-point run structurally cannot produce. That is the argument for running a grid rather than calling a calculator on one number.
What is in the core
Everything below is a pure function: no clock read, no environment read, no data-layer import. That is guaranteed by a test that scans the module tree without importing it.
from alphaengine.core import (
deflated_sharpe, # corrected for the size of the search
probabilistic_sharpe_ratio,
expected_max_sharpe, # what the best of N looks like under no edge
min_track_record_length, # how long before it beats luck
pbo_cscv, # probability of backtest overfitting
combinatorial_oos_stability, # single-stream combinatorial purged OOS stability (cpcv_score is a deprecated alias)
performance_report,
compute_var_cvar,
run_backtest,
score_backtest,
technical_features,
)- VaR and CVaR
- Always POSITIVE loss magnitudes, with CVaR at least VaR. Sign conventions are the most common source of a wrong risk number, so this one is fixed everywhere.
- Calmar
- Geometric. Annualised return compounds rather than averaging.
- Sortino
- The denominator is target semideviation over all N periods, not the standard deviation of the negative subset.
Factor decomposition and cointegration live behind the factors extra, so statsmodels is not a hard dependency of the core.
Whose data it is
The alphaengine library and its math run offline; login, workflows, reporting and sealing use the network; full return series are sent only with --share-series. The platform holds what it needs to do the job, because a monitor cannot run overnight against a browser tab and a study cannot be reproduced in two years against a series nobody kept. The question that matters is not whether we hold it, it is on what terms.
- Yours
- Encrypted at rest, scoped to your account, exportable in full, deletable in full.
- Never pooled
- One customer's data never sits in a store another can read, and no aggregate is derived across customers.
- Never learned from
- Nothing trains or tunes on it. Not a model, not a ranking, not a default.
- Never redistributed
- Vendor data stays under your licence and your entitlement, used on your behalf and never resold.
- Your model
- Never ingested. We do not take your alpha logic.
- Your parameter grid
- Hashed by default; values kept only if you ask for it.
The full line, item by item, is on the Trust page.
Part two · The portal
What the portal is for
The portal is the account. It proposes and records. The terminal is where those ideas are scrutinized. Ideate files a hypothesis from a prompt and the files dropped on it. That id is the one the terminal pins. Strategize runs the six research workflows on it, in order. You keep one on Saved. Deploying it does not place an order. Home reads what is working from the verdicts already stored. Trace lists terminal studies beside portal runs. Memory keeps a line when the work is filed. View cleans an uploaded package. Connect stores it and binds the terminal key to this account. Deliver files an IC report, a CIO memo, a risk pack, a change note, or a model and data note. Floor is a corner popup on Trace, View, Connect, and a run. It is not a column.
The point is a shorter loop and more names tested. The filing cites the runs. It does not retype the charts.
Nothing in the portal should ask you to retype something the system already knows. If a screen makes you re-enter a number that exists upstream, that screen is wrong and we would like to hear about it.
Research: single-name & BSM Options Greeks
Research (/portal/research) is the institutional single-name workstation on the rail beside Ideate and Strategize. It binds to any uploaded dataset on the account (or stored market history) and evaluates one ticker across five lenses: Overview & AI Copilot, Black-Scholes-Merton Options Greeks, Scenario Payoff Sensitivity, Catalyst & Macro Shock Replay, and Tail Risk & Tearsheet.
- 1st-Order Greeks
- Delta, Vega (per 1% IV), Theta (daily decay), and Rho (per 1% rate move) for ATM and 9-strike call/put chains.
- 2nd-Order Greeks
- Gamma (convexity per $1 spot move), Vanna (dDelta/dVol), Vomma / Volga (dVega/dVol), and Charm (daily Delta bleed).
- 3rd-Order Greeks
- Speed (dGamma/dSpot), Zomma (dGamma/dVol), and Color (dGamma/dTime), plus a 13-point Spot Shock Greek Profile from −15% to +15%.
- Promote to Strategize
- Any single-name view or pair spread discovered in Research can be promoted directly into Ideate or Strategize with one click.
Trace: what ran
Trace is the log. One column is a study the terminal sealed. The other is a run the portal made. A row is the headline, the trial count, and the rejects. Charts are not on the list. Accept records a decision on the run. It does not book a trade. Agents propose only.
- Terminal
- A study sealed from AlphaEngine onto the hypothesis. Open it for the path, the surface, and the count.
- Portal
- A lab run on a package stored on the account. Same row, same inspect.
- The run
- Opening a row loads the charts. The decision, when there is one, sits on that page.
- Memory
- Not on Trace. A line of its own when a hypothesis, experiment, strategy, or document is filed.
Floor, Book, Record, Signal, Handoffs, Decisions, Reports and Calendar are retired addresses. They redirect to Trace. The decision is on the run.
Trace: the finding
Runs on Trace are every terminal ingest and every portal run, newest first. A row is the finding: the headline, how many trials, whether the count was derived, and how many names were rejected. It is not a figure dump. Charts stay on the run page. Memory is a separate page.
A study written on a laptop with no account lands here when it is handed across. The portal marks it from the OS and projects the same blocks a portal validate_study already draws: the winner’s path, the drawdown, the parameter surface, the configurations tried.
- The list
- The run index is the finding, the trial count, and the rejects. No blocks, no chart series.
- Inspect
- Opening a study loads the path, the drawdown, the parameter surface, and the modeling trace.
- From the terminal
- A laptop study is the same figures under different keys. Opening it draws the path a portal study already knows how to draw.
Deliver: the filing
Deliver is one page. You pull a hypothesis, runs from Trace, lines from Memory, and a strategy. The format is an investment-committee report, a CIO memo, a risk pack, a change note, or a model and data note. The prose is the claim, the contract, and what those runs already said. A chart is not stored on the filing. Reopening it loads the chart from the cited run.
- Investment committee
- The claim, who loses, what would kill it, what each run said, and what memory kept.
- CIO memo
- The claim, what would kill it, and the signal the last test named.
- Risk pack
- The claim, the path, the gates, what would kill it, and what is open.
- Change note
- What changed, then the claim.
- Model and data
- The package, what ran, and the claim.
- Sources
- Numbered. Hypothesis, run, memory line, or strategy, each with its id.
- Charts
- The run's own path, grid, or information coefficient. If the run is gone, the citation stays and the chart is not invented.
Floor and the workflow table
Floor is the corner popup on Trace, View, Connect, and a run, and it stays closed until you open it. The workflow table lives inside Floor. Floor does not pick a step that table did not name. That table is the portal. It is not the terminal session.
If your prices are on the account, the Test and Risk agents run six of those steps on a package you stored: diagnose, screen, signal, validate, stress, and overlap. Each one writes a figure. Strategy returns a weight. It does not place an order. A follow-up maps to one step the table already named. The terminal session is the other product: a sentence there builds a stack of tools, on your machine.
- What runs in the portal
- The research lab runs six, fed from a universe you uploaded on Connect, your own valuation snapshots, or your own filed rankings. Size and monitor stay named questions. Nothing is fetched on your behalf, ever.
- What still runs on your machine
- Validating a strategy YOU wrote. A simulator is code, and running your code on our servers is a different security posture than this product has. `alphaengine run validate_study --project <module>` stays the honest path for it.
- The middle case
- A study in the portal validates a built-in strategy family you pick by name: a crossover, cross-sectional momentum, or mean reversion, with the same deflation and the same gates. The artifact records `strategy_source: builtin_declarative`, so a reader can tell it from a study of your own simulator.
A signal panel is refused rather than misaligned. If the universe was uploaded without its date column, scores dated to real days cannot be matched to positional closes, and the arithmetic would still return a confident number. It says so instead, and names the fix.
Inspect: charts and the trace
A run has its own page, and the id the terminal prints resolves to it. Trace owns this object. Stop leads. Then the figures. Then the modeling trace. Then the written reading. The decision sits beside the figures when this run answers an ask. Quant delivers. PM decides.
The modeling is drawn, not just summarised. A Sharpe ratio and a deflated Sharpe are conclusions; what a reader has to judge is the work behind them, so inspect renders the mathematics the workflow actually did:
- Parameter surface
- Every configuration the sweep tried, as a grid, with the winner ringed. A cell that did not run is a hole, never a zero. A failed trial still counts in the denominator, and it must not read as a bad result.
- The path and the drawdown
- The winning configuration's own equity curve and where it fell. A Sharpe is believed with its path; the drawdown is the risk that number hides.
- IC through time
- For a signal evaluation: the information coefficient period by period, not just its mean. A mean IC of 0.03 built from a steady 0.03 and one built from +0.4 and −0.34 are different signals.
- Correlation through time
- For an overlap check: how the relationship to the book MOVED, plus the joint distribution behind it. A tight diagonal is the same bet twice; a cloud is genuinely new risk.
- The cost descent
- For a stress run: Sharpe against execution cost, and the basis-point level where the edge dies.
- Every limit's margin
- For a monitor: each reading as a share of its own limit, so limits in different units compare. A limit nobody could measure is absent rather than drawn at zero.
Validate
Surface
Hole, not a zero
Path
Path
Winner
Drawdown
Underwater
From the peak
Signal
IC
Through time
Overlap
Book
Through time
Stress
Cost
Where it dies
Monitor
Limits
Absent, not zero
The curves are derived on your machine and bounded before they travel. What reaches the record is a summary of your backtest, computed where your data already is, never the data. The bound is 512 points, which is a couple of years of daily observations; a longer history is bucketed rather than shipped whole, and a payload larger than that is refused outright.
Below the figures is the step trace: every operation the engine executed in order, failures included. An OS study has no harness steps; inspect shows the three the package actually ran: alphaengine.sweep, compute.deflate, emit.study, with the figures that survived ingest. A run that stopped ends there rather than at its emit step. The missing tail is the record of where it refused.
What a filing cites
A figure in a filing points at the run that drew it. The filing does not keep a second copy of the series.
- Hypothesis
- The claim, who loses, what would kill it, and the horizon. Ideate creates the id. The terminal pins that same id.
- Run
- A portal experiment, or a study the terminal sealed. The path, the grid, and the information coefficient live here.
- Strategy
- One experiment kept. Deploy marks it deployed. It does not place an order.
- Memory
- One sentence about a source the account already owns.
- Filing
- An IC report or a CIO memo. The sources are numbered. Opening it again draws the charts from the cited runs.
Nothing is retyped at a handoff. A figure that cannot name its run does not travel.
Tiers: Individual ($79–$299) & Firm ($10K–$25K)
Individual Retail: Starter ($79), Pro ($149), Power ($299)
Individual tiers provide statistical screening and research tools—never personalized investment advice, portfolio optimization prescriptions, or single-name trade recommendations. Starter ($79/mo) includes S&P 500 scans, 25 backtests/month, Deflated Sharpe + trial counts, and 30-day history. Pro ($149/mo, $119/mo annual) unlocks unlimited backtests, the Point-in-Time Universe Builder, the Experiment Ledger with QuantConnect/VectorBT importers, the Robustness Grid heatmap, the Hypothesis Board, and PDF research dossiers. Power ($299/mo) adds custom dataset uploads with View hygiene & Dataset Registry, Walk-Forward ML, PBO (CSCV) and combinatorial out-of-sample stability, the Factor & Overlap Lab, Prior-Work Check, paper Decay Monitor, Floor agent (propose-only), and shareable Verification Report links. Retail tiers are web-only and have no CLI or ae_live_ keys (anyone can pip install alphaengine free).
Runs stay on the hypothesis, including killed ideas and failed trials. Trace lists what the terminal sealed and what the portal ran.
Firm Core ($10K/mo), Pro ($15K/mo) & Enterprise ($25K/mo)
Institutional firm tiers charge one flat monthly price for the entire team with zero seat counting. Core ($10,000/mo) serves funds under ~$250M AUM with one research pod, adding Strategies & Risk Monitor, HRP sizing, the Firm-Only Portfolio Risk Optimizer, fund data connectors, and cited IC packets. Pro ($15,000/mo) supports funds with 2+ research pods or strategies with the Multi-Pod Strategy Book, cross-pod overlap checks, Event-Driven Watchlist Triggers, and the IC Room with inline comments and logged decisions. Enterprise ($25,000/mo) serves $500M–$1B funds with dedicated deployment, per-fund data separation, custom approval gates, and Exam-Ready Research Log exports. Institutional teams can also deploy under the White-Label Track (custom contract, branding, and own domain).
The PM reads the hypothesis and the strategy. Sizing happens against the limits that apply, and the reason for the size is recorded at the moment of the decision, because whether a position is small from low conviction or from a bound limit are opposite facts about your process, and a return series cannot tell them apart afterwards. Agents propose; nothing books a trade.
What leaves is a ranked signal file: ticker, score, rank, target weight, dated and versioned. Your order management system turns that into orders. We never send a share count anywhere.
Fund: a CIO over several sleeves
A risk budget can only tighten. The budget a CIO sets and the mandate a PM already holds are merged on the server, taking the stricter of each limit, so a PM cannot decline a budget by not sending it, and a missing limit is silence rather than permission.
This tier is enforced server-side. The budget merge, the allocation rules and the countersignature all run server-side and are covered by tests. The portal unifies PM and quant workflows on one shared workbench with no seat counting. An individual with no pod still has the full loop. A firm shares memory and universes inside the pod. We would rather say that than show you a screenshot of a screen you cannot open.
Breaches get a disposition: cut, waive or hold, with a reason, a name and an expiry. A limit with no recorded decision behind it is the single thing an operational due diligence team asks to see and nobody can produce.
Periods close. The review packet, the letter commentary, the committee pack and the diligence responses assemble from evidence already collected, and a countersignature attaches to frozen content rather than to a pointer at something still editable.
This page describes what the objects mean and what each seat does with them, which is the half that does not move when a screen does. Request access or read the data boundary.
Part three · The Individual Investor Suite (/retail · Beta)
Self-serve /retail Beta architecture
The Individual Investor Suite (/retail, currently in Beta) brings deterministic walk-forward ML alpha, Triple-Barrier Meta-Labeling, TLS cointegration, and Hierarchical Risk Parity (HRP) portfolio construction to single-name and multi-asset researchers. While Institutional Firm pods (/portal) require founder approval via /onboarding?bucket=firm, Individual Beta users can sign up self-serve on /onboarding?bucket=individual. Research tools, never advice.
Tearsheet & Research Dossiers
For any ticker, the Single-Name Tearsheet (/retail/tearsheet) assembles factor exposure, valuation band state, SEC 13F and insider filing screens, and exportable research dossiers without trade structuring or personalised recommendations.
Catalyst & Shock Replay
Events & Shock Replay (/retail/events) replays historical earnings reactions and macro stress scenarios against a name or watchlist you follow.
Watchlist Scanner & CSV Connect
Watchlist Scanner (/retail/scanner) audits a multi-ticker basket for factor crowding, pairwise correlation clusters, and effective independent bets (N_eff), and surfaces the lowest-correlation diversifier candidates. Connect CSV (/retail/connect) lets users upload custom wide CSV price series that immediately override any ticker across Scanner, Tearsheet, Events, and the Retail AI Copilot.