Algorytm genetyczny do spekulacji

Jeżeli masz pomysł lub używasz ciekawego systemu albo strategii gry, opisz ja tutaj.
rmz
Bywalec
Bywalec
Posty: 12
Rejestracja: 03 maja 2011, 18:31

Nieprzeczytany post autor: rmz »

Z ciekawością czytam ten wątek bo coś podobnego sobie tworzę. Mniejsza o nazewnictwo, nie są to ani NN, ani AG ale coś pomiędzy. Mam "węzły" które generują "0-nie rób nic" lub "1-Kup(lub Sprzedaj)" na podstawie Open High Low Close Vol z pewnego okresu czasu(z tego samego waloru, w przyszłości może dodam algorytmowi możliwość "zaglądania" do innych). Nie uwzględniam żadnych wskaźników bo i tak są one wszystkie zaszyte w tych danych które podałem wcześniej. Wszystkie te węzły sobie łącze NANDem(lub większą ilością funkcji logicznych - różne wersje testuje. Ale jak wiadomo NAND jest w stanie zastąpić wszystkie inne funkcje.). Acha najważniejsze:
1. Parametry każdego węzła są losowe
2. Funkcje każdego węzła są losowe - patrz punkt 3,4
3. Węzeł podejmuje decyzję(0 lub 1) na podstawie pewnych zależności Open[x] High[x] Low[x] Close[x] Vol[x] - gdzie x jest losowe lub
4. Węzeł jest funkcją która łączy dwa kolejne węzły(NAND lub inne)
5. Każdy węzeł albo podejmuje decyzję("węzeł decyzja") i jest liściem(takim z teorii grafów) albo
6. Łączy się z dwoma innymi losowymi węzłami jeśli jest "funkcją"(taki węzeł=gałąź w grafach)
Zamierzam dodać elementy znane z AG takie jak mutacja, krzyżowanie itd. aby z najlepszych osobników zrobić jeszcze lepszych. Nie wszystkie założenia tu podałem - ale nie będę zanudzał(liczenie wyniku, podejmowanie decyzji, kilkukrotne testowanie na różnych danych itd).
Coś tam się generuje, problemem jest wydajność - nie mogę tego przetestować w okresie jakim bym chciał. Może powinienem się przerzucić na C/C++, ale nie sądzę aby to pomogło - raczej muszę zmienić pewne założenia. Program jest napisany w Javie, w której to generuje dla najlepszego wyniku kod w MT4 i potem to dalej testuje. Drugi problem to przeoptymalizowanie - ale walczę z tym. Efekty jak na razie marne - ale jestem w trakcie poprawiania tego dziwnego eksperymentu - najwyżej porzucę ;) Sprzedaje Wam ten pomysł za free bo może mi ktoś uświadomi że to nie ma większego sensu i zaoszczędzi mi to nieco cennego czasu :?

Awatar użytkownika
lucasgg
Bywalec
Bywalec
Posty: 5
Rejestracja: 03 lis 2006, 19:58

Nieprzeczytany post autor: lucasgg »

Witam,

Do efektu przeuczenia/przeoptymalizowania możesz podejść w ten sposób: masz 2 zbiory uczący i testowy (kilka testowych) na których równolegle uruchamiasz proces, a błąd (czy będzie to błąd sieci, czy profit - to już zależy od funkcji sprawdzającej) przedstawiać graficznie. Przeuczenie wystąpi w momencie widocznego i ciągłego pogarszania się wyniku na zbiorze testowym (często przecięcie się obu funkcji lub ich wspólne minimum/maksimum), mimo coraz lepszego wyniku na zbiorze uczącym. Oczywiście mowa o zbiorach na tyle dużych, gdzie zaczyna już działać statystyka.

