A long-form description of the system, end to end. The universe, the scan, the gate, the brain, the schedule, the way we treat backtests, what we don't do.
1. The shape of the system
The platform is a quantitative scanning engine. It runs an ensemble of seventeen statistical and machine-learning models (one more is registered but default-OFF and not yet promoted to live) against a universe of liquid instruments, on a schedule, and emits a small number of candidate signals. Each candidate goes through a ten-check Grade A gate. Only candidates that clear the gate are published.
The brain — the adaptive-weight ensemble — updates from realized closed P&L. Equations that produce wins go up. Equations that produce losses go down. The brain saves a daily snapshot.
The platform does not place trades. We publish; you trade. The signal is the product.
2. The universe — what we look at
We scan roughly 1,100 instruments across multiple asset-class groups:
- US large cap — S&P 500 components, sector ETFs, megacaps.
- US small cap — Russell 2000 subset filtered by liquidity.
- US ETFs — Index, sector, factor, leveraged (Edge tier and above).
- US futures — ES, NQ, YM, RTY, GC, SI, CL, NG, ZB, ZN — with full session-aware gating.
- FX — Majors and selected crosses; deliberate about which we trust at which session.
- European indices — DAX, FTSE, CAC, AEX, IBEX, FTSE-MIB, SMI.
- Asia indices and stocks — Nikkei, Hang Seng, KOSPI, TWSE, ASX, NSE.
- Crypto — A short list of liquid pairs. Conservative on what we pretend to know about crypto microstructure.
Every instrument has a session-hours gate. If the exchange is closed, we don't generate fresh signals on that instrument. If the data feed has been silent past a tolerance, we suppress the symbol. Neither is a feature; both are floors.
Engineering pointer: the universe is in engine/config.py:SYMBOLS; the session gate is in engine/config.py:CASH_SESSION_HOURS_UTC. The code is the source of truth.
3. The scan — what runs each session
A scan is a single pass of the engine over the universe. For each symbol, the engine pulls bar data (intraday or daily, as required), computes a feature vector, runs seventeen models in parallel, and emits a per-equation score plus a combined ensemble score.
Each scan also runs side-modules that don't directly score symbols but inform the gate:
- BOCPD — Bayesian online change-point detection. Flags symbols where the price-process distribution has shifted.
- Five-player regime decomposition — splits the recent return distribution into five archetypal players, gives a regime label.
- Anharmonic oscillator fair value — a non-Gaussian fair-value model. Identifies when price is far from the model's centre.
- Volume confirmation — a microstructure proxy that asks whether bar-volume justifies the move.
- Signal-latency clock — measures how many bars old the move is. We don't enter a move on bar 47 of 48.
4. The Grade A gate — ten checks
The gate is the choke point between a candidate signal and a published one. A candidate becomes a Grade A signal only when ten independent checks pass. Each check has its own threshold; thresholds vary by asset class because base rates vary by asset class.
- Sample size adequacy. Has the equation seen enough closed trades on this asset class to claim its track record? Below the threshold, the candidate fails the gate. Lower for liquid US equity, higher for thin small caps.
- Walk-forward stability. Did the equation perform comparably across the three most recent walk-forward windows? A model that's good in window one and bad in windows two and three doesn't pass.
- Asset-class profit factor. Profit factor on this asset class must clear an asset-class-specific floor. FX requires 1.30, US equity 1.50, crypto 1.80, etc. The numbers reflect microstructure differences.
- Maximum drawdown ceiling. The equation's worst observed drawdown on this asset class must be below a ceiling. Models that have repeatedly blown up on a name don't get to publish on it.
- Regime alignment. The five-player regime decomposition has to support the trade direction. Long signals in a "panic seller dominates" regime fail this check.
- Change-point absence. BOCPD must not be flagging an active change point. We don't trade through a regime break we can detect.
- Signal latency. The move's bars-since-start must be in the early part of its expected lifespan. Stale moves fail.
- Volume confirmation. Bar volume must support the move. A spike on no volume fails.
- Hazard plausibility. Cramér-Lundberg-style ruin probability on the trade given current capital and stop must be below a threshold.
- Factor non-redundancy. If the trade is highly correlated with positions you already have via the watchlist or paper book, the gate flags it for size reduction.
Two structural rules govern the gate:
- Fail-safe open on missing data. If a check has no data for a symbol (volume on spot FX, change-point on a brand-new symbol), the gate does not block on that check. We don't reject a signal because we lack evidence.
- Fail-safe closed on bad data. If a check has data and the data fails the threshold, the gate blocks. Hard.
If a candidate passes all ten and lands on the published list, it carries a Grade A label and a confidence number. The confidence is the ensemble agreement, not a probability of profit.
Engineering pointer: engine/grade_gate.py is the canonical implementation. Asset-class thresholds are _ASSET_CLASS_PF_MIN and similar dictionaries.
5. The brain — the part that learns
The brain is the adaptive-weight ensemble that combines the seventeen equations. (One additional equation, tsmom, is registered but default-OFF; we ship new equations behind a flag and only flip them live after a canary period.)
Each equation has a weight. Weights are non-negative and sum to one. The weight on equation E is updated every time a trade closes:
- If E predicted the direction correctly and the trade closed in profit: the weight on E goes up by a small step.
- If E predicted incorrectly and the trade closed in loss: the weight on E goes down by a small step.
- If E was indifferent (low-confidence on this trade): the weight does not move.
The step size is small, the brain moves slowly, and the brain saves a snapshot every day. Each snapshot is auditable in data/brain.json.
We do not retune the brain to make backtests look better. We retune from realized closed trades only. The realized-feedback loop is the brain.
When an equation's weight has been zero — or below a small floor — for an extended period, we kill it. We don't carry dead weight. When we kill an equation, we publish a note in the changelog. The same applies to threshold changes on the gate: if we change a threshold, we say so.
The brain is not a personality. It is not a ChatGPT-style "AI". It is a Bayesian-style updater over equation weights. We do not claim it predicts the market. We claim it learns which models, on which asset classes, in which regimes, are currently producing realized profit — and weights them accordingly.
6. The schedule — when scans run
The platform runs thirteen scheduled scan windows in a typical 24 hours. Each window is gated by what's open and what's liquid. Times below are UTC; the engine internally schedules in Singapore time (UTC+8) and converts.
| # | Window | UTC | Coverage |
| 1 | Metals AM | 21:00 (-1d) | Gold, silver, palladium — NY-session push into Asia open |
| 2 | Asia Indices (open) | 00:00 | Nikkei, Hang Seng, KOSPI, TWSE, ASX — first hour after Tokyo |
| 3 | Asia Indices (mid) | 01:45 | Same group, 2.75 hrs in; HK now open |
| 4 | India Equities (post-open) | 04:15 | NSE megacap and large cap — gap-adjusted |
| 5 | India Mid-Session | 06:30 | NSE megacap and mid cap — peak NSE volume |
| 6 | FX London Open | 07:30 | Major and cross FX — London = 43% of global FX volume (BIS 2022) |
| 7 | Europe Indices | 08:00 | DAX, FTSE 100 (selective; skip NL25, EU50) |
| 8 | Main US Scan | 09:00 | US indices, megacap, tech, sector ETFs — primary US window |
| 9 | US Equities (post-open) | 13:30 | US megacap, tech, blue chip — first 30 min noise has passed |
| 10 | Futures NY Open | 14:00 | Index, energy, metals futures — peak ES/NQ vol |
| 11 | Metals PM | 15:00 | Gold, silver, palladium — M15 entries during US session |
| 12 | FX London-NY Overlap | 15:00 | Major FX — 70% of daily FX volume sits in this overlap |
| 13 | Futures NY Mid | 17:30 | Index futures — US lunch hour; established intraday trends |
Schedules can be paused individually. Each schedule has a kill-switch and a per-schedule blacklist of symbols. We have shipped the FX-overlap kill-switch and the US-EIA-Wednesday block; both are in scheduled-scan code.
Engineering pointer: engine/config.py:OPTIMAL_SCAN_SCHEDULE is the source of truth. The scheduler in server.py reads from there.
7. Backtests, walk-forward, and realized
The three things we mean
- In-sample backtest. The model run on the same data we used to design and tune it. Optimistic by construction. We label every chart "(in-sample)" and add an "inflated" annotation when the raw Sharpe exceeds 3.
- Walk-forward backtest. The model run on a window of data not used to design it. Rolling windows, model parameters fixed across the test windows. Less optimistic than in-sample, but still hypothetical.
- Realized. The track record of signals after the platform published them. Stored in the
tracked_signals ledger, fed back into the brain, audited on a public scoreboard.
How we keep backtests honest
- No look-ahead. Every feature uses only data available at the simulated decision time. Code is reviewed against this rule on every PR.
- Walk-forward windows. No single random train/test split. Rolling walk-forward windows, weights frozen on the test window.
- FDR correction. When testing multiple hypotheses across hundreds of symbols, we apply Benjamini-Hochberg false-discovery-rate correction. Uncorrected p-values do not ship.
- Costs subtracted. Backtests subtract commissions, spreads, and a market-impact term. We display a "cost-included" badge on each chart. Where a chart does not subtract a cost (rare), the chart says so.
- Survivorship-bias-aware universes. Where the data permits, we use universes that include de-listings.
How we keep realized honest
- Every signal the engine publishes is logged with timestamp, symbol, direction, entry, stop, target, equation attribution, and gate confidence.
- On close (target hit, stop hit, or schedule end), the realized P&L is computed and logged.
- The realized number is what feeds the brain. The realized number is what the public scoreboard shows.
- If a signal closes without a realized record — which would mean the feedback loop is broken — we log it as
health: broken on the admin panel and fix it.
8. Risk limits the engine enforces
The engine enforces several limits in code, not in copy. None of them is a toggle.
- Per-position sizing. The risk model derives a recommended position size from your capital, the proposed stop, and a per-asset-class hazard floor. The size is a recommendation; the engine never places the order.
- Per-trade max loss as a fraction of capital. If a proposed stop would risk more than the per-trade ceiling, the gate blocks the signal.
- Sector concentration ceiling (Edge). If a candidate would push your watchlist over a sector concentration limit, the signal is flagged.
- Cramér-Lundberg ruin floor (gate check #9). If the implied ruin probability across the brain's exposure is too high, the gate blocks new candidates until that drops.
- Hard freshness floor. Stale data suppresses the symbol from a scan. The freshness threshold is per-asset-class.
9. What we don't do
- We don't predict. The platform produces probabilistic candidate signals scored by an ensemble. No equation in the engine outputs a "the price will be X tomorrow" prediction.
- We don't auto-trade. Connected brokers receive nothing from us by default. The signal is the product. You decide what to do with it.
- We don't give personalized advice. We don't know your tax bracket, jurisdiction, time horizon, dependents, or any of the things a real adviser would need. We are a publisher; you are the trader.
- We don't sell user data. See the privacy policy.
- We don't run a brokerage. No order routing, no kickback from a broker.
- We don't claim "AI predicts the market". We use statistical and machine-learning methods. Those are not crystal balls. The marketing language we use reflects that.
10. Reading list (if you want the math)
The methodology rests on published work. The list below is a starter set:
- Adams & MacKay (2007) — Bayesian Online Changepoint Detection. The basis of our BOCPD module.
- Marcos López de Prado — Advances in Financial Machine Learning. Walk-forward, purged k-fold, deflated Sharpe.
- Benjamini & Hochberg (1995) — Controlling the False Discovery Rate. The multi-hypothesis correction we use.
- BIS 2022 Triennial Survey — FX market microstructure. Basis of our FX session timing.
- Cramér-Lundberg ruin theory — classic insurance-mathematics framework, used as gate check #9.