Genetic algorithms trading

Bez genetickych algoritmov

Dlzka obchodu: 5 minut

Obchodujeme vsetko - vysledok = 1 174 918

Nahodne vygenerovana postupnost typu boolean pre zobratie/nezobratie obchodu (1000 iteracii)

  • Obchodujeme cca 50% - vysledok = 610 000
  • Obchodujeme cca 99% - vysledok = 1 166 508
S genetickymi algoritmami

tournament selection a populaci 10 jedincov n size 2

  • generacia 0 - 591665.5
  • generacia 100 - 637351.1
  • generacia 200 - 645177.8

Upraveny vyber podla parametru bestSelection a populaci 20 jedincov n size 10, vyber 6

  • generacia 0 - 603339.2
  • generacia 100 - 666938.7
  • generacia 200 - 678297.75
  • generacia 300 - 676234.75

Skontrolovat vsetky mozne nastavenia kniznice ECJ pre vyber jedincov do dalsej populacie. (kvoli obcasnemu zhorsovaniu fitness funkcie v priebehu casu).

Upraveny vyber podla parametru tournament selection a populaci 20 jedincov n size 7

  • generacia 0 - 603339.2
  • generacia 25 - 635714.8
  • generacia 50 - 655474.44
  • generacia 75 - 666082.56
  • generacia 100 - 676296.56

Oproti randomnemu vygenerovaniu booleanovskeho pola sa vysledok vylepsuje skor symbolicky, nedochadza k vyraznemu zlepseniu po jednotlivych generaciach. Vstupne data poskytnute externou firmou su optimalizovane.

Kombinácia času, zisku a straty

Vektor pre genetickú mutáciu má tvar

Povolené hodnoty [Int Int Int Int Int]

od - do [-1 → 0, 5 → 100,-1 → 0, 5 → 100,-1 → 0, 1 → 120] Prvá hodnota znamená či tento výstup budeme používať, druhá hodnota potom konkrétne nastavenie výstupu.

19. generácia

  • Najlepší jedinec : 8145695,96
  • Najslabší jedinec : 1029968,12
  • Priemerný jedinec : 6445227,365

Kombinácia technických indikátorov

Kedže pracujeme s tickovými datami, musíme si ich vhodným spôsobom upraviť. Technické indikátory sa vypočítavajú pre danú periódu. Napríklad perióda 14 znamená pri 5 minútovom grafe posledných 80 minút. Kedže pri tickových datach nemame takýto graf musíme si vhodne data zgrupiť. Parametrický nastavíme veľkosť okna napríklad 5 a nasleduje prepočet.

Pre každý tick vypočítame otváraciu cenu, najvyššiu cenu, najnižšiu cenu a zatváraciu cenu posledných 5 tickov.

Príklad tickové data 3 4 5 8 2 1 5 4 6 7 Pre tick s hodnotou 2 na pozíci 5 si budeme evidovat low high open close cenu predošlých 5 tickov. open=3, high=8, low=2, close=2 Tj odteraz si nebudeme pamätať pri tickových datach iba

timestamp ask a bid

ale dôjde k rozšíreniu na

timestamp ask bid open high low close

S týmito dátami sme potom schopný pracovať pri skoro všetkých technických indikátoroch.

V predošlej verzi programu sa pri evolúci vykonával výpočet aj pre kombináciu parametrov, ktoré sme už niekedy v predošlých generáciach vyhodnotili. Preto si každú novú kombináciu pamätám aj spolu s výsledkom a vkladám do HashMap-y. Pred samotným výpočtom kontrolujem, či sa kombinácia paramtrov nenachádza v HashMap-e. Ak áno nie je dôvod výpočet vykonať znova a použijem predošlé vyhodnotenie.

Tickové dáta program dokáže zgrupovať podľa počtu tickov napr. x = 100 alebo podľa časového intervalu napr. y =5 minút.

Pre rýchlejšiu prácu je zavedený pomocný vektor, kde sú tieto zgrupené dáta ukladané. Záznam vektoru je objekt typu Candlestick (moja vlasná trieda), ktorý uchováva cenu open, high, low, close za konkrétne obdobie.

Pri veľkosti zgrupovania 100 tickov, máme v pomocnom vektore práve 1 záznam na každých 100 tickov. Pri časovom okne je to zgrupovanie podľa času nie počtu tickov.

