Table of Contents

Genetic algorithms trading

Vysledky analyza vstupnych dat

Overenie vstupnych dat

Bez genetickych algoritmov

Dlzka obchodu: 5 minut

Obchodujeme vsetko - vysledok = 1 174 918

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

S genetickymi algoritmami

tournament selection a populaci 10 jedincov n size 2

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

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

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

Výstupne stratégie

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

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.

Optimalizácie

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.

Predspracovanie dát do candlestickov

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.

Jadro výpočtov pre technické indikátory

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í.

Štatistiky

Štatistiky o 1 obchode

MAE/MFE analyza

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

Štatistiky o 1 systéme

Pomocné statistiky pre ďalšie výpočty

Tickove data - bugy

1126456. zaznam v ticks.csv

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.

Výsledky pre výstupné stratégie

Kombinácia základných parametrov

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.

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.

Schodzky

19.9.2014

14.10.2014

14.11.2014 hotové celky

09.12.2014

Implementovat:

1. etapa

2. etapa

Technicka analyza indikatory
Vstupne data

TODO 12.1.2015

29.1.2015

Grafy

Evolucia

Coming soon 10.2.2015