Prax a overovanie

Backtest forexu v Pythone: identita, čas a účtovný stav

Overte priradenie Series, čas dostupnosti makrodát, posunutý signál, náklady a spoločnú maržu. Hypotetické modely a zachovaný Python príklad.

Abstraktná redakčná ilustrácia vytvorená AI k téme „Backtest forexu v Pythone: identita, čas a účtovný stav“. Nezobrazuje historické kurzy.
Redakčná ilustrácia vytvorená AI; nejde o snímku platformy ani historický cenový graf.

Forex a CFD s pákou môžu rýchlo viesť k strate. Vzdelávací obsah bez osobného investičného odporúčania.

V tomto článku

Po prečítaní dokážete…

  • Overíte zhodu identifikátorov príznakov a cenových záznamov.
  • Oddelíte dostupnú uzavretú sviečku, kandidáta, pokyn a plnenie.
  • Zosúladíte EUR maržu a konečný zostatok pri dvoch súbežných požiadavkách.

Vysvetlenie pojmov priamo v článku

Backtest: skúška pravidiel na historických údajoch Vykonanie pokynu Provízia za obchod Pokles od maxima: drawdown Stop loss Take profit (TP)

Backtest v Pythone potrebuje preukázateľný reťazec: dáta, vtedy dostupné informácie, pokyny, plnenia a zosúladenú evidenciu. Uchovajte čas aj identitu záznamu. Rýchlo vykreslená equity neodhalí neskoršiu revíziu, neuzavretú sviečku alebo cenu, ktorú model vykonania vôbec nedovoľoval.

Prostredie vyberte podľa výskumnej otázky

Tester MT5 podporuje viacmenové EA aj testovanie a optimalizáciu. Python preto nie je nutný únik z údajného obmedzenia na jeden pár. Umožňuje inak usporiadať dáta, vlastné výpočty a skúmanie. Porovnajte požiadavky na dáta, kontrakt a vykonanie. Rozdiely implementácií skúmajte na rovnakej zmrazenej sade a pravidlách.

Uložte dáta aj ich význam

Zaznamenajte nástroj a produkt, poskytovateľa, zónu, stranu kotácie, interval a rozsah sťahovania. Skontrolujte duplicitné identifikátory, poradie a medzery. Zatvorený trh nie je automaticky poškodený súbor; doplnením medzery môžete vymyslieť pozorovania. Uchovajte originál a kroky transformácie.

MetaTrader5 copy_rates_range vracia čas, OHLC, tickový objem, spread a reálny objem. Nie úplný historický sadzobník provízií a swapov. Rozsah závisí od dostupnej histórie a nastavení terminálu: požadovaný interval nie je potvrdený úplne vrátený interval. Časové argumenty aj údaje používajú UTC. Pre slovenské seansy preveďte konkrétny dátum do Europe/Bratislava až po správnom určení pôvodnej zóny.

pandas a NumPy pomáhajú s výpočtami. Backtrader má postup riadený udalosťami. Aj simulácia portfólia vectorbt mení stav peňazí a aktív; poskytuje režimy orders, signals a vlastnej order funkcie. Označenie knižnice negarantuje realizmus či pevný čas behu. Zvoľte primeraný rozsah, uložte verzie a skontrolujte licenciu, dátové práva aj prostredie. Dáta a nasadenie môžu mať samostatné náklady.

Odstránenie indexu môže pripojiť signál k inej sviečke

Pôvodný test má tri dokončené vymyslené cenové záznamy A=100, B=102, C=104. Samostatná Series príznakov je v poradí C:1, A:0, B:0. Jednotka označuje kandidáta na ďalšie modelovanie, nie pokyn ani cenu plnenia.

Štítok vyberie iný záznam než poradie poľa

