Algorytm genetyczny do spekulacji
Algorytm genetyczny do spekulacji
Mam kilka pytań do osób, które interesują się wykorzystaniem algorytmów genetycznych do wspomagania podejmowania decyzji o wejściu na rynek. Wydaje się, że temat jest do ogarnięcia przez osobę o podstawowych wiadomościach na temat programowania. O algorytmach genetycznych za dużo nie wiem, jak się patrzy na niektóre książki z tej dziedziny, to rzygać się chce od tych wzorów. Podejrzewam, że można to ugryźć bez tego całego teoretycznego tłuszczu.
Sukces prowadzi przez:
- zdefiniowanie odpowiedniego chromosomu
- zdefiniowanie odpowiedniej funkcji przystosowania (czyli jeżeli w kolejnych N świeczkach był zysk, to osobnik dobrze się przystosował; jeśli była strata, do źle się przystosował i jest pierwszy na liście do wyeliminowania go z populacji)
- dopercyzowanie podejścia w selekcji (ale zakładam, że wystarczy podejście w którym do nowej populacji wpada K najlepszych rodziców i potomstwo). Prawdopodobieństwa mutacji i krzyżowania rodziców uznałbym za "do późniejszego doprecyzowania"
- dla uproszczenia, uznajmy że algorytm będzie nam mówił czy kupić EUR/USD (1), czy siedzieć chicho (0).
Zastanawia mnie głównie jak traktować geny w chromosomie. Od tego należało by wyjść, prawda? Czy chromosom powinien się składać z genów, reprezentujących binarną informację o tym, czy włączamy/wyłączamy daną funkcję?
Np. mamy chromosom z 10 genami:
- kupuj jeśli świeczka (current-1) jest [wzrostowa]
- kupuj jeśli świeczka (current-2) jest [wzrostowa]
- kupuj jeśli świeczka (current-3) jest [wzrostowa]
- kupuj jeśli świeczka USD/JPY (current-1) jest [wzrostowa]
- kupuj jeśli świeczka USD/JPY (current-2) jest [wzrostowa]
- kupuj jeśli świeczka USD/JPY (current-3) jest [wzrostowa]
- kupuj jeśli świeczka GBP/USD (current-1) jest [wzrostowa]
- kupuj jeśli świeczka GBP/USD (current-2) jest [wzrostowa]
- kupuj jeśli świeczka GBP/USD (current-3) jest [wzrostowa]
- kupuj jeśli za 30 minut nie ma danych
- ...
Ale wydaje się, że sensowny chromosom będzie wtedy, gdy będzie tu bardzo dużo (kilka tysięcy) genów albo gdy geny nie będą binarne, lecz liczbowe albo z jakimś parametrem, który powie, że chodzi nam o [wzrostową] lub [spadkową] świeczkę np na USD/JPY.
Ktoś się tym interesował i coś doradzi, w którą stronę należy iść?
Sukces prowadzi przez:
- zdefiniowanie odpowiedniego chromosomu
- zdefiniowanie odpowiedniej funkcji przystosowania (czyli jeżeli w kolejnych N świeczkach był zysk, to osobnik dobrze się przystosował; jeśli była strata, do źle się przystosował i jest pierwszy na liście do wyeliminowania go z populacji)
- dopercyzowanie podejścia w selekcji (ale zakładam, że wystarczy podejście w którym do nowej populacji wpada K najlepszych rodziców i potomstwo). Prawdopodobieństwa mutacji i krzyżowania rodziców uznałbym za "do późniejszego doprecyzowania"
- dla uproszczenia, uznajmy że algorytm będzie nam mówił czy kupić EUR/USD (1), czy siedzieć chicho (0).
Zastanawia mnie głównie jak traktować geny w chromosomie. Od tego należało by wyjść, prawda? Czy chromosom powinien się składać z genów, reprezentujących binarną informację o tym, czy włączamy/wyłączamy daną funkcję?
Np. mamy chromosom z 10 genami:
- kupuj jeśli świeczka (current-1) jest [wzrostowa]
- kupuj jeśli świeczka (current-2) jest [wzrostowa]
- kupuj jeśli świeczka (current-3) jest [wzrostowa]
- kupuj jeśli świeczka USD/JPY (current-1) jest [wzrostowa]
- kupuj jeśli świeczka USD/JPY (current-2) jest [wzrostowa]
- kupuj jeśli świeczka USD/JPY (current-3) jest [wzrostowa]
- kupuj jeśli świeczka GBP/USD (current-1) jest [wzrostowa]
- kupuj jeśli świeczka GBP/USD (current-2) jest [wzrostowa]
- kupuj jeśli świeczka GBP/USD (current-3) jest [wzrostowa]
- kupuj jeśli za 30 minut nie ma danych
- ...
Ale wydaje się, że sensowny chromosom będzie wtedy, gdy będzie tu bardzo dużo (kilka tysięcy) genów albo gdy geny nie będą binarne, lecz liczbowe albo z jakimś parametrem, który powie, że chodzi nam o [wzrostową] lub [spadkową] świeczkę np na USD/JPY.
Ktoś się tym interesował i coś doradzi, w którą stronę należy iść?
Nie ma darmowych obiadków. A wzory dla AG nie są zbytnio straszne.Sigmalko pisze: O algorytmach genetycznych za dużo nie wiem, jak się patrzy na niektóre książki z tej dziedziny, to rzygać się chce od tych wzorów. Podejrzewam, że można to ugryźć bez tego całego teoretycznego tłuszczu.
Zdajesz sobie sprawę by określić funkcję przystosowania trzeba przeprowadzić backtest algorytmu opisanego przez dany gen ?- zdefiniowanie odpowiedniej funkcji przystosowania (czyli jeżeli w kolejnych N świeczkach był zysk, to osobnik dobrze się przystosował; jeśli była strata, do źle się przystosował i jest pierwszy na liście do wyeliminowania go z populacji)
Tym się nie przejmuj, te funkcje to nie jest problem są dobrze opisane, i dosyć proste.- dopercyzowanie podejścia w selekcji (ale zakładam, że wystarczy podejście w którym do nowej populacji wpada K najlepszych rodziców i potomstwo). Prawdopodobieństwa mutacji i krzyżowania rodziców uznałbym za "do późniejszego doprecyzowania"
No ktoś się interesował.Sigmalko pisze:Ktoś się tym interesował i coś doradzi, w którą stronę należy iść?
Po pierwsze:
- musisz mieć jakąś koncepcję co chcesz zrobić przy pomocy AG (poza ogólną "zarobić").
AG to metoda poszukiwania rozwiązania problemu w dużej przestrzeni rozwiązań tegoż. Więc należy najpierw zdefiniować ten problem i sposób jego rozwiązania ....
To tak ogólnie - coby nie traktować AG jako magicznej czarnej skrzynki do której wrzucimy co mamy pod ręką i ta znajdzie rozwiązanie ....
A po co tak ? Nie lepiej przyjąć np. że:Sigmalko pisze:Np. mamy chromosom z 10 genami:
- kupuj jeśli świeczka (current-1) jest [wzrostowa]
- kupuj jeśli świeczka (current-2) jest [wzrostowa]
- kupuj jeśli świeczka (current-3) jest [wzrostowa]
- gen ma np. 8 bitów.
- bit 0: gdy zapalony oznacza świeczkę wzrostową. Zgaszony świeczkę spadkową (może być jeszcze świeczka bez zmian, tu pomijam ten przypadek. Jeśli aktualna jest bez zmian sprawdzamy jaka była wcześniejsza i tak określamy wartość)
-bit 1: 0 nie rób nic, 1 kupuj (ewentualnie dodajesz jeszcze 1 bit oznaczający sprzedaj)
-bity 2-7 wartość liczbowa określająca do której świeczki się odnosimy (czyli świeczka current - to co w tych bitach)
I tak na 1 bajcie masz obsługę kupuj/nic nie rób dla 64 świeczek wstecz ....
A tu znowu prościej: dodaj 1 bajt będący indexem symbolu.Sigmalko pisze:- kupuj jeśli świeczka USD/JPY (current-3) jest [wzrostowa]
- kupuj jeśli świeczka GBP/USD (current-1) jest [wzrostowa]
Wydłużysz więc gen do 2 bajtów, gen "obsłużyć" więc może 255 symboli, 32 świeczki wzrostowe/spadkowe.Oczywiście jak masz mniej symboli to lepiej inaczej podzielić gen (dać więcej na świeczki).
Teraz w chromosomie wrzucasz takich genów kilka i masz wyszukiwanie wzorców. Typu: jeśli 5 świeczek wstecz EURUSD spadło, 2 świeczki wstecz GBPUSD wzrosło, USDJPY 20 świeczek wstecz wzrosło to kup EURUSD.
Tylko pytanie czy taki algorytm coś da ... obawiam się, że to byłoby za łatwe i proste. Dodatkowo: łatwo tu przeoptymalizować i dostosować się do historii, co też niechybnie taki AG by zrobił.
Faktycznie. Funkcja przystosowania powinna analizować skuteczność danego osobnika w całej epoce, czyli na backtestach. Pewnie ani jeden osobnik nie będzie miał skuteczności 100%, więc wynikiem funkcji przystosowania będzie % zwycięstw względem wszystkich zagrań. Im wyższy % zwycięstw tym osobnik bardziej przystosowany. Podpowiedź z 8-bitowym genem jest także pouczająca.
Czy taki algorym coś da? Jeżeli w genach zakodujemy różne sekwencje ostatnich N-kursów z różnych instrumentów, to w pewnym sensie mam automat do wykrywania:
- formacji cenowych na instrumentach
- korelacji cenowych instrumentów
Na 16-bitowym genie pewnie nie poprzestaniemy, oprócz:
- ostatnich N świeczek,
- na każdym instrumencie,
pewnie trzeba będzie włączać do genu takie informacje, jak:
- obecność danych makro przed / po w czasie X h
- interwały czasowe, których dotyczą świeczki
- może wartości jakichś wskaźników / np. średnia kroczącą / ATR?
- godzina / dzień tygodnia
trzeba by się zastanowić, ale 16-bitów to pewnie będzie za mało.
Celem takiego algorytmu genetycznego byłoby zdefiniowanie twierdzień, które np. w 85% przypadków dają zysk w kolejnych N świeczkach, typu:
- jeżeli przed chwilą były dane i mamy ostre świeczki spadkowe na kilku skorelowanych ze sobą insrumentach, a wcześniej (przed danymi) były wzrosty, to należy sprzedawać
Końcowa populacja AG powinna dać krocie takich twierdzeń i docelowo zapalać mi lampki w EA.
Jednak, zęby taki algorytm AG dobrze zweryfikować w funkcji przystosowania, trzeba będzie posiadać bardzo obfitą bazę danych historycznych na małym interwale.
Są jakieś wytyczne, że jeżeli np. jest 16-bitow na gen, to chromosom nie powinien mieć więcej niż np. 8 genów?
Dodano po 4 minutach:
Ale wtedy to funkcja przystosowania wykazałaby, że dany wzorzec pozwolił w ciągu 10 lat na tylko 3 trejdy... Jeżeli FP karałaby za zbyt rzadkie zagrania, to unikniemy przeoptymalizowania?
Czy taki algorym coś da? Jeżeli w genach zakodujemy różne sekwencje ostatnich N-kursów z różnych instrumentów, to w pewnym sensie mam automat do wykrywania:
- formacji cenowych na instrumentach
- korelacji cenowych instrumentów
Na 16-bitowym genie pewnie nie poprzestaniemy, oprócz:
- ostatnich N świeczek,
- na każdym instrumencie,
pewnie trzeba będzie włączać do genu takie informacje, jak:
- obecność danych makro przed / po w czasie X h
- interwały czasowe, których dotyczą świeczki
- może wartości jakichś wskaźników / np. średnia kroczącą / ATR?
- godzina / dzień tygodnia
trzeba by się zastanowić, ale 16-bitów to pewnie będzie za mało.
Celem takiego algorytmu genetycznego byłoby zdefiniowanie twierdzień, które np. w 85% przypadków dają zysk w kolejnych N świeczkach, typu:
- jeżeli przed chwilą były dane i mamy ostre świeczki spadkowe na kilku skorelowanych ze sobą insrumentach, a wcześniej (przed danymi) były wzrosty, to należy sprzedawać

