Quantitative finance · 2026
Chronos
A native quant terminal, its strategies, and the returns to show for them.
Chronos is three generations of the same platform pulled into one. A first desktop terminal proved the product and set the pattern — a modular Python backend with local models for private context. A second generation rewrote the shell in Rust with GPU rendering, because an Electron window cannot carry a live chart surface, a terminal, an editor and a 3D globe at once. Underneath both runs the part that has to be right: an event-driven strategy and risk engine whose backtest and live loop are the same code, so a result that reproduces in research reproduces in production.
- Status
- Active
- Domain
- Trading systems · Native + local AI
- Role
- Architecture, strategy design, risk & execution
- Year
- 2026
Stack
- Rust
- GPUI
- Python
- R
- C++ · pybind11
- WGSL
- Ollama
- FinBERT
- FastAPI
- WebSockets
A GPU-accelerated quantitative trading terminal with its own mechanical strategies and risk engine: a Rust application shell, Python and R sidecars for machine learning and econometrics, locally hosted models so a live portfolio never leaves the machine, and one strategy implementation that runs identically in the backtest and in production.
The name
Chronos — KROH-nos, from the Greek khronos (χρόνος), time itself.
A market is a time series before it is anything else, and the edge a trading system has is almost never in what it holds but in when: when a regime turns, when a breakout is real, when to stand down. The terminal is built around that axis, and the name says so. It keeps the same celestial-and-Greek naming as the rest of the work — Luna the fixed reference, Ichne the trace left behind, Aphelion the farthest bound point, Chronos the clock everything is measured against.
Three generations, one lineage
The first generation was a shipped desktop terminal that proved the product was real: a modular Python backend covering data, quant, backtesting, portfolio and execution, driven by a packaged interface.
The second rewrote the shell from the metal up for the performance the first could not reach. The strategy and risk engine is the through-line, carried forward and hardened at each step. What is described here is the union of the three, not a fork of any one.
One language per job, on purpose
Rust holds the application shell and the core, because the shell must never stutter.
Python runs as a sidecar for machine learning and AI orchestration, because that is where the ecosystem lives. R runs as a service for econometric research, because reimplementing decades of statistical libraries elsewhere is a way to introduce bugs, not to remove dependencies. Shaders are WGSL; the panes inside the embedded webviews are plain JavaScript with no transpilation step.
Native rendering, no Electron
The shell renders through DirectX 12 on Windows and Metal on macOS.
That decision buys a chart surface that stays responsive with a live feed, a terminal, an editor and a 3D globe on screen at once — the exact load that made the Electron predecessor stutter. Model inference and econometrics run in separate processes, so a slow model can never drop a frame on the render thread.
Local models for private context
Sentiment classification and general reasoning run against locally hosted models rather than a hosted API.
The reason is not cost — it is that a prompt containing a live portfolio is a document you do not want to hand to a third party. Where a frontier model genuinely helps, the interface assembles the context, places it on the clipboard and opens an existing browser session, so the capability is there without the application ever holding a key.
The principle behind the returns
The figures in the table are not one clever signal; they are the product of a few principles that hold regardless of the exact rules.
The first is complementarity: strategies run in pairs where one is built to act on precisely the conditions the other stands down in, so the filter that costs one an entry is the signal that hands the trade to the other. The second is selection on correlation rather than on return — the independent-families scenario chooses systems for how little they move together, which is what turns a small give-up in raw return into a large cut in drawdown and the higher Sharpe. The specific entry conditions, thresholds and instruments stay in the repository; the principles are what make the numbers repeatable.
Risk as layers, not a stop-loss
Position size is not a fixed fraction; it is a function of how many independent conditions agree, expressed in volatility units so risk per trade stays constant across instruments and regimes, then floored by a drawdown throttle that multiplies rather than subtracts — a tripped breaker takes size to zero, not to something small.
Above the strategies sit per-system cooldowns, a heartbeat watchdog and a crash-safe flatten. Safety is settled before edge is chased.
One implementation, live or replay
The identical strategy and risk-manager objects are instantiated by the live loop and by the event-driven backtester, behind an adapter the engine cannot tell is feeding it live ticks or historical bars.
So a result that reproduces in research reproduces in production, or the bug is in the data rather than the code — which is the only footing on which a backtest number is worth reporting at all.
Pipeline
One implementation, live or replay
Stage Can reject
-
01
Market feed
Normalised ticks
Live or historical — same adapter
-
02
Signal
Strategy proposal
-
03
Gates
Filtered signal
Regime · volume · spread
-
04
Local AI
Private context
Portfolio never leaves the machine
-
05
Conviction
Position size
-
06
Risk
Approved order
Drawdown breaker · cooldown
-
07
Execution
Fill + state
The mathematics
What makes each
model different.
The distinctive element of each model, with its symbols defined — a bracketed placeholder stands in for the withheld core. The full models, and every fitted parameter, stay in the configuration they belong to.
Conviction-scaled position size
Size is a function of how many independent conditions agree, floored at zero and capped by the risk layer above it — never a fixed fraction.
- κ
- Conviction score from the weighted gates
- 1[g]
- Indicator that gate g passed
- R
- Risk fraction per trade
- E
- Account equity
- ATR
- Average true range — the volatility unit
- λ
- Stop distance in ATR units
- θdd
- Drawdown throttle, 0 when a breaker has tripped
Sizing in volatility units rather than price units is what keeps risk per trade constant across instruments and regimes. The drawdown throttle multiplies rather than subtracts, so a tripped breaker takes size to zero instead of to something small.
The returns
Two scenarios, one sample
Backtest over a foreign-exchange sample. Two selection scenarios of the same engine: S2 chosen for raw return, S3 constrained to independent — mutually uncorrelated — strategy families. Net AUD is shown for two account sizes, B and A. Backtested figures, not a live track record.
- 17.92 Sharpe ratio peak — independent families
- 4.38% Return best scenario
- 0.30% Max drawdown at the higher Sharpe
| # | Scenario | Trades | Net AUD (B) | Net AUD (A) | Return | Win rate | Max DD | PF | Sharpe |
|---|---|---|---|---|---|---|---|---|---|
| S2 | Max return | 131 | 6,581.73 | 87.69 | 4.384% | 61.8% | 1.61% | 2.32 | 12.67 |
| S3 | Independent families | 120 | 6,563.77 | 86.79 | 4.340% | 59.2% | 0.30% | 3.45 | 17.92 |
The independent-families scenario gives up almost nothing in return — 4.340% against 4.384% — while cutting maximum drawdown from 1.61% to 0.30%, lifting the profit factor from 2.32 to 3.45 and the Sharpe from 12.67 to 17.92. Selecting on how uncorrelated the strategies are, rather than on raw return, buys most of the risk reduction for free.
Skills exercised
What the build
actually demanded.
Against the corpus · 12 systems
This system Corpus median
Systems
- GPU-accelerated application shells in Rust
- WGSL shader authoring for chart and globe surfaces
- Cross-process IPC between a native shell and language sidecars
- C++ indicator kernels bound in-process via pybind11
Strategy & quant
- Complementary strategy design — paired systems that hedge
- Regime classification and signal gating
- Selection on cross-strategy correlation, not raw return
- Econometric research served from a dedicated R process
Applied AI
- Local LLM serving for private financial context
- Domain-specific sentiment classification
- Credential-free frontier-model workflows against existing sessions
- Model inference isolated from the render loop
Risk & execution
- Multi-layer conviction scoring driving position size
- Drawdown circuit breakers and per-strategy cooldowns
- One strategy implementation shared by live and backtest
- Kill switch, heartbeat watchdog and crash-safe flatten
What it establishes
-
Three generations, one lineage
Proven, rewritten, then hardened into one platform
-
GPU-native shell
DX12 on Windows, Metal on macOS — no Electron
-
Local-first AI
A live portfolio never leaves the machine
-
One implementation
The live loop and the backtester run the same code
-
Conviction-scaled sizing
In volatility units, under drawdown breakers
-
Backtested, not promised
Returns shown with drawdown and Sharpe beside them