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.
| Artefakt | Co zaznamenat | Proč je to důležité |
|---|---|---|
| Tržní data | ID snímku, verze schématu, úpravy | Dodavatelé opravují historii a revidují korporátní akce |
| Provádění obchodů | Úroveň poplatků, řada funding sazeb, nastavení plnění a dopadu | Výchozí hodnoty a předpoklady o účtu mění výsledky |
| Prostředí běhu | Commit kódu, verze enginu a závislostí | Knihovny mohou změnit pořadí, zaokrouhlování nebo indikátory |
| Výstup | Příkazy, plnění, pozice a metriky | Ukazuje, 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.
Č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.
← Všechny články


