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
Чынчыл терс натыйжа: он миңдеген бэктест, беш ири монета, туруктуу артыкчылык жок
Издөө жана оверфиттинг багытындагы макалалардын жыйынтыктоочусу — жана ал терс натыйжа менен бүтөт, ал эми бул туура натыйжа. ETHUSDT боюнча бир символдук, кош таймфреймдүү издөө үлгүдөн тышкары +16.35% жана тийбеген холдаутта +2.62% берген конфигурацияны тапты; ~37,000 сыноону эске алган Дефляцияланган Шарп коэффициенти аны 0.00гө чейин дефляциялады. Беш ири монета боюнча (ETH/BTC/SOL/BNB/XRP, ар бири ~1.18 млн 1 мүнөттүк бар) үлгүдөн тышкаркы медиана менен тандаган инструменттер аралык текшерүү аны биротоло жокко чыгарды: кош таймфрейм DSR 0.24 / PBO 0.264, үч таймфрейм DSR 0.14 / PBO 0.327 — экөө тең гейттерден өтпөйт. Чемпион 5 символдун 1инде гана кирешелүү, калгандарында терс. Оверфиттингге каршы аппарат так ушул үчүн бар: шумдун эң мыктысын альфа катары ишке чыгарып жибербешиң үчүн.
Multi-Timeframe Backtest'терде Look-Ahead Жоктугун Далилдөө: Келечекти Бузуп, Өткөндүн Аны Көрө Албастыгын Далилде
Multi-timeframe backtest'тер келечекти агызып жиберет — себеби али калыптанып жаткан жогорку timeframe bar'ынын акыркы close'у азырынча жок. Ишенимге код-ревью аркылуу жетүүгө болбойт, аны текшерүү керек. Биз live боттун closed-bar эрежесин так кайра жаратып, андан кийин shifted-future probe менен агуу жоктугун далилдейбиз: ар бир келечектеги bar'ды бузуп, ар бир өткөн сигнал жана trade bitwise өзгөрбөгөнүн ырастайбыз. 25тен 25 parity текшерүүсү өттү, жана probe чын эле иштейт.
GPU качан өзүн актайт: параметр сыдыруунун roofline модели, же жарнамалык 167x чындыгында — 27x алгоритм менен 6.2x жабдыктын көбөйтүндүсү
GPU-нун CPU-дан озуусу топтомдун өлчөмү менен өсөт — биздин көп таймфреймдүү индикаторлорду алдын ала эсептөөдө чакырыгына бир комбинацияда 54.5x болсо, 61 комбинацияда 359.6x-ке жетет — анткени кичине сыдыруу ядрону ишке киргизүү жана маалымат ташуу үстөк чыгымын амортизациялай албайт. Биз жарнамалык 167x-ти CPU-га да жардам берген 27x алгоритмдик утушка жана 6.2x жабдык утушуна ажыратабыз, GPU менен эң мыкты CPU ортосундагы чыныгы озуу бир таймфреймде болгону 3.2x, көп таймфреймде 6.2x экенин көрсөтөбүз жана GPU сатып алганга татышы үчүн сыдыруу канчалык кенен болушу керектиги боюнча чечим колдонмосун беребиз.
GPU тактыгынын тузагы: Apple Metal үстүндөгү fp32 бэктест кантип үнсүз таштанды кайтарат
Apple'дын Metal GPU'сунда float64 жок. Векторлоштурулган бэктестти ага акылсызча которсоңуз, азгырган prefix-sum WMA fp32'ни толуп кетирет — максималдуу салыштырма ката 211× — бирок ал баары бир иштеп, ынанымдуу көрүнгөн сандарды кайтарат. Чечим — көбүрөөк тактык эмес; бул башка формулировка: түз терезелик convolution, fp32 үчүн 8×10⁻⁷ чейин коопсуз жана бир агымдуу numba'дан 55.9× тезирээк. Тузак, арифметика жана сиз ага түшпөгөнүңүздү кантип далилдөө керек.
Тактык дарбазасы: арзан прокси кымбат баалоо сыяктуу эле рангдабаса, ириден майдага бектестинг сизди тезирээк алдайт
Тереңдетип издөө / көп тактыктуу издөө (ASHA, ырааттуу жарымдоо, Hyperband) миңдеген конфигурацияны арзан баада иргеп, аман калгандарын гана кымбат толук баалоого өткөрөт. Бул чындыгында ылдамдатуу берет — бирок төмөн тактыктагы рангдоо жогорку тактыктагыдан айырмаланса, унчукпай кыйрап калат. Биз фолддор боюнча ранг корреляциясын өлчөдүк: бир фолддо Спирмендин ρ 0.03 болушу мүмкүн (дээрлик кокустан рангдайт), фолддор көбөйгөн сайын 0.43, 0.67, 0.78, 0.91гe чейин өсөт. Чечими — милдеттүү бир дарбаза: адегенде ρ(арзан, толук) өлчөп, андан кийин минималдуу тактыкты ρ ≥ 0.5 болгон биринчи тепкичке чейин автоматтык түрдө көтөрүү.
Кокустук издөө vs Акылдуу издөө: Кесилиш чекити — баалоо наркы, алгоритм эмес
Бир бэктест арзан болгондо, акылсыз аралаштырылган (scrambled) Sobol таза өткөрүү жөндөмдүүлүгү (throughput) боюнча жеңип чыгат — акылдуу сэмплерлер (TPE, CMA-ES, ASHA) Python'догу ask/tell салыгын төлөйт, бул аларды 20 эсеге жайлатат, ошондуктан алар бирдей wall-clock убакытында бир топ аз чекитти баалайт жана уттурат. Ар бир баалоону кымбат кылсаңыз (multi-TF + walk-forward фолддору), кесилиш чекити тескерисинче которулат. Биз эки режимди тең өлчөдүк жана эмне үчүн фолд-рэнк тактыгы (ρ@1 0.03дон 0.43кө чейин өсүп) кыркуунун (pruning) өзүн актоосу үчүн алгышарт болорун аныктадык.
Эки октуу параметр мейкиндиги: эмне үчүн сиздин издөөнүн көпчүлүгү дээрлик акысыз болушу керек
Бардык параметрлер издөө үчүн бирдей баа турбайт. Стратегиянын параметрлери кымбат окко (индикаторлор — бүт сериянын үстүнөн кайра эсептелет) жана арзан окко (чечим босоголору — алдын ала эсептелген сигналдардын үстүнөн O(n) өтүү) бөлүнөт. Индикаторлор босогого көз каранды эмес болгондуктан, сиз аларды бир жолу эсептеп, миңдеген босого конфигурацияларын ~5 600 cfg/s ылдамдыкта издейсиз — ар бир конфигурация үчүн кайра эсептөөгө караганда болжол менен 1 600 эсе арзан. Өлчөмдүүлүктүн каргышын кайра баалоо.
Фреймворк салыгы: качан сиздин backtest китепканаңыз жөнөкөй pandas циклинен жайыраак болот
Биз сегиз backtest кыймылдаткычын бирдей параметр свипинде салыштырдык — 150k бар, 80 HMA-cross комбинациясы, сооданын саны 2707де бирдей кулпуланган. Эң популярдуу эки окуяга негизделген фреймворк колдо жазылган pandas циклинен да жайыраак чыкты, ал эми векторлоштурулган/компиляцияланган кыймылдаткыч ошол эле ишти ~13,000× тезирээк аткарды. Популярдуу китепканалар эч качан амортизациялоого арналбаган ар бир бар үчүн жүктөмдүн изилдөөсү.
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
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?
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
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.