Desktop app for Windows and macOS

Your quantitative
research desk.

Build a trading strategy from blocks, backtest it on your own data,
and find out whether the result could be luck.

An account is required to get the app: create one, answer five short questions and download it. Early access is free for life on one computer, in exchange for your feedback. Windows 10 or 11, and macOS 13.1 or later on Apple silicon.

Local research workspaceBuilt-in assistant ↗

From an idea
to a tested strategy.

Eight screens from the desktop app, in the order you use them.

Stochastly workspace: a file explorer with strategies and CSV price files, a Python strategy open in the code editor, and the run log

Your files and your code.

Browse your strategies and price files, edit Python in the code editor, and follow each run in the log. Panels dock, split and resize.

Stochastly strategy composer: CSV import, train and test split, an EMA crossover, execution, two validation gates and the verdict wired on the canvas, with the assistant answering a question about the graph

Build it from blocks.

Place data, signals, costs and exits on a canvas and connect them. The assistant beside the canvas can place blocks for you or explain what the graph does.

Stochastly results: the equity curve of the best of 12 configurations in green with the others in grey, monthly returns as a heatmap, and the drawdown chart

Backtest it on your data.

Load your own price files and run the graph on your computer. The best configuration is drawn in color, the others you tried stay in grey, with monthly returns and drawdown under it.

Stochastly verdict at a glance: a score out of 100, the list of checks with pass or fail and a NO-GO verdict, beside the overfit chart showing where the in-sample winner ranked out of sample

See if it is an edge or luck.

One screen groups the checks: does the result survive the number of variants you tried, does it hold on data kept out of the tuning, are there enough trades. It ends on GO or NO-GO.

Stochastly luck tests: where the next 300 trades could take the account, and the strategy curve drawn against 120 strategies that guessed direction at random

Compare it with chance.

Your curve is drawn against strategies that trade at random with the same move sizes, and your trades are replayed thousands of times to show where the account could go next.

Stochastly prop-firm view: the distribution of net cash outcomes over simulated challenges, the payout probability, the median days to a first payout, and the same result with the edge removed

Check your prop-firm odds.

Replay the strategy through a prop-firm challenge many times, with its target and loss limits, and read your chance of passing before you pay the fee.

Stochastly research view: a panel of agents with roles such as quant researcher, validator and devil's advocate discussing a question, beside the vault of saved run notes

Ask a panel of agents.

Pick roles such as researcher, validator and devil's advocate, give them a question and a token budget, and keep each run as a note you can search later.

Stochastly Paper Editor: a research paper on a systematic trading strategy, written from the run and rendered as a PDF

Write it up.

Turn the run into a research paper with its charts, method and disclosures, rendered as a PDF you can share.

Screens from the desktop app, captured on its built-in sample data.

Already ran a backtest?
Drop the file.

Drop a CSV of returns, equity or trades on the app window below, and its verdict and metrics are worked out from your file.

Without a file of your own, try our synthetic sample of two years of random daily returns.

A file alone cannot show how the strategy does on unseen data, so its verdict stays at not conclusive.

How the check reads your file ↗
The verdict, metrics table and assistant are drawn by the app's own code. The window stays empty until you add a file, and each figure in it comes from your file.

Will it pass
a prop-firm challenge?

Stochastly replays your strategy under the firm's rules thousands of times and shows how often it passes and how long it takes.

  1. 1Import your strategy
  2. 2Pick the firm rules
  3. 3Get the pass rate before paying the fee

Hypothetical simulation, not live results. 4,000 simulated accounts over 365 days on the $100k two-step rules at 1% risk a day, 60 of them drawn.

Strategy: long-only moving-average cross on EURUSD, GBPUSD, USDJPY and XAUUSD hourly bars; its research verdict was NO-GO.

Your strategy.
6 code targets.

Export the supported logic of your graph to the language you work with.

Pick a language to read the file the app exported for a long-only moving-average cross strategy. Its header gives the parameters and how closely the file matches the engine.

Languages & coverage ↗Strategy code exports ↗

Coverage depends on the strategy and target. Each file includes its scope and limitations.