Indikátory potrebujú pre výpočet väčšinou x posledných candlestickov, kde x určuje periódu. V zgrupenom vektore dát sa pohybujeme podľa toho, kde sa nachádzame v timestampe tickových dát.

Napríklad sme na 1457 ticku. Pri zgrupení po 100 tickoch máme v candlestick vektore 14 záznamov. Pre výpočet ale potrebujeme aj aktuálny 1457. tick

Pri ticku 1457 vidíme aj štatistiku open, high, low, close pre rozmedzie tickov 1400 - aktuálny tick(1457) Pre výpočet pri perióde 14 použijeme aktuálny tick (ktory obsahuje aj udaje o extremoch medzi tickmi 1400-1457) + 13 záznamov v candlestick vektore.

Každý indikátor vyžaduje pre výpočet iné údaje ale s pomocou ceny Open, High, Low, Close sme schopný vzpočítať drvivú väčšinu informcií.

  • openTime - cas v milisekundach, kedy sme otvorili obchod
  • closeTime - cas v milisekundach, kedy sme uzatvorili obchod
  • openPrice - cenova hladina, pri ktorej sme otvorili obchod
  • closePrice - cenova hladina, pri ktorej sme uzatvorili obchod
  • profit - Zisk v €
  • side - buy/sell - nakup alebo predaj menoveho paru (mozeme obchodovat na obe strany)
  • type of exit - enum v podobe typu ukoncenia obchodu (TAKE_PROFIT, STOP-LOSS, TIME, RSI, …)
MAE/MFE analyza

Okrem výslednej sumy teda uchovávame aj tzv MAE/MFE analýzu.

  • MAE (Maximum Adverse Excursion=maximálna opačná odchýľka) je maximálna strata, akú má obchod, než ho uzavreme.
  • MFE (Maximum Favorable Excursion=maximálna priaznivá odchľka) je maximálny zisk, aký má obchod, než ho uzavreme.
  • Okrem konkrétnej hodnoty MAE/MFE si pamätáme aj timestamp pre konkrétny MAE/MFE. V ďalšej fáze môžeme analyzovať efektívnu dĺžku zotrvania v obchode.
  • maxLoss - maximalna strata pri otvorenom obchode.
  • timestampMaxLoss - cas, kedy sa maximalna strata vyskytla v milisekundach
  • maxProfit - maximalny zisk pri otvorenom obchode.
  • timestampMaxProfit - cas, kedy sa maximalny zisk vyskytol v milisekundach
  • profit - zisk v €
  • profitFactor - sum(ziskové obchody) / sum (stratové obchody)
  • rrr(Risk Reward Ratio) - avg(ziskové obchody) / avg(stratové obchody)
  • winRatio - percentuálna šanca ziskového obchodu
  • bestTrade - najlepší obchod
  • worstTrade - najhorší obchod
  • bestProfit - najvyššia úroveň equity krivky
  • worstProfit - najnižšia úroveň equity krivky
Pomocné statistiky pre ďalšie výpočty
  • avgPlus - priemerný ziskový obchod
  • avgMinus - priemerný stratový obchod
  • sumPlus - suma všetkých ziskových obchodov
  • sumMinus - suma všetkých stratových obchodov
  • countPlus - počet ziskových obchodov
  • countMinus - počet stratových obchodov

1126456. zaznam v ticks.csv

  • 1391596535.225,1.35082,1.3506
  • 1391695940.298,1.36112,1.3609

rozdiel medzi 2 tickmi 99405 sekund tj. cca 27,61 hodiny

Nezrovnalost bola odhalena pri zahrnuti statistiky o maximalnom stratovom a ziskovom obchode. Pri nastaveni stop-loss na 20 pipsov bola najvyssia strata (zisk) okolo 100 pipsov. Tento casovy a cenovy rozdiel medzi 2 tickmi sposobil mierne skreslenie vysledkov, ktore sa pri mnozine x > 90 000 obchodov prejavilo na vysledkoch iba kozmeticky.

Profit pre danu strategiu je v pipsoch a nie v dolaroch resp. eurach. Pre lepsiu orientaciu 1 pips predstavuje pri EUR/USD pohyb 10$. Vysledny ucet bude firma uvazovat v eurach, preto je vysledok obchodu este prekonvertovany.

