The exam is only as good as the data you feed it. There are two ways in: if you use Freqtrade, upload its own files and convert nothing; otherwise, a small CSV. Pick your path below — every example works as-is (download it and try).
Upload the file Freqtrade already wrote. No conversion, no editing.
→ .json / .zip backtest · .fthypt hyperopt
Excel, Python, TradingView, MT4/5, your own backtester… → one CSV with your results.
→ B1 one strategy · B2 ⭐ all variants · B3 trade list
The sequence of results your strategy produced, over time. Nothing else. Not your rules, not your code, not your parameters — we never ask for them and could not use them. If you can produce a column of daily returns (or your account balance day by day), you already have everything.
1. Your backtest. Run freqtrade backtesting --export trades and upload the file it creates in user_data/backtest_results/ — the .zip on recent versions or the .json on older ones. Both work: we read the daily curve and fill no-trade days with 0 (validated against 910 real files).
2. Your hyperopt (do this one FIRST if you have it). Upload the .fthypt from user_data/hyperopt_results/. It does not contain the curves, so it cannot be graded on its own — what it gives us is the REAL number of variants you tried, which is the single most important number of the whole exam. We read it, show it, and then hand you a link to upload your winning backtest with that number already filled in.
3. Set periods per year = 365 (crypto trades every day). This is the one setting you must not leave at the stock default of 252.
· You backtested ONE strategy → B1 (unlocks PSR, MinTRL and the sins).
· You tried MANY variants and kept the best → B2 ⭐ (also unlocks PBO + Deflated Sharpe —
the full exam. This is the one that matters).
· You only have the list of closed trades → B3.
What it must contain: one row per period (day/week/month), two columns:
· date — the period's date (ISO like 2024-03-01 is safest)
· value — EITHER the period's return in decimals (0.004 = +0.4%) OR
your account balance (10000, 10040, …). We detect which one automatically — never mix both.
date,ret 2024-01-02,0.0041 2024-01-03,-0.0012
How to generate it · Excel/Google Sheets: two columns as above → File → Save as → CSV. · Python: serie.to_csv("my_backtest.csv") (a pandas Series of returns with DatetimeIndex is exactly this). · Any backtester: export the equity curve.
Uncertain? Prefer the DAILY equity curve: it is unambiguous and we derive returns ourselves.
The single most valuable file you can produce. First column date, then one column per variant you tried — ALL of them (winners and losers), same period, same type (all returns, or all equity — never mixed). ≥8-10 variants make PBO meaningful; 100+ is fine. The variants must be genuinely different: near-copies of one strategy (a parameter nudged by 1 %) make the PBO come out worse than it is — the report flags it when that happens.
date,cfg_a,cfg_b,cfg_c 2024-01-02,0.004,-0.001,0.002 2024-01-03,-0.001,0.002,0.000
How to generate it: in your optimization loop, save each variant's daily returns as one column. Python: pd.DataFrame({name: serie for each variant}).to_csv("grid.csv"). Uploading only the winner hides exactly what we need to examine — if you can't rebuild the grid, at least declare in step 2 of the wizard HOW MANY variants you tried.
One column named ret / return / pnl / profit: the return of each CLOSED trade in decimals (0.02 = +2%), in chronological order, WITHOUT a date column (or select "trades" in the wizard if it has one). Losses included — a list of only winners is self-deception.
pnl 0.021 -0.013
⚠️ Least informative format: without dates we cannot check year-stability, and per-trade Sharpe is not comparable to daily Sharpe. Use it only if you have nothing else.
Separator , ; or tab · decimal commas (0,004) · % sign (0,4% or 0.4% → we divide by 100) · thousands separators (10,000 or 1.234,56) · unordered dates (we sort them) · returns vs equity (we detect it). So a default Spanish/Portuguese Excel export works as-is. Still, the safest file is: comma separator, decimal point, ISO dates.
The report opens with a line saying how we understood your file: how many periods, from which date to which, read as returns or as equity, and how many variants. Read that line before reading the verdict. If the number of periods or the dates don't match what you uploaded, the verdict is about a file that isn't yours — fix the CSV and run it again.
Below ~60 periods the exam will (honestly) tell you the sample is too small; ≥250 (a year of daily data) starts being meaningful; more is better. That is not a limitation of NeuralTEST — it is the statistical reality your backtest lives in, and MinTRL will tell you the exact number your Sharpe needs.