Końcowa populacja AG powinna dać krocie takich twierdzeń i docelowo zapalać mi lampki w EA.
Jednak, zęby taki algorytm AG dobrze zweryfikować w funkcji przystosowania, trzeba będzie posiadać bardzo obfitą bazę danych historycznych na małym interwale.
Są jakieś wytyczne, że jeżeli np. jest 16-bitow na gen, to chromosom nie powinien mieć więcej niż np. 8 genów?
Dodano po 4 minutach:
Tzn. zamiast nauczyć się czegoś z historii, wykryć powtarzalne wzorce, to ją zwyczajnie na głupa zapamięta i nijak tego użyjemy w realu ?green7 pisze: łatwo tu przeoptymalizować i dostosować się do historii, co też niechybnie taki AG by zrobił.

Algorytmy genetyczne są doskonałe do znajdowania wzorców,tak doskonałe że na 1000% będą to wzorce optymalne dla danych testowych,karanie za rzadkie zagrania nic nie da , z łatwościa Ci taki algorytm znajdzie wzorzec, który bedzie grał czesto i zarabiał w teorii tysiące pipsów na danych testowych, a w realu juz nie .Żeby to ominąć trzeba stosować weryfikacje, to znaczy ze dane podzielic na okres testowy i okres weryfikujący, a najlepiej kilka okresów weryfikujących.Sigmalko pisze:Tzn. zamiast nauczyć się czegoś z historii, wykryć powtarzalne wzorce, to ją zwyczajnie na głupa zapamięta i nijak tego użyjemy w realu ?green7 pisze: łatwo tu przeoptymalizować i dostosować się do historii, co też niechybnie taki AG by zrobił.Ale wtedy to funkcja przystosowania wykazałaby, że dany wzorzec pozwolił w ciągu 10 lat na tylko 3 trejdy... Jeżeli FP karałaby za zbyt rzadkie zagrania, to unikniemy przeoptymalizowania?
uzywanie alg. genetycznych w ktorych jest do 10 genow dwustanowych, nie ma zadnego sensu. Zwyklym optymalizerem przelecisz to (w koncu to tylko 1024 kombinacje) i stracisz mniej czasu niz na zrozumienie tego
Po drugie, jezeli kombinujesz takie proste zasady(mozesz nawet bardziej skomplikowane), to masz mozliwosc uzywania algorytmow gentetycznych w samym testerze. (Jezeli faktycznie nie znasz sie na tym, to nie osiagniesz gorszych wynikow, a moze i lepsze na tym testerze).
Dopiero gdy chesz uzywac AG do jakis bardziej zaawansowanych zadan optymalizaycjnych niz samo kup/sprzedaj itp. to mozesz dopiero myslec o zglebieniu tego tematu.

