Eugen Soloviov

Eugen Soloviov

Trading-systems engineer

Trading-systems engineer building bots since 2017: cross-exchange arbitrage (connected up to 30 venues), cointegration-based pairs arbitrage across spot and futures, scalping, news and sentiment-driven strategies, trend algorithms, and portfolio management and balancing algorithms. Also builds sub-millisecond order execution, big-data warehouses, backtesting engines, AI agents, and trading interfaces (incl. open-source profitmaker.cc). Stack: JS/TS, Python, Rust/Zig/Go, DevOps, backend, frontend, architecture.

Articles

Das ehrliche Negativergebnis: Zehntausende Backtests, fünf Majors, kein robuster Edge

Das ehrliche Negativergebnis: Zehntausende Backtests, fünf Majors, kein robuster Edge

Der Höhepunkt des Such-und-Overfit-Bogens, und er endet mit einem Negativergebnis — dem korrekten. Eine Einzelsymbol-Suche über zwei Zeitfenster auf ETHUSDT fand eine Konfiguration mit +16,35% out-of-sample und +2,62% auf einem unberührten Holdout; die Deflated Sharpe Ratio, die ~37.000 Trials berücksichtigt, deflationierte sie auf 0,00. Ein instrumentenübergreifender Durchlauf über fünf Majors (ETH/BTC/SOL/BNB/XRP, je ~1,18 Mio. 1m-Bars), ausgewählt nach dem Median out-of-sample, erledigt sie endgültig: Dual DSR 0,24 / PBO 0,264, Triple DSR 0,14 / PBO 0,327 — beide scheitern an den Gates. Der Champion ist auf 1 von 5 Symbolen profitabel und auf dem Rest negativ. Genau dafür ist der Anti-Overfit-Apparat da: um zu verhindern, dass man das Beste aus dem Rauschen als Alpha ausliefert.

Der Beweis gegen Look-Ahead in Multi-Timeframe-Backtests: Die Zukunft stören, um zu beweisen, dass die Vergangenheit sie nicht sehen kann

Der Beweis gegen Look-Ahead in Multi-Timeframe-Backtests: Die Zukunft stören, um zu beweisen, dass die Vergangenheit sie nicht sehen kann

Multi-Timeframe-Backtests lassen die Zukunft durch eine sich noch bildende Bar eines höheren Zeitrahmens durchsickern, deren endgültiger Schlusskurs noch gar nicht existiert. Man kann sich Vertrauen nicht durch Code-Review erarbeiten — man muss es testen. Wir reproduzieren die Closed-Bar-Regel des Live-Bots exakt und beweisen dann die Abwesenheit von Leckage mit einer Shifted-Future-Probe: Wir stören jede zukünftige Bar und weisen nach, dass jedes vergangene Signal und jeder vergangene Trade bitgenau unverändert bleibt. 25 von 25 Paritäts-Checks bestanden, und die Probe hat Biss.

Wann sich die GPU lohnt: Die Parameter-Sweep-Roofline, wo eine 167x-Schlagzeile in Wahrheit 27x Algorithmus mal 6.2x Hardware ist

Wann sich die GPU lohnt: Die Parameter-Sweep-Roofline, wo eine 167x-Schlagzeile in Wahrheit 27x Algorithmus mal 6.2x Hardware ist

Der Vorsprung der GPU vor der CPU wächst mit der Batch-Größe — von 54.5x bei einer Kombination pro Aufruf bis 359.6x bei 61 auf unserem Multi-Timeframe-Indikator-Precompute — weil ein kleiner Sweep den Kernel-Launch- und Transfer-Overhead nicht amortisieren kann. Wir zerlegen eine 167x-Schlagzeile in einen algorithmischen 27x-Gewinn, der auch der CPU hilft, und einen 6.2x-Hardware-Gewinn, zeigen, dass der wahre Vorsprung GPU vs. beste CPU nur 3.2x single-timeframe und 6.2x multi beträgt, und geben einen Entscheidungsleitfaden, wie breit ein Sweep sein muss, bevor sich der Kauf einer GPU lohnt.

Die GPU-Präzisionsfalle: Wie ein fp32-Backtest auf Apple Metal lautlos Datenmüll zurückgibt

