Quant for Free
Home / Analysis / Kronos Profit Without an Edge
Strategy teardown · Kronos · method only

A Profit Without an Edge — Kronos Forecasts vs a Random Walk

A faithful port is not a forecast. Muhammad Minhas Qamar's Foundation Models for Trading (Part III) (MQL5 24221, 12 Oct 2026) finishes a native MQL5 port of the Kronos forecaster, proves it matches PyTorch, then asks the harder question on EURUSD H1: does it beat doing nothing? The author's own answer is no — and the useful part is not the no. It is the small profitable backtest that follows, and the two plain checks that take it apart. This page locks that result as the source reports it. It is not a Quant for Free clean-room run, and it is the practical sibling of Look-Ahead Bias in Pretrained Forecast Models, not a repeat of it.

summary.json not yet — no clean-room run. No site Sharpe, Deflated Sharpe, hit rate, or trade count is attached, because none was produced here. Every number below is the source's own reported result, quoted as such. A publishable Analysis version with our own stats would need a checked summary.json first; that is not done here.

1 / What the object actually is

The dump is the discipline. One script walks history once and writes forecasts to a file; a second script scores them with no trading; an EA reads the same file in the Strategy Tester. The model runs once, so no downstream step can quietly change what it predicted. Decoding is greedy (one deterministic path), not the sampled-and-averaged mode the chart EA and the reference use — the author states that caveat up front and does not claim the two were separately verified.

Setup as printed: EURUSD H1, context 256 bars, horizon 16 bars, evaluation window 2025-04-01 to 2025-06-01, every bar, yielding 947 forecasts (about five seconds each, about an hour and a quarter total, per the author). Context is the L closed bars ending at the evaluation bar; forecasts cover t+1..t+16; realized closes are stored in the same row for scoring only, and the trading EA discards those columns as it parses. The first forecast is keyed 2025-04-04, not 04-01, because the padding is counted in calendar seconds and weekends remove bars — too little history is the safe direction, the author notes: a bar without a full context is skipped.

Two honest caveats travel with the setup. Volume and amount do not exist on a retail FX feed, so two of Kronos's six inputs are manufactured from tick volume and tick_volume × typical price — a distribution the model never saw in training. And future timestamps are projected as last_time + (i+1) × PeriodSeconds, which fails across weekends: 115 of 947 forecasts cross a weekend, and the other 832, scored alone, are still worse than no-change at every horizon (author's check). The projection does not decide the result.

