26. září 2026 · výzkum

Pokusili jsme se zreprodukovat backtest strategie. Tady se čísla rozcházela.

Pokusili jsme se zreprodukovat backtest strategie. Tady se čísla rozcházela.

Znovu jsme spustili uložený backtest a dostali jinou kapitálovou křivku. Stejný kód strategie, stejné období, stejný symbol. Konečný zůstatek se lišil o 1.8 % a tři obchody se posunuly o 1 svíčku.

To stačí k tomu, aby se výsledkům výzkumu těžko důvěřovalo. Pokud kolega, vaše budoucí já nebo služba paper tradingu nedokáže běh zopakovat, nepoznáte, jestli změna strategii zlepšila, nebo jen změnila experiment. Tady je postup, kterým jsme zdroj odchylky našli.

Den 1: Sepsali jsme, co znamená „stejný běh“

Naší první chybou bylo považovat soubor strategie za celý experiment. Nebyl. Běh závisel také na vstupních datech, verzi enginu, kalendáři, metadatech instrumentu a nastavení provádění obchodů. Kód popisoval jen jednu část výpočtu.

Než jsme cokoli změnili, vytvořili jsme manifest běhu. Zaznamenali jsme commit strategie, identifikátory snímků dat, období, burzu, sazebník poplatků, zdroj financování, model plnění a verze softwaru. Uložili jsme také výsledné příkazy a plnění, protože samotná kapitálová křivka neukáže, kde se běhy začaly rozcházet.

ArtefaktCo zaznamenatProč je to důležité
Tržní dataID snímku, verze schématu, úpravyDodavatelé opravují historii a revidují korporátní akce
Provádění obchodůÚroveň poplatků, řada funding sazeb, nastavení plnění a dopaduVýchozí hodnoty a předpoklady o účtu mění výsledky
Prostředí běhuCommit kódu, verze enginu a závislostíKnihovny mohou změnit pořadí, zaokrouhlování nebo indikátory
VýstupPříkazy, plnění, pozice a metrikyUkazuje, kde se běhy začínají rozcházet

Den 2: Porovnávali jsme obchody, ne Sharpe

Souhrnné metriky nás odváděly od podstaty. Oba běhy měly téměř stejný Sharpe, ale protokoly plnění ukázaly první nesoulad při vypořádání funding sazby. Jeden běh zaúčtoval sazbu k pozici otevřené v okamžiku vypořádání; druhý použil pozici po rebalancování v daném časovém okamžiku.

Kód strategie se nezměnil. Změnilo se pořadí událostí v enginu. Menší aktualizace verze pořadí výslovně určila, zatímco dříve záviselo na tom, jak se dvě události náhodou seřadily.

Smlouvu běhu jsme upravili tak, aby pořadí stanovila: nejprve aplikovat funding na pozici drženou do okamžiku vypořádání, potom zpracovat rozhodnutí strategie pro tento časový okamžik. Přesná konvence se může lišit podle burzy a enginu. Chyba je nechat ji nevyřčenou.

Den 3: Ukázalo se, že „stejný“ datový soubor je jiný

Po zafixování pořadí událostí se zbývající nesoulady soustředily do několika akciových obchodů. Dodavatel opravil historickou úpravu po rozdělení akcií. Náš soubor měl stejný název i počet řádků jako předtím, a proto vypadal beze změny.

Teď každý neměnný snímek dat opatřujeme otiskem a ukládáme k němu také pravidla úprav. Hash nám řekne, zda se změnily bajty; nevysvětlí však proč. Proto manifest obsahuje i zdroj, čas získání a verzi transformace. U revidovaných dat jsou tyto údaje součástí výsledku.

Reprodukovatelný backtest musí odpovědět na otázku: „Kterou verzi minulosti viděl?“

Den 4: Našli jsme nenápadné výchozí nastavení

Posledním rozdílem byl maker poplatek nastavený na nulu, protože v konfiguraci strategie toto pole chybělo. Novější engine použil výchozí poplatek účtu. Tato jediná výchozí hodnota změnila hraniční obchody natolik, že vysvětlila většinu rozdílu v konečném zůstatku.

Důležitá ekonomická nastavení jsme uvedli výslovně a zajistili, aby engine vypsal výslednou konfiguraci do záznamu běhu. Výchozí hodnoty jsou při zkoumání praktické. Při porovnávání výsledků v čase ale představují slabý podklad.

3nalezené zdroje odchylek
1.8%počáteční rozdíl v konečném zůstatku
0hodnota samotné shody Sharpe

Čemu bychom se příště vyhnuli

Půl dne jsme strávili porovnáváním souhrnných metrik, než jsme se podívali na první rozdílné plnění. Tím nezačínejte. Seřaďte oba protokoly událostí podle časového razítka a porovnejte první odchylku; pozdější rozdíly často vyplývají právě z této jediné příčiny.

Vyhnuli bychom se také představě, že samotný obraz kontejneru zaručuje reprodukovatelnost běhu. Zafixuje velkou část softwarového prostředí, ale ne externí datový soubor, sazebník poplatků načítaný za běhu ani revidovanou historii dodavatele.

Když se backtest změní, uchovejte manifesty i protokoly obou běhů a potom opravujte vždy jeden zdroj odchylky. Užitečným výsledkem není jen křivka, kterou lze znovu vykreslit. Je to záznam vysvětlující, která data a předpoklady ji vytvořily a proč se příští běh může lišit.

reprodukovatelnostbacktestingdatové inženýrstvípaper trading
← Všechny články