How to prepare your data
We test one thing: whether your predictions tell us anything about what happened next. This page explains what to send, how to get your data into shape, and when a dataset can be tested.
01What to send
We need every prediction you made in the period, when you made it, and what the market did afterwards over one fixed horizon. Send us four things:
- The data file — one CSV, one row per prediction (format below).
- The claim — the sentence you want tested, in your own words. For example: “Our high-conviction calls outperform our low-conviction calls on 4-hour returns.”
- The horizon — how far ahead each prediction looks: 15m, 4h, 1d, 1w.
- Your real trading cost — round-trip, in percent, fees plus typical slippage. If you don't know it, we use 0.06%, and the report shows the result at every cost from 0 to 0.20%.
Every prediction, not a selection. A file with the losers removed, or with rows added afterwards, cannot be tested — a report built on it would be wrong. Tell us how the predictions were recorded at the time. The report states what we could verify and what we could not.
The free Quick Check runs the same seven tests, with no login, and the file is not kept. It is the fastest way to see that your file is readable before you send it.
02The file format
One CSV file with a header row and one row per prediction. Three columns are required, two are optional.
| Column | What it holds | Example |
|---|---|---|
| timestamp REQUIRED | The moment the prediction was made, in UTC. YYYY-MM-DD HH:MM or Unix seconds. | 2026-05-01 14:15 |
| prediction REQUIRED | A number: a score, a probability, an expected return, or +1 / −1 for long / short. Higher must mean “more up”. | 62.4 |
| outcome REQUIRED | What happened over the horizon after the timestamp. For markets: the price change in percent. | 0.31 |
| group OPTIONAL | Which instrument, coin or series the row belongs to. Needed when the file covers more than one. | BTC |
| price OPTIONAL | The price at the timestamp. A regular price series lets us check that the outcome is aligned, and split results by market regime. | 61250.5 |
A minimal file:
timestamp,group,prediction,outcome,price
2026-05-01 14:00,BTC,62.4,0.31,61250.5
2026-05-01 14:00,ETH,48.9,-0.12,2604.1
2026-05-01 14:15,BTC,55.0,0.08,61302.0
2026-05-01 14:15,ETH,51.2,0.22,2601.7
Rules that matter
- One row per group per timestamp. Duplicated rows inflate the sample and make every test too generous.
- One fixed horizon for the whole file. To test 4h and 24h, send two files.
- The outcome is the market's move, not your profit. For a short call the outcome is still the price change; the negative prediction takes care of the sign.
- The prediction is what you knew at the time. Nothing recomputed later with a newer model or newer data.
- Extra columns are fine. They are ignored.
Comma or semicolon separators, decimal commas, a trailing %, Excel's byte-order mark, and DD-MM-YYYY or DD/MM/YYYY dates. Common column names are recognised: time, date, score, signal, forecast, fwd_return, actual, asset, symbol, close and others.
US-style MM/DD/YYYY dates (they would be read day-first), time-zone offsets (convert to UTC), and thousands separators such as 1.234,5. If your column names aren't recognised, rename them to the five above.
03Converting what you already have
Most providers don't keep data in this shape. This is how the common formats map onto it.
| You have | prediction | outcome | Notes |
|---|---|---|---|
| Model scores | The score as it was at that moment | Price change over the horizon, in % | The reference format. Nothing to convert. |
| Directional calls (LONG / SHORT) | +1 for long, −1 for short | Price change over the horizon from the moment the call was posted | Keep entry, take-profit and stop-loss as extra columns. |
| Calls with confidence levels | Level × direction, e.g. high long = +3, low short = −1 | As above | Lets us test whether your confident calls do better. |
| Probabilities | The probability, 0–1 or 0–100 | Price change over the next period | Don't convert to up/down; the number carries more. |
| Trade log with profit per trade | +1 / −1 from the side | Not the profit — the market move over a fixed horizon from entry | See below. |
| Forecasts outside markets | The forecast | The actual value, or its change | Set cost to 0. Groups can be stores, products, regions. |
Directional calls and win rates
A channel's “win rate” usually means “take-profit was hit before stop-loss”. That number depends as much on where the targets sit as on the call. With take-profit 1.2% away and stop-loss 4.5% away, random entries win about 79% of the time — and still lose money after fees. We therefore test direction over a fixed horizon, and report your own win-rate definition separately next to it.
If you only have the posted calls (time, coin, side), send those and say so.
Trade logs
A profit figure mixes the prediction with holding time, exits and fees, and every trade is held for a different length of time. Send entry time, instrument and side instead, so the move over a fixed horizon can be computed. If every trade was held for exactly the same period, the market move is the profit for a long and minus the profit for a short, before fees.
Excel
Save as “CSV UTF-8”: one sheet, the header in the first row, and no totals or notes below the data. European number formats are fine.
A call log ready to test, horizon 1 day:
timestamp,asset,side,prediction,entry,take_profit,stop_loss,outcome
2026-03-01 21:20,XRP,SHORT,-1,0.549065,0.542476,0.573773,1.6822
2026-03-02 00:30,LINK,LONG,1,12.773683,12.926967,12.198867,4.8185
04When a dataset can be tested
A file is accepted for a report when it meets every line below. It will run with less, but the report could only say “too little data to tell”.
| Criterion | Minimum | Why |
|---|---|---|
| Complete record | Every prediction in the period, none removed or added later | A filtered record tests the filter, not the predictions. |
| Recorded before the outcome | Some evidence the prediction existed at its timestamp | Without it, the report states that the data is self-reported. |
| Rows | 30 to run at all; a few hundred independent observations to conclude | Below that, the noise floor is too wide to tell an edge from luck. |
| Period | About two months or more, including rising and falling markets | One market direction can make a long bias look like skill. |
| Distinct predictions | At least 10 different values, or clean +1 / −1 | A few repeated values can't be ranked. |
| Horizon | One, stated in advance | Picking the best horizon afterwards is hidden cherry-picking. |
| Size | Quick Check: 10 MB and 100,000 rows. Report: up to 500,000 rows | For larger files, send a sample first. |
Independent observations are fewer than rows
A 4-hour outcome recorded every 15 minutes overlaps the next 15 rows, so 16 rows carry about one observation's worth of information. Coins that move together count as less than one each: eight major coins at the same moment are worth roughly 1.4 independent observations, not 8. The report shows the effective count and uses it in every test.
As a rule of thumb the noise floor is 2 / √(effective observations). With 400 effective observations it is 0.10; to show a correlation of 0.05 you need about 1,600.
Evidence of timing, strongest first
- A public record that cannot be edited: exchange copy-trading history, a hash-chained log, a Telegram channel's message sequence.
- A timestamped record held by a third party: emails, a notarised hash.
- Your own database export.
We note in the report which kind we had.
05Common mistakes
The worst errors produce excellent results, so they are checked before any statistics.
| Mistake | How it shows up | Fix |
|---|---|---|
| Outcome is the move before the timestamp | Every test passes with a very strong correlation. The report's alignment check marks it as invalid when a price column is included. | Compute the outcome from the timestamp forward. |
| Predictions recomputed afterwards | A correlation above about 0.2 is flagged as unusually strong for a market. Statistics alone can't prove it. | Send what was recorded at the time. |
| Losing calls removed | Invisible in the numbers. Gaps in the timeline and missing message numbers are not. | Send the full record. |
| Duplicated rows | Flagged; the sample looks larger and every test too generous. | One row per group per timestamp. |
| Latest rows without an outcome | Dropped and counted in the report. | Fine to leave in, or cut where outcomes end. |
| Profit per trade as outcome | Results reflect targets and exits, not direction. | Use the market move over a fixed horizon. |
| Mixed horizons in one file | Results blur towards noise. | One file per horizon. |
| Local time with summer time | One-hour shifts and duplicates at the clock change. | Convert to UTC. |
| Higher prediction means “down” | The report calls the signal inverted. | Flip the sign, or tell us. |
06Before you send
- One CSV, header row first, one row per prediction
- Columns timestamp, prediction and outcome — plus group and price if you have them
- Timestamps in UTC, when the prediction was made
- Outcome measured forward from the timestamp, over one fixed horizon
- Every prediction in the period, nothing removed or added afterwards
- No duplicated rows
- The file runs in Quick Check without errors
- Claim, horizon and round-trip cost written down
- A note on how the predictions were recorded at the time