Štítok vyberie iný záznam než poradie poľaCeny A 100, B 102, C 104 majú poradie A/B/C. Príznaky v poradí C/A/B majú hodnoty 1/0/0. Párovanie štítkov vyberie C 104. Násobenie polí bez ID vyberie prvý záznam A 100.Ceny podľa IDIné poradie príznakovA 100C 1B 102A 0C 104B 0Series: ID C → 104Bez ID: prvý riadok → 100Tie isté dáta vyberú rôzne záznamy.
Zelené spojenie zachováva identitu C. Prvá pozícia neoznačeného poľa nemá rovnaký význam.

Na malej obrazovke posúvajte diagram vodorovne alebo ho zväčšite. Vysvetlenie nájdete aj v texte.

pandas páruje Series podľa štítkov. prices * flags dá A:0, B:0, C:104. Prevod oboch Series na polia a násobenie podľa pozícií dá 100,0,0; priradenie k A/B/C urobí kandidáta z A. Pred to_numpy() kontrolujte ID, nielen rovnaké dĺžky. Aj správne priradenie vyžaduje kontrolu, kedy príznak vznikol.

Jedinečné ID a ľubovoľné vymyslené ceny bez nákladov či finančného výsledku. Násobenie príznakom ukazuje priradenie záznamu, nie celý backtest. Dokumentácia pandas opisuje automatické párovanie Series podľa štítkov.

Kedy sa záznam smie použiť?

Sviečka označená časom otvorenia ešte v tom okamihu nemá celé OHLC. H1 otvorená 10:00 má dokončené hodnoty až po konci hodiny. Pri prevzorkovaní v pandas closed určuje zahrnutý okraj intervalu a label jeho označenie. Zmenený štítok neposunie skutočný čas dostupnosti agregátu do minulosti.

Makroúdaj pripájajte podľa zverejnenia dostupnej verzie, nie iba mesiaca, ktorý opisuje. merge_asof potrebuje zoradené kľúče: backward vyberie skorší alebo rovnaký, nearest môže vybrať budúci. Ani jedno nerozpozná neskoršiu revíziu samo. Určte toleranciu aj poradie udalostí s rovnakým časom.

Pôvodný kontrolný príklad: rozhodnutie 10:04 UTC, uložené vydania 10:00 s hodnotou 50 a 10:05 s hodnotou 60. Bez tolerancie backward vyberie 50, štyri minúty dozadu. Nearest vyberie 60, iba minútu vzdialené, ale stále minútu v budúcnosti. Inkluzívna dvojminútová spätná tolerancia nenájde nič. Nedostupnosť zaznamenajte; bližší budúci údaj by zmenil informačnú sadu.

Samostatný príklad uzavretých sviečok má prvých 20 high 100 až 119; pri každej Open=High−0,5, Low=High−2, Close=High−1. Sviečka 21 má O120/H121/L118/C120,5; 22 má O120,6/H122/L119/C121. Sú to ľubovoľné čísla, nie trhové dáta ani forexový obchod.

previous_high = bars["high"].shift(1).rolling(20).max()
signal = bars["close"] > previous_high
next_bar_signal = signal.shift(1, fill_value=False)

Pri 21 je maximum predchádzajúcich 20 sviečok 119, takže 120,5 >119 je pravda. Zahrnutie aktuálneho High zvýši prah na 121 a podmienka nevyhovie. Posledný riadok presunie pozorovaný signál do 22. sviečky; nedodáva cenu plnenia, prijatie pokynu ani výstup. Počítajte z dokončených vstupov a zvlášť definujte objem, typ pokynu a poradie udalostí.

Signál, plnenie a náklady sú oddelené

Zdokumentovaný štandardný model Market v Backtraderi použije po spracovaní súčasnej sviečky Open nasledujúcej dostupnej sviečky. Iné nastavenia a modely môžu časovanie zmeniť. Overte aj sviečku obsahujúcu stop aj cieľ: samotné OHLC neurčí poradie ich pozorovania.

