May isang tanong na iniiwasan ng bawat backtest: gagawin kaya ng parehong code ang parehong bagay kung live ang merkadong pinapakain dito? Hindi mo iyan masasagot sa pamamagitan ng mas maraming backtest. Masasagot mo lang iyan kung patatakbuhin mo ang estratehiya sa live na data na may totoong execution semantics, saka susuriin — kada trade — kung nagkakasundo ang dalawang mundo. Ginagawa namin ang tsek na ito araw-araw, awtomatiko, at ito ang pinakamabungang taga-hanap ng bug sa buong platform.
Unang araw: itayo ang salamin
Bawat na-promote na estratehiya ay tumatakbo sa sarili nitong nakahiwalay na live node, kumukonsumo ng totoong exchange streams: live quotes para sa fills, totoong spreads, totoong oras ng session. Walang shared state sa pagitan ng mga estratehiya (natutunan namin iyon sa mahirap na paraan — sa isang shared node, tumagas ang position queries ng isang estratehiya papunta sa iba). Bawat fill ay naitatala kasama ang signal value na nagbunsod nito.
Tuwing umaga: replay at diff
May araw-araw na job na kinukuha ang paper window ng bawat estratehiya, pinapatakbo ang eksaktong parehong code sa backtest engine sa parehong panahon gamit ang catalog data, at itinutugma ang mga fill nang isa-sa-isa: parehong side, parehong tolerance sa timestamp, parehong laki. Ang output ay hindi korelasyon o basta pakiramdam. Isa itong talahanayan: matched, paper-only, replay-only. Ang malusog na estratehiya ay nasa 54 sa 55 matched. Ang may sakit ay sasabihin sa iyo kung aling trade eksakto ang nag-iba at kailan.
Ano ang nasira, sa pagkakasunod ng pagkasira
- Warmup fills. Pinapakain ng live node ang kasaysayan para i-warm up ang mga indicator — at masayang nag-trade doon ang mga estratehiyang may custom bar handlers. Hindi kailanman nakita ng backtests ang mga multong entry na iyon. Ang ayos ay isang guard sa submission layer, hindi pag-aayos ng estratehiya, dahil kung hindi, mamamana ng bawat estratehiya ang bug.
- Sunod-sunod na multi-leg warmup. Isang cross-sectional na estratehiya ang nag-warm up nang isang instrumento sa bawat pagkakataon; bawat leg ay nakakita ng walang lamang kapatid at hindi kailanman na-initialize ang anchor. Sa live, wala itong ni-trade; sa replay, maayos ang trade. Zero matched trades — pero ang diff lang ang malakas na nagsabi niyon.
- Tick-precision crash loops. Ang live na aggTrade ticks ay dumarating sa ibang precision kaysa sa inaasahan ng sandbox instrument. Nag-crash-loop ang node sa isang assertion na kailanman ay hindi matatriger ng backtest, dahil naka-normalize na ang catalog bars.
- Amnesia sa restart. Ang mga restart ng proseso ay muling nagpapaputok ng entry logic sa mga posisyong umiiral na — para sa isang rebalancing na estratehiya, tahimik na naging rebalance ang isang restart. Sa live trading, hindi iyon isang talababa sa parity; iyon ay pulang bandila na may kalakip na pera.
Pansinin ang pattern: wala ni isa sa mga ito ang signal bug. Pawang mga bug sa hangganan ng execution — warmup, state, precision, restarts. Iyan mismo ang uri ng pagkabigo na estruktural na hindi nakikita ng backtests, dahil ang backtest engine mismo ang hangganan ng execution sa loob ng isang backtest.
Ang mga asimetriyang sinasadya naming panatilihin
Sinasadyang hindi magkapareho ang dalawang mundo. Sinisingil ng backtest ang isang modelong half-spread kasama ang square-root impact sa loob ng PnL; sa paper, binabayaran ang totoong spread sa presyo ng fill at walang impact model. Ang pagdagdag ng modelong spread sa paper (o ng totoo sa backtests) ay magiging dobleng bilang. Ang parity ay nangangahulugang parehong desisyon, parehong fills sa loob ng tolerance — hindi bit-identical na PnL. Ang pagkilala kung aling pagkakaiba ang may prinsipyo at alin ang bug ang halos buong disiplina na.
Ang backtest ay isang haka-haka. Ang paper trading ang eksperimento. Ang replay parity ang lab notebook na nakakahuli sa iyo kapag niloloko mo ang sarili mo.
Kung nagpapatakbo ka ng mga estratehiya at hindi mo naka-iskedyul ang pagdi-diff ng live na kilos laban sa nirereplay na kilos, may isang kategorya ka ng bug na hindi mo pa nakikita kailanman. Nakakahanap kami ng isa halos bawat dalawang linggo, at bawat isa ay hindi nakikita mula sa loob ng backtest.
← Lahat ng post