Neplati teda jednoduchy vztah profit = 10*zisk_v_pipsoch

Vysledny vztah profit = (10*zisk_v_pipsoch ) / (kurz EUR/USD)

Vývoj pri pouziti brute-force

Testovane pre Profit-target 10..150 pispov Stop-loss 10..200 pipsov.

  • 1. obrazok zachytava perspektivu z pohladu Target-profit (os vpravo) aj Stop-loss (os vlavo)
  • 2. obrazok zachytava zisk podla Target-profitu.
  • 3. obrazok zachytava zisk podla Stop-lossu.

Vývoj evolucie pre populaciu 10 jedincov po 300 generaciach

V štatistike sú zahrnuté stratégie, ktoré v priebehu vývoja dosiahli postupne najväčší profit a stali sa aktuálne najlepším jedincom. Pri tejto evolúci vstupovali o hry 3 parametre: Max zisk na obchod, maximálna strata a maximálne zotrvanie v obchode v minutách. Parametre sa ľubovoľne kombinovali aj s nastavením hodnoty aj nastavením príznaku, či ich použijeme.

Pouzijeme: -1, TakeProfit: 197, Pouzijeme: -1, StopLoss: 184, Pouzijeme: -1, Cas v minutach: 989

StrategyStatistics{ profit= 1250826.3099999414, profitFactor= 1.1942990191613283, rrr= 0.8527708353906494, winRatio= 0.5834187907684826, avgPlus= 139.321591918091, avgMinus= 163.37518373769032, bestTrade= 736.98, worstTrade= -760.4, bestProfit= 1299769.1199999347, worstProfit= -14525.949999999997, sumPlus= 7688462.049999853, sumMinus= 6437635.73999995, countPlus= 55185.0, countMinus= 39404.0, }

Pouzijeme: 0, TakeProfit: 37, Pouzijeme: 0, StopLoss: 114, Pouzijeme: -1, Cas v minutach: 253

StrategyStatistics{ profit= 9144163.980000224, profitFactor= 1.7370698835860954, rrr= 0.3195854460003994, winRatio= 0.8446091372711176, avgPlus= 270.524670039296, avgMinus= 846.4862008733586, bestTrade= 815.6, worstTrade= -955.4, bestProfit= 9144163.980000224, worstProfit= -88989.67999999998, sumPlus= 2.1550265740000356E7, sumMinus= 1.2406101759999944E7, countPlus= 79661.0, countMinus= 14656.0 }

Pouzijeme: 0, TakeProfit: 37, Pouzijeme: 0, StopLoss: 125, Pouzijeme: -1, Cas v minutach: 253

StrategyStatistics{ profit= 1.0263994600000137E7, profitFactor= 1.8712268378920376, rrr= 0.2926566562959114, winRatio= 0.8647539680015268, avgPlus= 270.2894318362991, avgMinus= 923.5717897460145, bestTrade= 815.6, worstTrade= -1036.05, bestProfit= 1.0263994600000137E7, worstProfit= -100428.24999999999, sumPlus= 2.2045076350000393E7, sumMinus= 1.178108175000016E7, countPlus= 81561.0, countMinus= 12756.0 }

Pouzijeme: 0, TakeProfit: 37, Pouzijeme: 0, StopLoss: 197, Pouzijeme: -1, Cas v minutach: 253

StrategyStatistics{ profit= 1.1760934980000446E7, profitFactor= 2.0566041392174035, rrr= 0.18723517308387852, winRatio= 0.9165558905856542, avgPlus= 269.92519597208303, avgMinus= 1441.637228338292, bestTrade= 815.6, worstTrade= -1507.23, bestProfit= 1.1760934980000446E7, worstProfit= -2957.4900000000002, sumPlus= 2.2891816020000417E7, sumMinus= 1.1130881039999953E7, countPlus= 84808.0, countMinus= 7721.0 }

Pouzijeme: 0, TakeProfit: 72, Pouzijeme: 0, StopLoss: 197, Pouzijeme: -1, Cas v minutach: 253