Co do wydajności, kilka możliwości:
- próba optymalizacji za pomocą jakiegoś profilera (może bardzo poprawić czas jednej iteracji)
- podział na wątki (dotyczy platform kilkurdzeniowych) - warto to rozważyć (na I7 to co wykonuje mi się w przeciągu doby, skraca do ok 3-4 godzin); AG, gdzie sprawdzasz kolejne chromosomy aż się prosi o równoległe (wielowątkowe) przetwarzanie
--
Pozdrawiam,
Łukasz Gryka

Awatar użytkownika
Tymek
Pasjonat
Pasjonat
Posty: 648
Rejestracja: 20 mar 2006, 13:39

Nieprzeczytany post autor: Tymek »

Do NN najlepiej użyć shadery z karty graficznej.
Czas poświęcony na naukę nowej technologi takiej jak CUDA
zwróci się natychmiast. Przyspieszanie może sięgnąć ponad 100x.
Nie znalazłem niczego szybszego. Kilka kart graficznych na SLI
i można tylko trzymać się mocno klawiatury.
Podobnie jest z ATI ale nigdy się nie bawiłem, bo preferuję NV ;)
Każdy chce mieć pieniądze, ale pieniądze nie zawsze chcą każdego ;)

LowcaG
Pasjonat
Pasjonat
Posty: 1068
Rejestracja: 05 paź 2007, 15:39

Nieprzeczytany post autor: LowcaG »

Tymek pisze:Czas poświęcony na naukę nowej technologi takiej jak CUDA
Pelna zgoda, tyle, ze wg. mnie w tych wszystkich pomyslach, moc tak na prawde nie jest problemem, tylko po prsotu koncepcja. ;)

Awatar użytkownika
lucasgg
Bywalec
Bywalec
Posty: 5
Rejestracja: 03 lis 2006, 19:58

Nieprzeczytany post autor: lucasgg »

Witam,
LowcaG pisze: Pelna zgoda, tyle, ze wg. mnie w tych wszystkich pomyslach, moc tak na prawde nie jest problemem, tylko po prsotu koncepcja.
Oczywiście :-)
Czarodziejskich, czarnych skrzynek nie ma i nie będzie, pod żadną postacią AG, NN i podobnych. To są tylko narzędzia, które mogą być przydatne.
--
Pozdrawiam,
Łukasz Gryka

Awatar użytkownika
Tymek
Pasjonat
Pasjonat
Posty: 648
Rejestracja: 20 mar 2006, 13:39

Nieprzeczytany post autor: Tymek »

koncepcja koncepcją ale moc obliczeniowa jest potrzebna.
Np. zamiast obliczać wejścia przy pomocy kilku procków
(prosta operacja wejście*waga) jest mało efektywne, gdy
użyjesz shadery w tym samym momencie obliczasz tysiące
wejść dla jednego neuronu (oczywiście wszystko zależy ile masz
shaderów -> 1 shader jedna taka operacja)
Procek zrobi kilka takich operacji a shader tysiące. Różnica jest duża.
By wszystko było szybko obliczane trzeba wszystko umieścić w pamięci
karty by zminimalizować przesyły karta->komputer. Gdy wszystkie dane
będą w karcie to uczenie jest naprawdę szybkie.
Każdy chce mieć pieniądze, ale pieniądze nie zawsze chcą każdego ;)

LowcaG
Pasjonat
Pasjonat
Posty: 1068
Rejestracja: 05 paź 2007, 15:39

Nieprzeczytany post autor: LowcaG »

Tymek pisze:koncepcja koncepcją ale moc obliczeniowa jest potrzebna.
Nikt tego nie neguje, tylko w 96% (jak wspominalem) problem lezy troche wczesniej.

Co do tego tematu, moglby ktos uscislic temat, co by chcial liczyc? Moze wtedy wiecej osob sie wypowie, bo chwilowo watek jest dla mnie metny (a nie chce mi sie go czytac od nowa, zeby wylowic o co dokladnie chodzi)

rmz
Bywalec
Bywalec
Posty: 12
Rejestracja: 03 maja 2011, 18:31