Pôvodný účtovný model kúpi 10000 EUR za Ask 1,1002 pri Bid 1,1000 a neskôr predá celý objem za Bid 1,1012 pri Ask 1,1014. Pip je 0,0001 USD/EUR. Rozdiel plnení je 10 pipsov/10 USD. Provízia 1 USD na každej strane nechá 8 USD čistého, financovanie a ďalší sklz sú zadané nulové. Dodatočné odpočítanie dvoch vstupných pipsov spreadu dá 6 USD a započíta už obsiahnutý cenový rozdiel druhý raz.

Pre zamýšľaný produkt doplňte financovanie, konverzie, kontrakt, maržu a odmietnutia. Pri viacerých nástrojoch modelujte spoločný kapitál a poradie súbežných žiadostí. Sčítanie nezávislých kriviek môže prehliadnuť nefinancovateľné obchody. Náhodný sklz potrebuje pomenovanú distribúciu, seed a verziu knižnice, nie náhodne pridané číslo bez vysvetlenia.

Nový EUR model: poradie súbežných požiadaviek mení vykonané obchody

Oddelený hypotetický test začína na 1000 EUR, bez kreditov, tokov či pozícií. V jednom kroku prídu celé požiadavky A a B pre dva odlišné nástroje. Každá potrebuje pevnú modelovú maržu 600 EUR; prijíma sa iba pri dostatočnej voľnej marži, bez čiastočného plnenia. Na vstupe sa neúčtuje poplatok. Obe žiadosti sa spracujú skôr, než sa čokoľvek uzavrie; odmietnutá sa už neopakuje.

Ak ide najprv A, zarezervuje 600 EUR a zostane 400 EUR. B je odmietnuté. Neskoršie úplné uzavretie A dá vymyslený čistý výsledok +60 EUR: konečný zostatok 1060 EUR, marža aj pozície nula. Pri opačnom poradí sa prijme B, A odmietne; úplné uzavretie B s čistým −40 EUR dá 960 EUR. Náklady, financovanie a menové prepočty sú už zahrnuté v týchto výsledkoch pri uzavretí, bez ďalších účtovaných položiek. Predpokladáme nezmenenú požadovanú maržu a žiadnu skoršiu likvidáciu.

Súčet samostatných výsledkov +60 −40 =+20 EUR by naznačil účet 1020 EUR, ale obidve súbežné pozície by vyžadovali 1200 EUR marže. Náš spoločný účet má iba 1000 EUR. Nie je to predvolené pravidlo Backtraderu či vectorbt, ale vlastný protokol prijímania. Pri prenose medzi enginmi porovnajte aj prijaté a odmietnuté ID, nielen výsledný súčet.

Dve požiadavky, jeden EUR maržový účetHypotetických 1000 EUR, dve požiadavky po 600 EUR pevnej marže. Celé prijatie alebo odmietnutie bez opakovania, obe pred uzavretím. Netvýsledky A+60/B−40 EUR účtované až pri uzavretí.MODELOVÝ VÝPOČETNajprv AA prijaté, B odmietnutéNajprv BB prijaté, A odmietnutéNesprávny súčet nezávislýchpokusov+60 −40 =+20 EUR
Dve požiadavky, jeden EUR maržový účet. Hypotetických 1000 EUR, dve požiadavky po 600 EUR pevnej marže. Celé prijatie alebo odmietnutie bez opakovania, obe pred uzavretím. Netvýsledky A+60/B−40 EUR účtované až pri uzavretí.

Stabilné poradie súbežných požiadaviek a odmietnuté ID patria do modelu. Uvedený protokol je náš, nie univerzálna brokerovská alebo knižničná politika.

Na malej obrazovke možno diagram posúvať vodorovne alebo zväčšiť. Hodnoty a záver nájdete aj nižšie v texte.

Najprv A
A prijaté, B odmietnuté – Voľných 400 EUR nestačí na B; po A koniec 1060 EUR a nulová marža.
Najprv B
B prijaté, A odmietnuté – Po úplnom B koniec 960 EUR, žiadne ďalšie pozície ani toky.
Nesprávny súčet nezávislých pokusov
+60 −40 =+20 EUR – Dve súbežné pozície by potrebovali 1200 EUR; účet má 1000 EUR.