Po drugie, jezeli kombinujesz takie proste zasady(mozesz nawet bardziej skomplikowane), to masz mozliwosc uzywania algorytmow gentetycznych w samym testerze. (Jezeli faktycznie nie znasz sie na tym, to nie osiagniesz gorszych wynikow, a moze i lepsze na tym testerze).
Dopiero gdy chesz uzywac AG do jakis bardziej zaawansowanych zadan optymalizaycjnych niz samo kup/sprzedaj itp. to mozesz dopiero myslec o zglebieniu tego tematu.
Acha. I właśnie w ten sposób łatwo możesz znaleźć strategię o skuteczności 100% która zdominuje całą populację.Sigmalko pisze:Pewnie ani jeden osobnik nie będzie miał skuteczności 100%, więc wynikiem funkcji przystosowania będzie % zwycięstw względem wszystkich zagrań. Im wyższy % zwycięstw tym osobnik bardziej przystosowany.
Problem w tym, że np. odpali ona jedną jedyną transakcję na cały okres testowy

No widzisz ... i tu sam dochodzisz do wniosku, że funkcja przystosowania nie będzie taka prosta. Sam % skuteczności to za mało. Trzeba jeszcze przyjąć jakieś zasady co do ilości trejdów. I być może innych parametrów np. RR, DD, SharpRatio, długość trwania trejdu itd.Sigmalko pisze:Ale wtedy to funkcja przystosowania wykazałaby, że dany wzorzec pozwolił w ciągu 10 lat na tylko 3 trejdy... Jeżeli FP karałaby za zbyt rzadkie zagrania, to unikniemy przeoptymalizowania?
Bo co Ci po "świetnych" strategiach odpalających dużo transakcji, które przez 90% czasu były na - i tylko cudem pod koniec testu wyszły na swoje ....
Na ff bodaj są posty gościa który robi coś podobnego. O ile pamiętam ciut inaczej to ujął. Do AG wprowadził zdarzenia.Sigmalko pisze:Na 16-bitowym genie pewnie nie poprzestaniemy, oprócz:
- ostatnich N świeczek,
- na każdym instrumencie,
pewnie trzeba będzie włączać do genu takie informacje, jak:
- obecność danych makro przed / po w czasie X h
- interwały czasowe, których dotyczą świeczki
- może wartości jakichś wskaźników / np. średnia kroczącą / ATR?
- godzina / dzień tygodnia
Zdarzenie to np.
- ogłoszenie danych
- pojawienie się na wykresie nowego LL, HH
- otwarcie sesji giełdowej
- przecięcie Pivota
Itd. itp.
Dodatkowo niektóre zdarzenia mogłyby mieć dodatkowe parametry. Powiedzmy masz zdarzenie "przecięcie 2 średnich" z parametrami tych średnich (typ każdej, okres itd.)
Ogłoszenie danych mogłoby mieć parametr w zakresie np. od -60 do +60 opisujący ile czasu jest przed po ogłoszeniu itd.
Nie, raczej nie ma takich ograniczeń. Oczywiście prócz wydajnościowych komputera.Sigmalko pisze:Są jakieś wytyczne, że jeżeli np. jest 16-bitow na gen, to chromosom nie powinien mieć więcej niż np. 8 genów?
Właśnie. Z tym, że AG to nie NN. I moim zdaniem wprowadzenie jednego okresu weryfikacji nic tu nie da. Bo jakby to miało działać ? Odpalasz AG, znajdujesz najlepszych osobników i zapuszczasz ich na okres testowy. Jeśli nie działają to co ? Robisz to samo ponownie.Dakhr pisze: z łatwościa Ci taki algorytm znajdzie wzorzec, który bedzie grał czesto i zarabiał w teorii tysiące pipsów na danych testowych, a w realu juz nie .Żeby to ominąć trzeba stosować weryfikacje, to znaczy ze dane podzielic na okres testowy i okres weryfikujący, a najlepiej kilka okresów weryfikujących.
Ale przecież w ten sposób robisz prawie dokładnie to samo co gdybyś puścił AG na cały okres. Znowu mamy tu przeoptymalizowanie.
Niektórzy rozwiązują to tak: mamy okres testowy i weryfikujący, sprawdzamy parametry strategi w obu tych okresach. Tzn. jeśli w testowym miała np. skuteczność 60% to podobnej skuteczności oczekujemy w okresie weryfikacji (oczywiście parametry oceny mogą być tu różne, znowu np: DD, ilość transakcji itd). Następnie jeśli strategia przejdzie ten test to odpala się ją np. na demie. Czyli de facto jest to 2 okres weryfikacji. Jeśli parametry nadal się utrzymają przechodzimy na real. To w sumie trzeci okres testowy. Bywa bolesny