Nieprzeczytany post autor: rmz »

LowcaG pisze: Co do tego tematu, moglby ktos uscislic temat, co by chcial liczyc? Moze wtedy wiecej osob sie wypowie, bo chwilowo watek jest dla mnie metny (a nie chce mi sie go czytac od nowa, zeby wylowic o co dokladnie chodzi)
1. gotowy algorytm wejścia(kupno lub sprzedaż) w inwestycję na kilku tysiącach tików*10000000 razy = zachowaj najlepszy z tych algorytmów do dalszych testów
2. wynik z punktu 1 testuj jeszcze na większej ilości danych, jeśli wyniki nie są zadowalające to wróć do punktu 1 :)

W tej chwili moje algorytmy są na tyle skomplikowane, że sprawdzenie miliona algorytmów na 300 tikach zajmuje mi ok godziny. To co wyjdzie testuje potem dalej na inne sposoby, np. najlepszy wynik testuje na kilku tysiącach tików. Problem w tym że 300 tików to mało, milion zbadanych algorytmów też. Co prawda maszyna jest słaba (AMD Phenon II 550 3,1GHz) ale zanim przeniosę to na sprzęt docelowy muszę dopracować sporo elementów tego systemu. Chce zacząć od mniej skomplikowanych algorytmów i stopniowo je rozbudowywać, usuwać elementy które nie wpływają na wynik itd. aby ograniczyć zapotrzebowanie na moc obliczeniową.

Zastanawiam się też jakie zrobić kryteria na najlepszy wynik, obecnie robię to tylko na 3 sposoby:
1. największy zysk(liczony dość dziwnie, bo nie faworyzuje jednych transakcji nad inne ze względu na procent składany - ale szczegółami nie będę zanudzał)
2. stosunek ilości inwestycji zyskownych do stratnych
3. największy zysk z każdej transakcji

Rozważam tez zmianę każdego węzła z wartości binarnych na liczby rzeczywiste, a by nie tylko określać czy wchodzić w inwestycje, ale też określać jaki potencjalnie może przynieść zysk - aby porównywać sygnały(decyzje) między sobą(np czy wchodzić w EURUSD, czy GPBPLN bo tu i tu jest sygnał).

To tyle moich rozważań - może coś podpowiecie ;)

LowcaG
Pasjonat
Pasjonat
Posty: 1068
Rejestracja: 05 paź 2007, 15:39

Nieprzeczytany post autor: LowcaG »

rmz pisze:Nie uwzględniam żadnych wskaźników bo i tak są one wszystkie zaszyte w tych danych które podałem wcześniej.
Nie dokonca sie z tym zgodze..przykladowo mamy dane (nie nawiazujac do forexu) waga i wzrost, szukamy jakis relacji wagi i wzrostu w stounku jakiejs badanej cechy(np. zdrowia). Moze wyjsc, ze np. mamy wyzszych/nizszych ktorzy bardziej choruja, i jakas relacje miedzy waga a zachorowaniami. A jezeli stworzymy nowy parametr, bedacy stosunkiem wzrostu do wagi, nagle uzyskujemy nowa wartosc ktora moze miec duzo wieksza korelacje miedzy nia a zdrowiem.

rmz pisze:1. gotowy algorytm wejścia(kupno lub sprzedaż) w inwestycję na kilku tysiącach tików*10000000 razy = zachowaj najlepszy z tych algorytmów do dalszych testów
2. wynik z punktu 1 testuj jeszcze na większej ilości danych, jeśli wyniki nie są zadowalające to wróć do punktu 1
Widze tu jeden maly minus, a mianowicie zmiennosc rynku...moze sie okazac, ze lepiej stworzyc cala "genetyke" dla krotszych okresow.