Evidencia umožní výsledok zopakovať

Samostatný rovnakorizikový príklad má presne 40 výhier po +2R a 60 strát po −1R: zisky 80R, straty 60R, čistých 20R, PF 80/60≈1,33 a priemer 0,2R. Náklad 0,1R na každom zo 100 obchodov zmení výsledky na +1,9R/−1,1R: zisky 76R, straty 66R, čistých 10R, PF 76/66≈1,15 a priemer 0,1R. Peňažná veľkosť R je stále rovnaká; nejde o skutočný backtest.

Pôvodný kontrapríklad opätovného vstupu: päť podmienok je true,true,true,false,true. Obe pravidlá vstúpia pri 1; stop pri 2 uzavrie pozíciu pred kontrolou vstupu. Ďalšie výstupy nie sú. Pravidlo „bez pozície a true“ znovu vstúpi pri 2 a zostane otvorené. Pravidlo vyžadujúce nové false čaká pri 2/3, obnoví pripravenosť pri 4 a vstúpi pri 5. Obe počítajú dva vstupy, ale v inom čase. Ide o výslovne zvolený stavový automat, nie default knižníc.

Uchovajte equity otvorených pozícií aj uzavreté výsledky. Do poklesu zahrňte počiatočný kapitál; vklady a výbery oddeľte od výnosov. Výnos, Sharpe či drawdown nedoplňujte, ak ich nedokážete odvodiť z príslušnej datovanej evidencie a equity série.

Oddeľte výber pravidiel a nepoužité dáta

Chronologické vývojové a testovacie okná určte pred výberom preferovaných pravidiel. Zaznamenajte všetky nástroje, parametre, filtre a delenia vrátane odmietnutých verzií. Málo parametrov nemusí znamenať málo hypotéz. Bailey a spoluautori skúmajú opakovaný výber a preučenie backtestu; z našich príkladov nevypočítavame pravdepodobnosť PBO.

Ďalší vymyslený súbor 100 obchodov má 75 ziskov po +0,2R a 25 strát po −1R. Napriek 75 % úspešnosti stráca 10R pred nákladmi: zisky 15R, straty 25R, PF 0,6. Nezvyčajný report odôvodňuje skúmanie dát, závislosti, nákladov, vykonania a citlivosti parametrov, nie automatickú diagnózu budúcich informácií podľa hranice úspešnosti či PF.

Prvý overiteľný postup

  1. Založte izolovaný projekt a uchovajte originál dát s ID, zdrojom, UTC časom, stranou kotácie a verziami. Offline cvičenie nepotrebuje živé heslá ani odoslaný pokyn.
  2. Prejdite niekoľko určených záznamov. Zapíšte dostupnosť signálu, nasledujúcu vykonateľnú udalosť a postup pri chýbajúcej alebo revidovanej hodnote.
  3. Určte stavové pravidlá: pridanie, obrátenie, opätovný vstup po stope alebo čakanie na obnovenie pripravenosti. Overte očakávané ID vstupov.
  4. Zosúlaďte plnenia a náklady, výsledky odvoďte z evidencie. Rovnaké zmrazené pravidlá skúste s pomenovanými alternatívami vykonania.
  5. Uchovajte denník pokusov, nepoužité okná, verzie a obmedzenia. Porovnávajte rovnaké obdobia a neistotu; pevne daný pokles výkonu neurčuje jeho príčinu.

Overte si, čo ste sa naučili

Cvičenie: približne 2 minúty.

Ceny majú poradie A/B/C, príznaky C:1/A:0/B:0. Ktorý záznam vyberie párovanie štítkov Series?

Zobraziť odpoveď a vysvetlenie

Jediný príznak 1 patrí ID C; jeho cena je 104.

Ďalšie otázky

Potrebujem na začiatok pokročilý Python?