Pine Script & MetaTrader notices ↗
Stochastly / code export
"""Strategy “ema_cross” exported from Stochastly.GENERATED BY STOCHASTLY — do not edit by hand, re-export.kernel     : ema_crossparameters : {"atr_mult": 0.75, "ema_fast": 13, "ema_slow": 21, "rr": 3}direction  : Lfidelity   : 1.0 over 7 engine trades (direction L), compared TRADE FOR TRADE — entry bar, exit bar, side and gross R, no tolerance — against the engine's own trade table. Precision 1.0 (0 trade(s) this file books and the engine does not). IDENTICAL on every path measured. Measured on synthetic price paths, not on your own data. Worst of 4 synthetic path(s) that produced engine activity, out of 4 tried.def _long_raw(open, high, low, close, volume):    return crossup(ema(close, 13), ema(close, 21))
Run against the engine on synthetic price paths: same trades, from entry to exit.
//@version=6// GENERATED BY STOCHASTLY - kernel ema_cross, parameters {"atr_mult": 0.75, "ema_fast": 13, "ema_slow": 21, "rr": 3}// fidelity   : 1.0 over 7 engine trades (direction L), compared TRADE FOR TRADE — entry bar, exit bar, side and gross R, no tolerance — against the engine's own trade table. Precision 1.0 (0 trade(s) this file books and the engine does not). IDENTICAL on every path measured. Measured on synthetic price paths, not on your own data. Worst of 4 synthetic path(s) that produced engine activity, out of 4 tried.; target fidelity: TradingView applies its own intrabar fills and tick rounding; timeout and session close orders fill on the following bar. The generated Pine code has not been executed here.longRaw = f_cross(f_ema(close, 13), f_ema(close, 21)) > 0shortRaw = f_cross(f_ema(close, 21), f_ema(close, 13)) > 0
TradingView applies its own intrabar fills and tick rounding; timeout and session close orders fill on the following bar. The generated Pine code has not been executed here.
//+------------------------------------------------------------------+//| GENERATED BY STOCHASTLY - do not edit by hand, re-export.//| kernel     : ema_cross//| parameters : {"atr_mult": 0.75, "ema_fast": 13, "ema_slow": 21, "rr": 3}//| direction  : L//| fidelity   : 1.0 over 7 engine trades (direction L), compared TRADE FOR TRADE — entry bar, exit bar, side and gross R, no tolerance — against the engine's own trade table. Precision 1.0 (0 trade(s) this file books and the engine does not). IDENTICAL on every path measured. Measured on synthetic price paths, not on your own data. Worst of 4 synthetic path(s) that produced engine activity, out of 4 tried.; target fidelity: MetaTrader uses terminal history and broker fills; its EMA warm-up and execution can differ from the engine. The generated MQL5 code has not been executed here.bool LongRaw(int i)   { return(((Ema(3,13,i) > Ema(3,21,i)) && (Ema(3,13,(i+1)) <= Ema(3,21,(i+1))))); }bool ShortRaw(int i)  { return(((Ema(3,21,i) > Ema(3,13,i)) && (Ema(3,21,(i+1)) <= Ema(3,13,(i+1))))); }
MetaTrader uses terminal history and broker fills; its EMA warm-up and execution can differ from the engine. The generated MQL5 code has not been executed here.
# GENERATED BY STOCHASTLY - kernel ema_cross, parameters {"atr_mult": 0.75, "ema_fast": 13, "ema_slow": 21, "rr": 3}# fidelity   : 1.0 over 7 engine trades (direction L), compared TRADE FOR TRADE — entry bar, exit bar, side and gross R, no tolerance — against the engine's own trade table. Precision 1.0 (0 trade(s) this file books and the engine does not). IDENTICAL on every path measured. Measured on synthetic price paths, not on your own data. Worst of 4 synthetic path(s) that produced engine activity, out of 4 tried.; target fidelity: this language has no recursive exponential moving average, so the translation uses a finite window# exact : NO - read the gaps below# gap : ema(x, 13) rendered by a FINITE geometric window of 52 bars (factor 0.8571): FASTEXPR has no recursive exponential average. The first bars and weighting tail differ — signal order is preserved, its value is not.# gap : ema(x, 21) rendered by a FINITE geometric window of 84 bars (factor 0.9091): FASTEXPR has no recursive exponential average. The first bars and weighting tail differ — signal order is preserved, its value is not.# WorldQuant and BRAIN are trademarks of WorldQuant, LLC. Stochastly is an independent# product, not affiliated with or endorsed by WorldQuant.# You remain solely responsible for complying with the BRAIN platform agreement you# accepted, including any originality warranty attached to submitting an alpha.# NOT EXPORTED — 1 node(s) of your graph are NOT in this file. 1 of them CHANGE the trades: this file does not replay your backtest's entries and exits.#   • [execution] Execution (defaults) — FASTEXPR is a stateless alpha language: the stop, target and forced close that made your backtest's P&L are not in this alpha. Python, MQL5, Pine, C++ and Rust carry them.subtract(ts_decay_exp_window(close, 52, factor=0.8571), ts_decay_exp_window(close, 84, factor=0.9091))
This language has no recursive exponential moving average, so the translation uses a finite window.
// GENERATED BY STOCHASTLY - do not edit by hand, re-export.// kernel     : ema_cross// parameters : {"atr_mult": 0.75, "ema_fast": 13, "ema_slow": 21, "rr": 3}// direction  : L// fidelity   : 1.0 over 7 engine trades (direction L), compared TRADE FOR TRADE — entry bar, exit bar, side and gross R, no tolerance — against the engine's own trade table. Precision 1.0 (0 trade(s) this file books and the engine does not). IDENTICAL on every path measured. Measured on synthetic price paths, not on your own data. Worst of 4 synthetic path(s) that produced engine activity, out of 4 tried.inline S long_raw(const S& o, const S& h, const S& l, const S& c, const S& vol) { (void)o; (void)h; (void)l; (void)c; (void)vol; return crossup(ema(c, 13), ema(c, 21)); }inline S short_raw(const S& o, const S& h, const S& l, const S& c, const S& vol) { (void)o; (void)h; (void)l; (void)c; (void)vol; return crossup(ema(c, 21), ema(c, 13)); }
Run against the engine on synthetic price paths: same trades, from entry to exit.
// GENERATED BY STOCHASTLY - do not edit by hand, re-export.// kernel     : ema_cross// parameters : {"atr_mult": 0.75, "ema_fast": 13, "ema_slow": 21, "rr": 3}// direction  : L// fidelity   : 1.0 over 7 engine trades (direction L), compared TRADE FOR TRADE — entry bar, exit bar, side and gross R, no tolerance — against the engine's own trade table. Precision 1.0 (0 trade(s) this file books and the engine does not). IDENTICAL on every path measured. Measured on synthetic price paths, not on your own data. Worst of 4 synthetic path(s) that produced engine activity, out of 4 tried.fn long_raw(o: &S, h: &S, l: &S, c: &S, vol: &S) -> S { let _ = (o, h, l, c, vol); crossup(ema(c.clone(), 13), ema(c.clone(), 21)) }fn short_raw(o: &S, h: &S, l: &S, c: &S, vol: &S) -> S { let _ = (o, h, l, c, vol); crossup(ema(c.clone(), 21), ema(c.clone(), 13)) }
Run against the engine on synthetic price paths: same trades, from entry to exit.
18 supported kernelsScope & evidence ↗

Research papers export too: a PDF paper, a batch of papers in one layout, or a one-page tearsheet. See a paper ↗

214 charts and 667 nodes
in the app.

Each chart reads the run you just made. The nodes cover data, signals, rules, costs and checks across 28 families; 492 of them are placed in a graph by a test that checks their effect on the output.

Demo run on synthetic data: seeded generators, no market data. The 149 charts in this demo are drawn by the app's own code.

Write the paper.
Publish it.

The app turns a run into a paper. The journal lists working papers written with Stochastly, and anyone with an account can submit one.

First page of a research paper exported by Stochastly

Export the
research paper.

The app writes a run up as a PDF paper: abstract, method, numbered equations, results and a disclosures box. A section with no data behind it is left out, with a note saying so.

  • Research paperPDF, from the Paper Editor
  • Batch of papersPDF, several runs in one layout
  • TearsheetOne page, PNG or PDF

The Paper Editor is available from Atelier; Starter has no access.

Open the sample PDF ↗Paper export ↗App export · 14 September 2026 · hypothetical simulation

Working papers

What changed, and what we are building.

Every change since we went public on , one line each, with the work in progress on top. Full changelog · Full roadmap

  • StochastlyIn progress–building A Windows installer signed with our name, so Windows stops warning about an unknown publisher
  • StochastlyIn progress–building A community marketplace where a strategy is published together with the run that produced it
  • StochastlyNext–building Rebuild a backtest session from the log of a running bot
  • StochastlyNext–building Read a live bot with the figures a backtest is judged on
  • StochastlyNext–building Creator payouts in more countries
  • Mahév0.2.4added data Data > Connect a data source downloads daily bars of US stocks and ETFs with your own free API token, into your data folder, adjusted for splits and dividends.
  • Mahév0.2.4added baskets a Basket Johansen z-score strategy trades 2 to 10 markets; its weights are estimated in-sample and frozen out-of-sample.
  • Mahév0.2.4added cointegration Engle-Granger (two markets) and Johansen (2 to 12 markets) test the closes of the markets in the run, where they used to test the results of the configurations.
  • Mahév0.2.4added assistant the assistant answers the question you asked in its first sentence, says plainly that it has no internet access, does not repeat its previous answer, and no longer shows an internal line of the app.
  • Mahév0.2.4added MCP a run where no configuration survives keeps what you need to judge it: the best rejected configuration, its diagnostics and the real reason, in the paper, the tearsheet and adversarial_check.
  • Mahév0.2.3added bug reports a Report a bug button in the title bar, also on Ctrl+Shift+B: the dialog shows exactly what is sent before you send it. The crash screen and the engine banner open the same dialog to send the crash report.
  • Mahév0.2.3added assistant 100 assistant credits are offered once to an early access account, and the gauge shows the balance out of 100 before your first message.
  • Mahév0.2.3added MCP Stochastly's fifteen research agents run from your own model (Claude Code, Codex) through MCP, with no credit used; an MCP export is saved in the export folder under a new file name.
  • Mahév0.2.3added sign-in signing in is one click on Sign in, with no box to tick first.
  • Hugov0.2.2changed macOS the Mac app is on 0.2.2, the same release as Windows: the new models, the engine fixes and the in-app update notice are in the .dmg of your account.
  • Hugov0.2.2changed updates a Mac still on 0.1.0 is told in the app that 0.2.2 is out; the download is the signed .dmg, notarised by Apple on 2026-10-16.
  • Mahév0.2.2fixed overfitting the probability of backtest overfitting (PBO) is now computed when several configurations tie for the best in-sample score: each tied winner counts 1/k, and a configuration that only repeats another (identical, or scaled by a power of two such as its double) counts once.
  • Mahév0.2.2fixed account sign-in and account messages now point to the early access at stochastly.com/join, and a revoked access is told to write to contact@stochastly.com.
  • Mahév0.2.1fixed prop firm a loss that exactly touches the daily or total limit now fails the challenge, and a target reached exactly now passes it.
  • Mahév0.2.1fixed prop firm a run too short to judge (under 10 days of PnL) now shows that reason, instead of a request to wire a node that is already wired.
  • Mahév0.2.1fixed export MQL5 and Pine Script exports no longer re-enter on the bar where the broker closed a trade on its stop or target, unless same-bar re-entry is on.
  • Mahév0.2.0added models new MLP, ElasticNet and stacking models, permutation importance, out-of-distribution abstention and a label-permutation placebo.
  • Mahév0.2.0added engine the engine no longer dies on some Windows machines (0xC000070A); a crash screen and an engine error log.
  • Mahév0.2.0added history assistant runs now appear in the run history.
  • Mahév0.2.0added updates the app tells you when a new version is out and downloads it directly.
  • Mahév0.2.0added macOS the Mac app is not part of this release yet.
  • Mahév0.1.0fixed engine a run that fell back to the reference stand-in is reported as not conclusive instead of a verdict on your strategy.
  • Mahév0.1.0fixed engine look-ahead leaks closed in the multi-timeframe filter, the regime router and several feature builders.
  • Mahév0.1.0fixed exports Execution locks no longer leak into strategy parameters; controls with no effect on native kernels are disclosed.
  • Mahév0.1.0fixed costs a missing break-even is no longer shown as a survivor.
  • Mahév0.1.0added access the app is in private access: an invited account gets the Portfolio edition, and the trial and purchase screens are gone.
  • Mahév0.1.0added sign-in the app connects from a sign-in link opened on another device, and a failed connection shows its cause in plain words.
  • Mahév0.1.0added assistant Stop closes the request at once, with no retry and no billing after it. The assistant is named beside the message box.
  • Mahév0.1.0added data timeframes from 1 second to 1 month; a run on a single market returns its own measured result.
  • Mahév0.1.0added models Random Forest is back as a native model option.
  • Mahév0.1.0added portfolio joint loss days, stressed correlation, and values printed on the colour cells.
  • Mahév0.1.0added installer the installer ships the 23 engine modules the app runs, down from 332; the shipped files were audited line by line, and each fix came with a test.
  • Hugov0.1.0changed macOS Stochastly runs on Apple silicon Macs with macOS 13.1 or later; the .dmg is signed with a Developer ID and notarised by Apple.
  • Mahév0.1.0changed assistant the hosted assistant model is checked for response time before it is switched on.
  • Mahév0.1.0changed licence licence validation moved to the new server keys.

Background: Quentin Matsys, The Moneylender and His Wife, 1514, public domain, in a pixel-art interpretation.

Join the early access.

Create an account, answer five short questions, then download the app. It stays free for life on one computer; in return you tell us what works and what broke.

Join the early access

Claude is a trademark of Anthropic, Gemini of Google and Codex of OpenAI. Stochastly is not affiliated with them.