W tej chwili moje algorytmy są na tyle skomplikowane, że sprawdzenie miliona algorytmów na 300 tikach zajmuje mi ok godziny
hm.. mowisz powaznie? 300 tickow ? Cos masz chyba nie optymalnie zrobione.
rmz pisze:To tyle moich rozważań - może coś podpowiecie
Z checia bym cos podpowiedzial, ale musze to przemyslec bo chyba nie dokonca rozumiem idee ;)

Awatar użytkownika
Lemurek
Bywalec
Bywalec
Posty: 18
Rejestracja: 28 gru 2007, 20:27

Nieprzeczytany post autor: Lemurek »

Czy wy aby nie chcecie wymyślać na nowo koła? ;) Algorytmy genetyczne ktos tam kiedyś wymyślił i ja bardziej skupiłbym się na ich wykorzystywaniu a nie programowaniu od zera.
Idealnie tu sie nadaje Genetic Expression Programming np. do podstawowego problemu statystyki jakim jest klasyfikacja.
Robimy tak jak z podręcznikową klasyfikacją irysów (standardowy test w różnych programach statystycznych) czyli zbieramy dane typu :
t1 : wskażnik1;wskażnik2,wskażnik3,...,wskażnik150;sukces
t2 : wskażnik1;wskażnik2,wskażnik3,...,wskażnik150;porażka
t3 : wskażnik1;wskażnik2,wskażnik3,...,wskażnik150;sukces
t4 : wskażnik1;wskażnik2,wskażnik3,...,wskażnik150;sukces
...
t26500 : wskażnik1;wskażnik2,wskażnik3,...,wskażnik150;porażka

t1 ... tx to np. losowe trajdy w przypadkowej chwili
wskazniki to parametry liczbowe dowolnych wskazników, które wydają się być dobrze skorelowane z sytuacją na rynku danego instrumentu (oczywiscie algorytm klasyfikacji sam zweryfikuje sobie w trakcie obliczen czy dany wskaznik ma wplyw czy nie na decyzję czy nie a jak nie to go po prostu nie uwzględni).
sukces/porażka to oczywiste -> jeśli trejd kończy się zarobkiem to sukces, jeśli stratą to porażka

Mając tak zebrane dane dzielimy je na treningowe i testowe i czesc treningową wczytujemy do programu typu GEP (odpada cale programowanie ręczne :)
Algorytm genetyczny analizuje dane i tworzy model matematyczny w postaci jawnej typu np.
Jesli wskaźnik1/wskaznik4-0,36wskanika71>0.5 to sukces, w przeciwnym razie porażka.
Oczywiście prawdziwy algorytm byłby znaacznie bardziej złożony.

Program cos tam sobie bedzie liczył godzinami i tworzył i tworzył coraz to lepszy i lepszy model. Jak już model bedzie klasyfikował dane treningowe na np 65% dobrze to możemy je sprawdzic na danych testowych (wylosowanych z tej samej puli danych). Jesli na testowych wyjdzie tez te około 65% to mamy pełny sukces i jesteśmy bogaci, bo najprawdopodobniej 2 na 3 trejdy beda sukcesem :)
Problem jedynie z zebraniem odpowiedzniej ilosci odpowiednich danych.
Podejrzewam że aby stworzyć dobry model na EURUSD trzebaby tak z 20-30tys trejdów 1H z ostatnich 10 lat, każdy z odpowiednią ilością parametrów-wskaźników.
Przepisanie otrzymanego modelu do EA to już bułka z masłem.
Osobiście kombajn do zbierania danych już sobie stworzyłem na bazie MT4-Excel. Teraz potrzebny mi dłuugi urlop na testy ;)
Myślę że mocą obliczeniową można wygrać z rynkiem, bo w taki sposób rozwiązuje się inne bardzo skomplikowane zagadnienia klasyfikacyjne jak np analiza DNA, wiarygodność kredytobiorców, obecność jakieś choroby... i metoda zdaje egzamin na piątkę tworząc zadziwiająco trafne modele.
The more you see the less you know... (U2)
Leszek Piedel

ODPOWIEDZ