Stačí začať zručnosťami na čítanie a kontrolu dát, funkcie a rozlíšenie indexu od pozície poľa. Najprv zopakujte malý úplne určený model. Trojzáznamový príklad je kontrola dát, nie stratégia: čas, stav, výstupy a vykonanie vyžadujú ďalšie definície. Tridsať riadkov ani pevný čas učenia nepreukazujú pripravenosť. Uložte verzie a kontrolujte medzivýsledky.

Kedy vybrať Backtrader a kedy vectorbt?

Porovnajte zdokumentovaný režim s požiadavkami. Backtrader postupuje udalosťami a štandardný Market model používa nasledujúce dostupné Open. vectorbt má orders/signals/customorder režimy a aktualizuje cash aj aktíva. Vektorový vstup neznamená nezávislosť každého vykonania od minulého stavu. V oboch overte defaulty, náklady a poradie. Názov nedokazuje univerzálnu rýchlosť ani realizmus.

Kde získať spoľahlivé historické dáta?

Určte poskytovateľa, produkt, stranu kotácie, zónu a dostupnú históriu. copy_rates_range poskytuje OHLC/spread/objemy v UTC v limitoch terminálu, nie úplné historické náklady alebo dôkaz živých plnení. yfinance je nezávislý nástroj pre Yahoo dáta s upozorneniami na použitie; CCXT pracuje s dátami búrz. Kvalitu určujte na konkrétnej sade, nie rebríčkom názvov. Zachovajte originál a opíšte opravy.

Ako spoznať príliš dobrý backtest?

Priamo overte príčinnosť a účtovanie: informácie dostupné vtedy, plnenia, jednotky nákladov, všetky výberové pokusy a vopred určené nepoužité okná. Úspešnosť ani PF samy chybu nediagnostikujú. Hypotetických 75 ziskov po 0,2R a 25 strát po 1R dá −10R pred nákladmi napriek 75 % úspešnosti. Nezvyčajný výsledok je podnet na kontrolu, nie automatický dôkaz look-ahead či preučenia.

Zdroje a overenie

  1. pandas — Intro to data structures

    Series má štítky a automatické párovanie; NumPy pole môže stratiť význam indexu. Zdrojový trojzáznamový príklad je náš hypotetický test.

  2. MetaQuotes — copy_rates_range

    Vrátené OHLC/volume/spread polia, UTC a limity dostupnej histórie terminálu. Nie kompletný historický sadzobník či potvrdenie plnení.

  3. pandas — merge_asof

    Zoradené kľúče, backward/nearest, tolerancia a exactmatches. Samy neurčujú vintage ani čas zverejnenia.

  4. pandas — DataFrame.resample

    closed určuje príslušnosť k intervalu, label jeho štítok; zmena štítku nemení čas dostupnosti agregátu.

  5. Backtrader — Order Management and Execution

    Dokumentovaný štandardný Market model nasledujúceho Open; nejde o garanciu živého vykonania či každého nastavenia.

  6. vectorbt — Portfolio Workflow

    Postupné spracovanie stavu/cash/aktív, režimy orders/signals/custom a cashsharing/callsequence. Náš EUR maržový protokol nie je tvrdený default knižnice.

  7. Bailey et al. — The Probability of Backtest Overfitting

    Abstrakt a úvod verzie February 2015 o opakovanom výbere a falsepositives na konečnej sade. Nie nami vypočítané PBO alebo plná implementácia CSCV.

  8. yfinance — Project README

    Nezávislý projekt používajúci Yahoo API, upozornenia na dátové práva; nie certifikácia kvality konkrétnych historických dát.

  9. CCXT — Project README

    Rozhranie ku kryptomenovým burzám a ich trhovým dátam. Nie univerzálny zdroj OTC forexových kotácií.

Výpočty používajú výslovne uvedené predpoklady. Nenahrádzajú aktuálne trhové údaje ani podmienky poskytovateľa.

O autorovi

Jarosław Wasiński je vydavateľ a trhový analytik v Poľsku. V roku 2004 založil MyBank.pl a devízový trh sleduje od roku 2007.