Score 1 — error against a random walk. Per horizon, RMSE and MAE of Kronos's cumulative return versus the realized return, divided by the same error for a no-change forecast. Below 1.0 would mean Kronos wins. The author's table: the ratio is above 1.0 at every horizon 1–16, on both metrics — narrow band about 1.07–1.13 from 1 to 10 bars (least bad 1.071 RMSE skill at 7 bars), then climbing to 1.403 RMSE / 1.250 MAE at 16 bars. Directional accuracy is 51.83% overall across 15,121 scored predictions, but realized up-moves were 53–54% at horizons 1–9, so always calling "up" would have beaten the model at every one of those horizons; only from 11 bars out, where the up share falls near 50%, does the model edge ahead by 1.5–3.3 points (author's reading).

Uncertainty. A moving-block bootstrap (2,000 resamples, blocks of 24 forecasts) keeps the overlap — neighbouring 16-bar forecasts share 15 bars. As reported: at every horizon the RMSE skill ratio's 95% interval lies entirely above 1.0, and no horizon has more than 0.8% of resamples below 1.0. The directional interval is the opposite story: overall 51.83% carries a 95% interval of 47.47% to 56.38%, corresponding to about 503 effective independent predictions, not 15,121. No evidence of directional skill is a weaker statement than proof of a coin flip, and the author says so.

Score 2 — a deliberately trivial trading rule. Long/short if the 16-bar forecast return exceeds a threshold, hold for the horizon or until the signal flips, no stops or filters, "Open prices only", $10,000, 0.1 lot fixed. Thresholds are placed by the model's own output distribution: 69.6% of forecasts predict a move above 0.1%; only 5.2% above 0.6%. Author's tester table, after costs:

Metric (author's run) 0.6% threshold 0.1% threshold
Trades 8 133
Net before costs −$73.60 +$220.20
Net after costs −$85.92 +$89.59
Profit Factor 0.61 (text also gives 0.66 pre-cost context) 1.05
Profitable trades 50.00% 45.86%

Two checks take the "modest success" apart, in the author's own numbers. First, spread: +$220.20 over 133 trades is $1.66 per trade against a per-trade standard deviation of $40.29 — t ≈ 0.47; resampling the trades gives zero-or-worse in about 31% of resamples. Second, direction split: the 68 long trades made +$328.70; the 65 short trades lost −$108.50, while EURUSD rose about 3.7% (roughly 1.094 → 1.135) over the window. Commission and swap took $130.61, about 59% of the pre-cost profit. Eleven orders were rejected [Market closed] on the 00:00 tick in the fair run; because the EA reads position state from the terminal rather than a shadow flag, each rejection simply left it where it was.

2 / What it does not claim — and where it fails

3 / How a reader could tear it down next

Not a signal. A next attempt, still untested here:

  1. Ask the three drift questions of any profitable forecast backtest, in this order. What would it have made without the model (always-up / always the majority direction)? What is mean-per-trade divided by per-trade standard deviation, and the trade count? What is the long/short split of the profit against the instrument's move over the window? The Kronos fair run fails all three in the author's own numbers; a candidate that passes them has earned the next test, not a deployment.
  2. Score the forecast before you trade it. Per-horizon error against no-change, plus directional accuracy against the majority-class baseline (not 50%), with a block bootstrap whose block length respects the horizon overlap. Overlapping forecasts counted as independent is the easiest way to manufacture a narrow interval.
  3. Keep the dump/score/trade separation. Forecasts written once, scored by a program that never trades, traded by a program that structurally cannot read the realized columns. Look-ahead that is hard to commit beats look-ahead you promised not to commit — including the quiet off-by-one where the context ends at t−1 and every horizon is scored one bar out of step.
  4. Pre-register the kinder retest before running it. If daily bars with real volume are the fair follow-up, write the instrument, timeframe, window, and baselines down first, and report it beside this negative result rather than instead of it. That is the author's own rule, and it is the correct one.
  5. Only then a gauntlet. A threshold/horizon grid searched on these forecasts is a new multiplicity problem: deflate it (Deflated Sharpe) and keep the outer segment strictly causal (Impossible Trinity). That summary.json does not exist yet.

4 / Verdict

The port is faithful and, on this evidence, the forecasts carry no edge: worse than no-change at every horizon with intervals above the baseline, direction indistinguishable from the majority call at short horizons, and a profitable backtest whose profit is noise plus the long side of a rising market. That is not a dead end for foundation-model forecasters — it is a priced list of what to change first (domain-matched timeframe, real volume, a pre-registered retest) and a reusable habit that costs nothing: count the trades, compare the mean with the spread, split by direction. Verify fidelity and market value separately. A profit is not an edge.

Source

Numbers

From the article, not from a Quant for Free run: context 256, horizon 16, 947 forecasts, 15,121 directional samples (23 flat realized + 8 flat forecasts skipped), directional accuracy 51.83% (95% interval 47.47–56.38%, ≈503 effective), RMSE skill 1.071–1.403 and MAE skill 1.088–1.250 across horizons 1–16, weekend-crossing forecasts 115/947, bootstrap 2,000 × block 24, thresholds 0.1% (69.6% of forecasts above) and 0.6% (5.2% above), fair run 133 trades / +$220.20 before costs / +$89.59 after / PF 1.05 / $1.66 mean vs $40.29 SD / t 0.47 / ≈31% of resamples ≤ 0 / longs +$328.70 (68) vs shorts −$108.50 (65) / EURUSD ≈ +3.7% over the window / commission+swap $130.61 / largest win $105.75, largest loss −$272.89 / 11 [Market closed] rejections; high-threshold run 8 trades / −$85.92 after costs. EURUSD levels ≈1.094 → 1.135 are the author's "about" figures. No site numbers. summary.json: none.

Educational analysis, not investment advice. A methodology note of a publicly documented source — not a recommendation to trade or avoid any instrument, script, parameter set, or workflow. This page does not report a Quant for Free clean-room backtest and does not attach a summary.json. Figures in the text are the source’s, labeled as such. See the full disclaimer.