StrategyStatistics{ profit= 1.8981877090000063E7, profitFactor= 1.9904755319787604, rrr= 0.3607777587873309, winRatio= 0.8465593816692623, avgPlus= 519.8174666139898, avgMinus= 1440.8245906322863, bestTrade= 928.76, worstTrade= -1507.23, bestProfit= 1.8981877090000063E7, worstProfit= -141250.35000000003, sumPlus= 3.814628497000103E7, sumMinus= 1.916440788000004E7, countPlus= 73384.0, countMinus= 13301.0 }

Pouzijeme: 0, TakeProfit: 81, Pouzijeme: 0, StopLoss: 197, Pouzijeme: -1, Cas v minutach: 253

StrategyStatistics{ profit= 2.0857381140000056E7, profitFactor= 1.99844323777157, rrr= 0.4049381561291506, winRatio= 0.8315131517799051, avgPlus= 583.3070125751082, avgMinus= 1440.4841918356265, bestTrade= 928.76, worstTrade= -1507.23, bestProfit= 2.0857381140000056E7, worstProfit= -139670.92, sumPlus= 4.174728289000049E7, sumMinus= 2.0889901750000253E7, countPlus= 71570.0, countMinus= 14502.0 }

Pouzijeme: 0, TakeProfit: 89, Pouzijeme: 0, StopLoss: 197, Pouzijeme: -1, Cas v minutach: 216

StrategyStatistics{ profit= 2.1027350679999538E7, profitFactor= 1.9045179432981536, rrr= 0.4440334966185906, winRatio= 0.8109330334129997, avgPlus= 639.6367283076678, avgMinus= 1440.5145854505063, bestTrade= 928.76, worstTrade= -1507.23, bestProfit= 2.1027350679999538E7, worstProfit= -138376.02000000002, sumPlus= 4.427437506000015E7, sumMinus= 2.324702438000027E7, countPlus= 69218.0, countMinus= 16138.0 }

Evolucia s roznymi hodnotami seed

Pre lepsie analyzovane chovania evolucie je potrebne spustat ju na tych istych datach s roznym pociatocnym seedom. Kazda evolucia pozostavala z 30 jedincov a pocet generaci bol kvoli velkej casovej narocnosti testov obmedzeni na 150 generacii.

  • Rovnaka hodnota P_baseline
  • Nahodne urceny vektor pre zobratie/nezobratie obchodu (1000 iteracii)
  • Automatizacia vyhodnocovania
  • Evolucia (mutacia 1%, populacia 10 jedincov, krizenie 50%, 1000 generacii)
  • Zopakovat krok 4 a doplnit vysledky sem do WIKI.
  • Seed - pre pseudonahodny vyber - rovnaky seed ⇒ rovnake vysledky pri opakovanom spusteni
  • Validácia vstupného vektoru signálov od Cognita (či nedokážeme evolúciou získať výrazne lepší výsledok)
  • Vektor nebude náhodné určený, použijeme 1 vektor
  • Simulátor
  • Vlastnosti vstupných vektorov.
  • Spôsob predikcie - uplatňovaný na výstupy z obchodov podľa času, zisku a maximálnej prípustnej straty (technické indikátory - momentálne v implementačnej fáze)

Implementovat:

1. etapa

  • Vypocet technickej analyzi (zgrupovanie tickov podla casu && podla poctu)
  • Zahrnut do statistiky dlzku transakcie + histogram podla poctu transakci.
  • Pocet ovorenych transkacii sucastne
  • Zber co najvacsieho mnozstva medzidat
  • Evolucia 1000 generaci (populacia 10 jedincov)

2. etapa

Technicka analyza indikatory
  • Fixne + EA na hodnotu
  • Parametre - fixne podmienky
Vstupne data
  • originalne
  • nove
  • randomizovane

Grafy

  • Graf pre pocet obchodov v case. (Prekryty s tickovymi datami)
  • Graf pre EUR/USD (tickove data) prekryty s vyslednou equity
  • Ziskovost obchodov podla dlzky dlhsie/kratsie (mozno by bol vhodny kumulativny graf)
  • Vysledok viacerych simulaci (s roznymi seedmi) cez seba do 1 grafu.

Evolucia

  • populacia s 1 jedincom a s 30 jedincami (odhalenie nahodnosti/uzitocnosti evolucie)
  • simultanne simulacie s viacerymi roznymi seedmi.