Die GPU-Präzisionsfalle: Wie ein fp32-Backtest auf Apple Metal lautlos Datenmüll zurückgibt

Apples Metal-GPU kennt kein float64. Portiert man einen vektorisierten Backtest naiv darauf, läuft die verlockende Prefix-Sum-WMA in einen fp32-Overflow – maximaler relativer Fehler 211× – und trotzdem läuft sie durch und liefert plausibel aussehende Zahlen. Die Lösung ist nicht mehr Präzision, sondern eine andere Formulierung: eine direkte Fenster-Faltung, fp32-sicher bis auf 8×10⁻⁷ und 55,9× schneller als Single-Thread-Numba. Die Falle, die Arithmetik dahinter, und wie man beweist, dass man nicht hineingetappt ist.

Das Fidelity-Gate: Grob-zu-fein-Backtesting täuscht dich schneller – es sei denn, der billige Proxy rankt genauso wie die teure Auswertung

Das Fidelity-Gate: Grob-zu-fein-Backtesting täuscht dich schneller – es sei denn, der billige Proxy rankt genauso wie die teure Auswertung

Drill-Down- / Multi-Fidelity-Suche (ASHA, Sukzessive Halbierung, Hyperband) screent Tausende Konfigurationen billig und befördert nur die Überlebenden zur teuren vollständigen Auswertung. Das ist eine echte Beschleunigung – aber sie bricht lautlos zusammen, wenn das Low-Fidelity-Ranking dem High-Fidelity-Ranking widerspricht. Wir haben die Fold-Rangkorrelation gemessen: Bei einem Fold kann Spearman ρ bei 0.03 liegen (rankt fast zufällig), steigend auf 0.43, 0.67, 0.78, 0.91, je mehr Folds hinzukommen. Die Lösung ist ein verpflichtendes Gate – zuerst ρ(billig, voll) messen und die Mindest-Fidelity automatisch auf die erste Stufe anheben, bei der ρ ≥ 0.5 gilt.

Random Search vs. intelligente Suche: Der Crossover liegt an den Eval-Kosten, nicht am Algorithmus

Random Search vs. intelligente Suche: Der Crossover liegt an den Eval-Kosten, nicht am Algorithmus

Wenn ein Backtest billig ist, gewinnt dummes, verwürfeltes Sobol beim reinen Durchsatz — intelligente Sampler (TPE, CMA-ES, ASHA) zahlen eine Python-Ask/Tell-Steuer, die sie um das 20-fache ausbremst, sodass sie bei gleicher Wall-Clock-Zeit weit weniger Punkte auswerten und verlieren. Macht man jede Auswertung teuer (Multi-TF + Walk-Forward-Folds), kippt der Crossover. Wir haben beide Regime gemessen — und warum Fold-Rang-Fidelity (ρ@1 steigt von 0.03 auf 0.43) die Voraussetzung dafür ist, dass sich Pruning überhaupt auszahlt.

Der zweiachsige Parameterraum: Warum der Großteil Ihres Sweeps nahezu kostenlos sein sollte

Der zweiachsige Parameterraum: Warum der Großteil Ihres Sweeps nahezu kostenlos sein sollte

Nicht jeder Parameter kostet gleich viel bei der Suche. Die Parameter einer Strategie teilen sich auf in eine teure Achse (Indikatoren — über die gesamte Zeitreihe neu berechnet) und eine billige Achse (Entscheidungsschwellen — ein O(n)-Durchlauf über vorberechnete Signale). Weil Indikatoren gegenüber Schwellen invariant sind, berechnen Sie sie einmal und durchlaufen Tausende von Schwellenkonfigurationen mit ~5.600 cfg/s — etwa 1.600-mal billiger als eine Neuberechnung pro Konfiguration. Eine Neubewertung des Fluchs der Dimensionalität.

Die Framework-Steuer: Wenn deine Backtest-Bibliothek langsamer ist als eine naive Pandas-Schleife

Die Framework-Steuer: Wenn deine Backtest-Bibliothek langsamer ist als eine naive Pandas-Schleife

