În acest articol
După lectură vei putea să…
- Verifici alinierea prețului și semnalului după identificator.
- Separi ora observației de disponibilitatea versiunii publicate.
- Reconciliezi prețurile, comisioanele și starea poziției în modele mici.
Explicații ale termenilor în articol
Backtesting: testare pe date istorice Executarea ordinului Comision de tranzacție Scădere de la maxim (drawdown) Ordin stop-loss Take profit (TP)Un backtest Python are nevoie de un traseu verificabil: date, informația disponibilă atunci, ordine, execuții și registru reconciliat. Păstrează identificatorii, nu numai orele. Graficul rapid al capitalului nu arată dacă semnalul a folosit publicare ulterioară, lumânare incompletă sau preț interzis de modelul execuției.
Alege mediul după întrebarea de cercetare
Strategy Tester din MT5 acceptă Expert Advisors cu mai multe instrumente, testare și optimizare. Python organizează date și calcule proprii, fără să fie evadare obligatorie dintr-o limită de o pereche. Compară cerințele datelor, contractului și execuției. Pentru diferențe între implementări, folosește același set înghețat și aceleași reguli.
Salvează datele și sensul lor
Notează instrumentul și produsul, furnizorul, fusul, partea cotației, intervalul și perioada descărcată. Verifică ID-urile duplicate, ordinea și lipsurile. Închiderea pieței nu înseamnă automat fișier corupt; completarea golului poate inventa observații. Păstrează fișierul original și pașii transformării.
copy_rates_range din MetaTrader5 întoarce timp, OHLC, tick volume, spread și real volume, fără tarif istoric complet de comision și finanțare. Barele depind de istoricul și setările terminalului: perioada cerută nu dovedește primirea integrală. Argumentele de timp și datele întoarse folosesc UTC. Creează ore explicite înaintea conversiei sesiunilor.
pandas și NumPy susțin calculele. Backtrader organizează evenimentele; simularea portofoliului vectorbt actualizează numerarul și activele prin moduri pentru ordine, semnale sau funcție proprie. Eticheta nu garantează execuție realistă ori durată fixă. Alege bibliotecile necesare, salvează versiunile și verifică licența, drepturile datelor și mediul acceptat. Datele și implementarea pot avea costuri separate.
Eliminarea indexului poate atașa semnalul altei lumânări
Modelul are trei înregistrări de preț încheiate, fictive: A=100, B=102, C=104. Seria separată de marcaje este ordonată C:1, A:0, B:0. Marcajul 1 identifică numai un candidat pentru modelarea ulterioară, fără ordin sau preț de execuție.
Eticheta și poziția pot selecta alte rânduri
Pe un ecran mic, derulează diagrama orizontal sau mărește-o. Explicația este disponibilă și în text.
pandas aliniază Series după etichetă. prices * flags produce A:0, B:0, C:104. Conversia ambelor în tablouri și înmulțirea pe poziție produce 100,0,0; atribuirea către A,B,C face din A candidatul. Înainte de to_numpy(), verifică ID-urile, nu numai lungimea. Alinierea corectă nu verifică singură momentul disponibilității semnalului.
Definește când devine utilizabilă înregistrarea
Lumânarea H1 etichetată cu deschiderea 10:00 nu are încă OHLC complet la 10:00. În pandas resampling, closed stabilește apartenența la interval, iar label eticheta marginii. Schimbarea etichetei nu schimbă ora disponibilității agregatului.
Asociază datele macro după publicarea versiunii disponibile, fără simpla lună descrisă. merge_asof cere chei sortate; backward selectează cheia anterioară sau egală, nearest o poate selecta pe cea ulterioară. Niciuna nu știe automat despre revizuiri. Definește toleranța și ordinea evenimentelor cu aceeași oră.
Test fictiv: decizia este la 10:04 UTC; publicările salvate sunt 10:00 cu valoare 50 și 10:05 cu valoare 60. Fără toleranță restrictivă, backward alege 50, cu patru minute înainte. Nearest alege 60, mai aproape la un minut, dar în viitor. Cu toleranță backward inclusivă de două minute, nu există potrivire. Păstrează lipsa; valoarea viitoare ar modifica informația disponibilă.
Altă rețetă folosește numai lumânări încheiate: primele douăzeci au High de la 100 la 119, fiecare Open=High−0,5, Low=High−2 și Close=High−1. Lumânarea 21 are O120/H121/L118/C120,5; 22 are O120,6/H122/L119/C121. Prețurile sunt arbitrare, fără date de piață ori tranzacție FX.
previous_high = bars["high"].shift(1).rolling(20).max()
signal = bars["close"] > previous_high
next_bar_signal = signal.shift(1, fill_value=False)
La lumânarea 21, maximul celor douăzeci anterioare este 119: 120,5>119 este adevărat. Includerea High curent dă prag 121 și condiție falsă. Ultima linie mută semnalul observat în lumânarea 22; nu furnizează execuție, acceptarea ordinului sau ieșire. Păstrează doar intrări complete și definește separat volumul, ordinul și ordinea evenimentelor.
Model RON: ora observației nu este ora publicării
În modelul fictiv din 12 octombrie 2026, decizia de conversie informativă este la 10:04 UTC, adică 13:04 Europe/Bucharest. O rată USD/RON de 4,4 descrie observația 09:55 și devine disponibilă la 10:03. Altă rată, 4,5, descrie observația 10:00, dar se publică numai la 10:06. Sunt date inventate didactic, fără curs BNR, ofertă broker sau conversie fiscală.
Chiar și backward după ora observației selectează 4,5, deși încă nu este disponibilă. Filtrul corect al disponibilității permite 4,4. Pentru un rezultat de 10 USD deja cunoscut la decizie și cost separat 2 RON, raportul informativ este 10×4,4−2=42 RON. Folosirea informației viitoare dă 43 RON. Diferența de 1 RON nu este avantaj economic: provine din alt set de informații. Salvează ambele ore și versiunea fiecărei observații.
Backward pe ora observației poate include tot informație viitoare. Verifică ora disponibilității înaintea asocierii și păstrează versiunea.
Pe un ecran mic poți derula diagrama orizontal sau o poți mări. Valorile și concluzia apar și în textul de mai jos.
- Observație 09:55, disponibilă 10:03
- 4,4 RON/USD – Admisă la 10:04; raport informativ 42 RON.
- Observație 10:00, disponibilă 10:06
- 4,5 RON/USD – Indisponibilă la decizie; calculul 43 RON introduce viitorul.
- Diferență artificială
- 1 RON – Nu provine dintr-o tranzacție suplimentară sau avantaj măsurat.
Separă semnalul, execuția și costul
În modelul standard documentat Backtrader, ordinul Market emis după procesarea lumânării curente folosește Open al următoarei disponibile. Alte setări pot schimba momentul. Dacă stopul și ținta sunt în aceeași lumânare, OHLC singur nu arată ordinea atingerilor.
Model separat cu o singură tranzacție: cumperi 10.000 EUR la Ask EUR/USD 1,1002, cu Bid simultan 1,1000; ulterior vinzi totul la Bid 1,1012, cu Ask 1,1014. Pipul este 0,0001 USD/EUR. Diferența execuțiilor este zece pips, adică 10 USD. Comision 1 USD pe fiecare parte lasă 8 USD net; finanțare și slippage suplimentar zero. Deducerea încă o dată a spreadului inițial de doi pips ar raporta 6 USD, dublând costul deja reflectat în prețurile execuțiilor.
Precizează finanțarea, conversiile, contractul, marja și respingerea ordinelor pentru produs. La mai multe instrumente, modelează numerarul comun, marja disponibilă și ordinea cererilor simultane. Suma curbelor independente poate include ordine nefinanțabile împreună. Slippage aleator cere distribuție, seed și versiune de bibliotecă declarate.
Registrul face afirmația verificabilă
Model cu R monetar constant: exact patruzeci de câștiguri la +2R și șaizeci de pierderi la −1R dau 80R câștiguri, 60R pierderi, total 20R, PF=80/60≈1,33 și medie 0,2R. Costul 0,1R pe fiecare lasă patruzeci de +1,9R și șaizeci de −1,1R: câștiguri 76R, pierderi 66R, total 10R, PF≈1,15, medie 0,1R. Este aritmetică, fără backtest real.
Alt contraexemplu: condițiile pe cinci lumânări sunt adevărat, adevărat, adevărat, fals, adevărat. Ambele politici intră la 1; stopul închide la 2 înaintea evaluării intrării și nu există ieșiri ulterioare. Politica „fără poziție și condiție adevărată” reintră la 2 și rămâne deschisă. Politica ce cere un fals pentru rearmare așteaptă la 2 și 3, se rearmează la 4 și intră la 5. Numără ambele două intrări, la alte momente. Este mașină de stări aleasă explicit, fără regulă implicită atribuită bibliotecilor.
Păstrează capitalul curent cu pozițiile deschise și rezultatele închise separat. Include capitalul inițial în drawdown și separă depunerile și retragerile de randamente. Nu adăuga randament, Sharpe sau drawdown care nu se poate reproduce din registrul datat și traseul relevant.
Separă selecția de rezultatele pe date rezervate
Fixează ferestrele cronologice de antrenare și test înaintea alegerii regulilor. Salvează fiecare instrument, parametru, filtru și împărțire încercate, inclusiv variantele respinse. Puțini parametri nu înseamnă puține ipoteze. Bailey și coautorii studiază selecția repetată și supraoptimizarea; modelele de aici nu estimează PBO.
Alt eșantion inventat: 75 câștiguri de +0,2R și 25 pierderi de −1R au rată de succes 75%, dar pierd 10R înaintea costurilor: câștiguri 15R, pierderi 25R, PF=0,6. Verifică observațiile, dependența, execuția, costurile și sensibilitatea parametrilor; pragul ratei sau PF nu diagnostichează singur eroarea.
Ce construiești în următoarea etapă?
- Creează proiect izolat și păstrează datele originale cu ID, sursă, UTC, partea cotației și versiuni. Exercițiul offline nu cere acreditări live sau ordine.
- Parcurge câteva înregistrări specificate complet. Notează disponibilitatea semnalului, următorul eveniment permis pentru execuție și tratamentul lipsurilor ori revizuirilor.
- Definește repetarea condiției: adaugă, inversează, reintră după stop sau așteaptă rearmare? Verifică ID-urile intrărilor.
- Reconciliază costul și fiecare execuție, apoi derivează rezultatele. Compară aceleași reguli înghețate sub ipoteze alternative declarate ale execuției.
- Păstrează încercările, ferestrele rezervate și limitările. Compară perioade similare și incertitudinea; o scădere fixă a performanței nu identifică singură cauza.
Verifică ce ai învățat
Exercițiu: aproximativ 2 minute.
Arată răspunsul și explicația
Singurul marcaj 1 aparține ID-ului C, al cărui preț este 104.
Alte întrebări
Am nevoie de Python avansat pentru început?
Cum aleg între Backtrader și vectorbt?
De unde obțin istoric potrivit?
Cum verific un backtest aparent prea bun?
Surse și verificare
- pandas — Series alignment
Operațiile Series aliniază etichetele; exemplul nu este strategie completă.
- pandas — merge_asof
Sortare, direcția potrivirii, toleranță și egalitate; ora publicării trebuie definită separat.
- pandas — Time series
closed privește apartenența, label eticheta; aceasta nu stabilește disponibilitatea informației.
- MetaTrader5 — copy_rates_range
Câmpurile barelor, limitele istoricului și UTC; nu tarif istoric complet sau execuție live.
- Backtrader — Order execution
Modelul standard Market la deschiderea barei următoare, fără generalizarea tuturor configurațiilor.
- vectorbt — Portfolio workflow
Actualizarea stării, ordine, semnale și funcție de ordine; fără afirmație universală de viteză.
- Bailey et al. — Backtest Overfitting
Selecția repetată și limitele validării; fără PBO calculat pentru modelele fictive.
- MetaTrader5 — Strategy testing
Testarea strategiilor cu mai multe simboluri; fără rezultat de strategie verificat.
- yfinance — Documentation
Instrument independent de Yahoo; drepturile datelor se verifică separat, fără garanție de istoric potrivit.
- CCXT — Project documentation
Interfață pentru burse cripto și datele lor; fără atribuire ca sursă universală de Forex OTC.
Calculele folosesc ipotezele precizate explicit. Nu înlocuiesc datele actuale ale pieței sau condițiile furnizorului.