Właśnie. Jak pisałem: najpierw by trzeba dokładniej zdefiniować problem, który chce się rozwiązać.LowcaG pisze:uzywanie alg. genetycznych w ktorych jest do 10 genow dwustanowych, nie ma zadnego sensu. Zwyklym optymalizerem przelecisz to (w koncu to tylko 1024 kombinacje) i stracisz mniej czasu niz na zrozumienie tego
Moim zdaniem AG mają spory potencjał. Ale obawiam się, że jego wykorzystanie wymaga naprawdę sporego nakładu pracy.
Spory nakład pracy. Ale uważam, że ostateczne korzyści z tej AG nie osięgniemy dopiero na samym końcu prac, tylko w trakcie. Może zbuduję sobie najpierw eksperymentalnie prostą AG, która na wstępie określi mi czy opłaca się zagrać zgodnie z trendem, gdy w ciągu ostatnich n świeczek była taka a nie inna sekwencja % stopy zwrotu i zobaczę, czy coś z tego wyjdzie....
No wlasnie o tym pisalem, po co? Skoro tworzysz proste EA gdzie jako parametry podajesz te "geny" odpalasz tester, optymalizacje, algorytmy genetyczne i masz wynik.Sigmalko pisze:Może zbuduję sobie najpierw eksperymentalnie prostą AG, która na wstępie określi mi czy opłaca się zagrać zgodnie z trendem, gdy w ciągu ostatnich n świeczek była taka a nie inna sekwencja % stopy zwrotu i zobaczę, czy coś z tego wyjdzie....
Lepiej bym tego nie ujął ,o taka weryfikacje mi właśnie chodziłogreen7 pisze:Niektórzy rozwiązują to tak: mamy okres testowy i weryfikujący, sprawdzamy parametry strategi w obu tych okresach. Tzn. jeśli w testowym miała np. skuteczność 60% to podobnej skuteczności oczekujemy w okresie weryfikacji (oczywiście parametry oceny mogą być tu różne, znowu np: DD, ilość transakcji itd).Dakhr pisze: z łatwościa Ci taki algorytm znajdzie wzorzec, który bedzie grał czesto i zarabiał w teorii tysiące pipsów na danych testowych, a w realu juz nie .Żeby to ominąć trzeba stosować weryfikacje, to znaczy ze dane podzielic na okres testowy i okres weryfikujący, a najlepiej kilka okresów weryfikujących.