Wir haben acht Backtest-Engines auf einem einzigen identischen Parameter-Sweep gemessen — 150k Bars, 80 HMA-Cross-Kombinationen, mit auf 2707 fixierter Trade-Anzahl-Parität. Zwei der beliebtesten ereignisgesteuerten Frameworks liefen langsamer als eine handgeschriebene Pandas-Schleife, während eine vektorisierte/kompilierte Engine dieselbe Arbeit rund 13.000× schneller erledigte. Eine Untersuchung des Overheads pro Bar, den beliebte Bibliotheken nie amortisieren sollten.

The Probability of Backtest Overfitting: Did Your Search Beat a Coin Flip?

The Probability of Backtest Overfitting: Did Your Search Beat a Coin Flip?

The Deflated Sharpe Ratio prices the winning strategy; PBO prices the search that picked it. Combinatorially Symmetric Cross-Validation runs C(16,8) = 12,870 train/test splits over a 1000x200 performance matrix and asks: does the in-sample winner land in the bottom half out of sample? The catch almost everyone misses — PBO's null is 0.5, not 1. On 200 zero-edge strategies the best in-sample annualized Sharpe of 1.98 collapses to 0.06 out of sample and PBO = 0.476: a coin flip, fully overfit. Plant a real edge (annualized Sharpe 2.38) and PBO drops to 0.001, the in-sample 3.73 surviving to an out-of-sample 2.34. A moving-average grid on a pure random walk has no out-of-sample skill either — PBO 0.463 averaged over 60 matrices, statistically indistinguishable from the null — and on one representative matrix the mirage is vivid: a best in-sample Sharpe of 2.33 collapses to a median out-of-sample -0.22, PBO 0.573, a 63% chance of a loss.

The IPC Tax: Put the Backtest Engine Behind a Socket and Lose 13% — Almost None of It to the Socket

The IPC Tax: Put the Backtest Engine Behind a Socket and Lose 13% — Almost None of It to the Socket

We ported a numba backtest kernel line-for-line to Rust and called it across a process boundary four ways, with an equivalence gate confirming identical PnL to the last trade. Shipping the entire 1.2 MB price series through a Unix socket costs ~2 ms — about 0.1% of the job. JSON-encoding the same payload costs 1348x more than raw bytes, chatty per-combo calls re-ship the data 80 times, and a per-bar call pattern would pay 2.1 s of pure IPC on a 2.0 s job. The boundary is cheap; the tax is in how you cross it.

The Deflated Sharpe Ratio: How Many of Your Backtest 'Winners' Survive Multiple Testing?

The Deflated Sharpe Ratio: How Many of Your Backtest 'Winners' Survive Multiple Testing?

A parameter search is a machine for manufacturing luck. On pure noise — 1,000 strategies with zero true edge — the best annual Sharpe averages 1.63 and the naive significance test flags a discovery 100% of the time. We build controlled ground truth and show that the Deflated Sharpe Ratio, the Harvey-Liu haircut, and White's Reality Check restore honesty: false discoveries drop from 1.000 to 0.001-0.057, genuine edges above the noise ceiling are kept with power ~1 — and one real trap (correlated grids) where the raw DSR over-deflates and the verdict must be read across a whole band of effective-trial estimates, not one.

Objective-Function Design: The Metric You Optimize Secretly Picks Your Strategy

Objective-Function Design: The Metric You Optimize Secretly Picks Your Strategy

To search for the 'best' strategy you must first define 'best' — and that scalar silently chooses the winner. On synthetic data with a known edge (600 seeds, T=2000, 80 thresholds), a naive per-trade Sharpe crowns a lottery: it picks a sub-5%-exposure winner in 56% of seeds and degenerates in 57% — on the starkest seed, 8 trades posting an in-sample Sharpe of 21.09 that collapses to 0.13 out of sample. The honest repair is almost dull: measure on the full timeline, which never degenerates (out-of-sample 1.71). A trade-count (conf_k) shrinkage and an exposure floor can retrofit a per-trade metric, but even fully repaired they only match full-timeline Sharpe (1.70 vs 1.71) — never beat it. Goodhart's law, in a backtest, with controlled ground truth.