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
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.
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
- 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.
- 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.
- Určte stavové pravidlá: pridanie, obrátenie, opätovný vstup po stope alebo čakanie na obnovenie pripravenosti. Overte očakávané ID vstupov.
- Zosúlaďte plnenia a náklady, výsledky odvoďte z evidencie. Rovnaké zmrazené pravidlá skúste s pomenovanými alternatívami vykonania.
- 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.
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
- 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.
- 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í.
- pandas — merge_asof
Zoradené kľúče, backward/nearest, tolerancia a exactmatches. Samy neurčujú vintage ani čas zverejnenia.
- pandas — DataFrame.resample
closed určuje príslušnosť k intervalu, label jeho štítok; zmena štítku nemení čas dostupnosti agregátu.
- Backtrader — Order Management and Execution
Dokumentovaný štandardný Market model nasledujúceho Open; nejde o garanciu živého vykonania či každého nastavenia.
- 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.
- 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.
- 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.
- 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.
