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.18M 1m бар), іріктемеден тыс медиана бойынша таңдайтын кросс-инструменттік тексеру оны біржола жоққа шығарады: қос таймфрейм DSR 0.24 / PBO 0.264, үш таймфрейм DSR 0.14 / PBO 0.327 — екеуі де гейттерден өтпейді. Чемпион 5 символдың 1-інде ғана пайдалы, қалғандарында теріс. Анти-оверфит аппараты дәл осы үшін бар: шудың ең жақсысын альфа ретінде саудаға жіберуден сізді тоқтату үшін.
Мультитаймфреймдік бэктестерде келешекке қарамауды дәлелдеу: болашақты бұзып, өткеннің оны көре алмайтынын дәлелдеу
Мультитаймфреймдік бэктестер әлі толық қалыптаспаған жоғары таймфреймдік бардың соңғы жабылу бағасы арқылы болашақты сыздырады. Кодты тексеру арқылы сенімге жете алмайсыз — оны тестілеу керек. Біз тірі боттың жабық-бар ережесін дәл қайталап, содан кейін болашақты ығыстыратын сынақпен ағып кетуді жоққа шығарамыз: болашақтағы әрбір барды бұзамыз да, өткендегі әрбір сигнал мен мәміле бит-бітімен өзгермегенін растаймыз. 25/25 паритет тексерулері, әрі сынақтың нағыз тісі бар.
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 жоқ. Векторланған бэктесті оған аңғал көшірсеңіз, азғырғыш префикс-қосынды WMA fp32-ні асырып жібереді — максималды салыстырмалы қате 211× — бірақ ол бәрібір жұмыс істеп, шындыққа ұқсас сандар қайтарады. Шешім — көбірек дәлдік емес, басқа формулировка: тікелей терезелік конволюция, fp32-де 8×10⁻⁷-ге дейін қауіпсіз және бір ағынды numba-дан 55.9× жылдам. Қақпан, оның арифметикасы және оған түспегеніңізді қалай дәлелдеу керек.
Дәлдік қақпасы: егер арзан прокси конфигурацияларды қымбат бағалаумен бірдей ретте саралай алмаса, ірі-ден-нақтыға қарай бэктестілеу сізді тезірек алдайды
Тереңдете іздеу / көп дәлдікті іздеу (ASHA, бірізді жартылау, Hyperband) мыңдаған конфигурацияны арзан бағамен сүзіп, тек аман қалғандарын ғана қымбат толық бағалауға өткізеді. Бұл — шынайы жылдамдату, бірақ төмен дәлдіктегі сараптама жоғары дәлдіктегімен келіспесе, ол дыбыссыз құлайды. Біз фолд-ранг корреляциясын өлшедік: бір фолдта Spearman ρ 0.03-ке дейін түсуі мүмкін (конфигурациялар кездейсоқ дерлік сараланады), ал фолдтар көбейген сайын 0.43, 0.67, 0.78, 0.91-ге дейін өседі. Шешім — бір міндетті қақпа: алдымен ρ(арзан, толық) мәнін өлшеп, ең төменгі дәлдікті ρ ≥ 0.5 болатын алғашқы сатыға дейін автоматты түрде көтеру керек.
Кездейсоқ іздеу vs ақылды іздеу: кроссоверді алгоритм емес, бағалау құны анықтайды
Бір бэктест арзан болғанда, қарапайым scrambled Sobol таза өткізу қабілеті (throughput) бойынша жеңеді - ақылды сэмплерлер (TPE, CMA-ES, ASHA) Python ask/tell салығын төлейді, бұл оларды 20 есе баяулатады, сондықтан олар бірдей нақты уақытта әлдеқайда аз нүкте бағалайды да ұтылады. Әр бағалауды қымбат етіп жасаңыз (multi-TF + walk-forward фолдтары) - кроссовер керісінше өзгереді. Біз екі режимді де өлшедік, және неге fold-rank fidelity (ρ@1 0.03-тен 0.43-ке дейін өсуі) кесудің пайда әкелуінің алғышарты екенін көрсеттік.
Екі осьті параметрлер кеңістігі: неге іздеуіңіздің көбі дерлік тегін болуға тиіс
Барлық параметрлер бірдей іздеу құнын талап етпейді. Стратегия параметрлері қымбат оське (индикаторлар — бүкіл қатар бойынша қайта есептеледі) және арзан оське (шешім табалдырықтары — алдын ала есептелген сигналдар бойынша O(n) өту) бөлінеді. Индикаторлар табалдырықтарға тәуелсіз болғандықтан, оларды бір рет есептеп, мыңдаған табалдырық конфигурациясын шамамен 5,600 cfg/с жылдамдықпен аралап шығуға болады — бұл конфигурация сайын қайта есептеуден шамамен 1,600 есе арзан. Өлшемділіктің қарғысын қайта бағалау.
Фреймворк салығы: бэктест кітапханаңыз қарапайым pandas циклінен баяу болғанда
Біз сегіз бэктест қозғалтқышын бір бірдей параметр сканерлеуінде өлшедік — 150k бар, 80 HMA қиылысу комбинациясы, мәмілелер саны 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.