Algorytm genetyczny do spekulacji

Jeżeli masz pomysł lub używasz ciekawego systemu albo strategii gry, opisz ja tutaj.
Awatar użytkownika
Sigmalko
Stały bywalec
Stały bywalec
Posty: 40
Rejestracja: 20 sty 2010, 17:15

Nieprzeczytany post autor: Sigmalko »

green7 pisze: A po co tak ? Nie lepiej przyjąć np. że:
- 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 ....
Ale 1 taki gen powie mi:
- Kup jeśli 4-ta świeczka wstecz wzrosła o 0,50%
albo
- Kup jeśli 3-cia świeczka wstecz wzrosła o 0,50%

Jeżeli będę miał chromosom z dwóch genów, to mogę mieć geny mówiące:
- sprzedaj, gdy 3-cia świeczka wstecz wzrosła o 1,50%
- kup, gdy 2-ga świecza wstecz wzrosła o 0,5%

jeden gen mówi, żeby sprzedawać, drugi, żeby kupować :) Taki chromosom powinien sprowokować kupno czy sprzedaż, a może nic nie powinien robić... i dopiero chromosom:
- kup, gdy 3-cia świeczka wstecz wzrosła o 1,50%
- kup, gdy 2-ga świecza wstecz wzrosła o 0,5%
wygeneruje sygnał kupna, bo wszystkie geny są za kupowaniem w takim przypadku.

Zastanawiam się, czy operację do wykonania należy wrzucać w geny i czekać aż wszystkie geny powiedzą to samo, czy zrobić to jakoś inaczej, np. jeśli choć >80% genów mówi o kupnie, to kupujemy, czy może lepiej zrobić na boku osobny gen, który zawiera tylko operację, a pozostałe geny są tylko parametrami.

Dodano po 4 minutach:

Chyba prościej będzie, gdy geny nie będą miały operacji (kup/sprzedaj/nic nie rób), a jedynie informację o świeczkach. Chromosom określający osobnika mówiłby tylko:
- 3-cia świeczka wstecz wzrosła o 1,50%
- 2-ga świeczka wstecz wzrosła o 0,50%

Potem tworzę dwie oddzielne populacje, jedna zawsze kupuje, druga zawsze sprzedaje.

Automatycznie odfiltrują się te osobniki, które tracą i zostaną mi tylko zyskowne wzorce.

wojnowy
Stały bywalec
Stały bywalec
Posty: 63
Rejestracja: 24 wrz 2010, 10:09

Nieprzeczytany post autor: wojnowy »

Albo ja czegoś nie rozumiem albo coś tu jest nie tegez... Jak wśród zmiennych optymalizowanych mogą być "zmienne" podejmujące decyzję?!? Co to znaczy, że:
bit 1: 0 nie rób nic, 1 kupuj (ewentualnie dodajesz jeszcze 1 bit oznaczający sprzedaj)
Decyzje o ewentualnym otwarciu/zamknięciu pozycji powinna być wpisana w funkcję celu. Przykładowo, gdy funkcją celu jest zysk to żeby go obliczyć trzeba najpierw opisać kiedy otwieramy a kiedy zamykamy pozycję (czyli najpierw tworzymy jakąś strategię). Oczywiście te decyzje (ta strategia) powinny zależeć w dużym stopniu od zmiennych, które optymalizujemy.
Innymi słowy funkcja celu jest zależna od zmiennych, które optymalizujemy (f(X1,X2,X3...) a otwarcie/zamknięcie pozycji jest częścią funkcji.

Druga sprawa to takie podejście jest bez sensu. Jeśli strategia opiera się tylko na wiedzy czy dany słupek wzrósł czy zmalał to sytuacja, kiedy jeden słupek wzrósł o 5 pipsów a drugi spadł o 100 pipsów jest równoważna z sytuacją, gdy jeden słupek wzrósł o 50 pipsów a drugi spadł o 3 pipsy -> konsekwencja waszego kodowania. Wówczas rzeczywiście liczba kombinacji jest tak banalnie krótka, że nawet na kalkulatorze można sobie wszystko policzyć :]

Jeżeli to ma mieć jakiś sens to może zastanów się czy nie lepiej kodować swoich zmiennych liczbami rzeczywistymi a nie binarnymi (lub przeznaczać większą liczbę bitów na dany słupek - np. 10). Pominę już fakt, że kodowanie liczbami rzeczywistymi nie dość, że jest bardziej praktyczne (wygodniej się tym operuje) to jest do tego bardziej wydajne w większości przypadków.

Większości wypowiedzi nie rozumiem - strasznie mieszasz pojęcia, których widać, że sam nie do końca rozumiesz - ale jeśli chodzi jedynie o szukanie formacji na rynku to zastanów się czy np. mapa Kohonena (jedna z odmian SSN) nie byłaby lepszym rozwiązaniem? Do tego sam sobie ustalisz liczbę wzorców, które sieć będzie mogła odnaleźć.

Algorytm Kohonena również jest bardzo prosty a w dodatku jest stosunkowo szybki.

Natomiast jak chcesz, żeby komputer za ciebie zrobił całą strategię to możesz się wgłębić w zagadnienie "programowania genetycznego". Niestety nie jest to już takie proste a w dodatku przydałaby Ci się dość duża moc obliczeniowa :D
Sigmalko pisze:Podejrzewam, że można to ugryźć bez tego całego teoretycznego tłuszczu.
Niestety tak się nie da! Do puki nie zrozumiesz idei AG masz małe szanse, że uda Ci się je wykorzystać w praktyce. Pomijam już pisanie takich dziwolągów jak to:
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]
Zacznij może od próby zrozumienia tej terminologii. Nie chcę bardziej namieszać bo różni autorzy różni to definiują ale to korzystając ze słów, które tu zostały wykorzystane to:
bit może reprezentować jakąś zmienną (binarną - 1/0) lub część zmiennej (patrz gen)
gen - zmienna zakodowana większą ilością bitów -> przykładowo zmienną, która przyjmuje kilka wartości możesz zakodować np. 3 bitami zaczynając od 0,0,0 a kończąc na 1,1,1. Jak masz jakąś zmienną która powinna być bardzo dokładna (np. przyjmująca wartości z zakresu (-10,10) z dokładnością do n-tego miejsca po przecinku to taką zmienną (gen) możesz kodować np. 30 bitami.
chromosom - to wszystkie zmienne (geny). Najczęściej się to obrazuje przez narysowanie każdej zmiennej koło siebie.

Teraz tak: jeśli masz strategię, która korzysta tylko z informacji o 10 słupkach z przeszłości to będziesz miał chromosom składający się z 10 genów a każdy gen będzie się składał z iluś tam bitów. Jak chcesz brać pod uwagę tylko informację czy słupek wzrósł czy spadł to każdy gen będzie się składał z 1 bit-u. Natomiast jak chcesz np. uwzględnić, że np. słupek wzrósł >= 0 i < 5 pipsów lub, że wzrost był >5 <= 10 pipsów lub >10 pipsów i analogicznie ze spadkami to będziesz musiał to zakodować przynajmniej 3 bitami.

Sposób kodowania oraz liczenie ile jest możliwości przy danej ilości bitów również jest banalnie prosty. Radziłbym Ci jednak zakupić jakiś podręcznik i jednak poświęcić trochę czasu na zbadanie tematu bo inaczej nic z tego nie wyjdzie...
Aha, i AG nic Ci nie mówią -> nie powiedzą Ci kiedy kupić a kiedy sprzedać! One jedynie optymalizują. Czyli jak masz już jakąś strategię, która Ci mówi kiedy kupić a kiedy sprzedać i jest ona zależna od iluś tam zmiennych to AG może ją tak zoptymalizować, że będzie Cię trafniej informować kiedy kupić a kiedy sprzedać.
Pozdrawiam
(\(^.^)/)

Dakhr
Stały bywalec
Stały bywalec
Posty: 76
Rejestracja: 14 lis 2009, 11:05

Nieprzeczytany post autor: Dakhr »

wojnowy pisze: Aha, i AG nic Ci nie mówią -> nie powiedzą Ci kiedy kupić a kiedy sprzedać! One jedynie optymalizują. Czyli jak masz już jakąś strategię, która Ci mówi kiedy kupić a kiedy sprzedać i jest ona zależna od iluś tam zmiennych to AG może ją tak zoptymalizować, że będzie Cię trafniej informować kiedy kupić a kiedy sprzedać.
Pozdrawiam
Ahh powiedzą, powiedzą jak zakodujesz w chromosomie, np sygnały techniczne,fundamentalne i zoptymalizują ci to pod wzgledem profitu ilosci tranzakcji ,drawdown ,sharpe ratio i co tam sobie tylko upchniesz w funkcje przystosowania.

Dodano po 10 minutach:
wojnowy pisze:Jeżeli to ma mieć jakiś sens to może zastanów się czy nie lepiej kodować swoich zmiennych liczbami rzeczywistymi a nie binarnymi (lub przeznaczać większą liczbę bitów na dany słupek - np. 10). Pominę już fakt, że kodowanie liczbami rzeczywistymi nie dość, że jest bardziej praktyczne (wygodniej się tym operuje) to jest do tego bardziej wydajne w większości przypadków.
Liczby rzeczywiste wydajne ??chyba tylko dla człowieka ,z punktu widzenia programistycznego i komputera latwiejsze i wydajniejsze jest manipulowanie bitami.

Dodano po 12 minutach:
wojnowy pisze:
Natomiast jak chcesz, żeby komputer za ciebie zrobił całą strategię to możesz się wgłębić w zagadnienie "programowania genetycznego". Niestety nie jest to już takie proste a w dodatku przydałaby Ci się dość duża moc obliczeniowa :D
Można to zrobić bez GP z ta różnica ,że sygnały sobie trzeba samemu zdefiniować, co moze byc pracochłonne przy genie zakodowanym np 8bitami jest to 256 sygnalow do zdefiniowania,natomiast GP samo zdefiniuje sygnały z podstawowych elementów składowych jak np: <,>,=,ema,MACD,SMA

wojnowy
Stały bywalec
Stały bywalec
Posty: 63
Rejestracja: 24 wrz 2010, 10:09

Nieprzeczytany post autor: wojnowy »

Dakhr pisze: Ahh powiedzą, powiedzą jak zakodujesz w chromosomie, np sygnały techniczne,fundamentalne i zoptymalizują ci to pod wzgledem profitu ilosci tranzakcji ,drawdown ,sharpe ratio i co tam sobie tylko upchniesz w funkcje przystosowania.
Nie wiem czy tu jest ironia czy ty tak poważnie...
Dakhr pisze: Liczby rzeczywiste wydajne ??chyba tylko dla człowieka ,z punktu widzenia programistycznego i komputera latwiejsze i wydajniejsze jest manipulowanie bitami.
Ty chyba nie rozumiesz problemu. Oczywiście, gdy masz zmienne, które przyjmują tylko dwie wartości to nie ma sensu się bawić w zmienne rzeczywiste (dlatego użyłem słowa "w większości przypadków").
Ale taki skrajny przykład: masz sieć neuronową i chcesz ją zoptymalizować. Każda waga sieci jest bardzo czuła i powinna przyjmować wartości z dokładnością np. 5 miejsc po przecinku z zakresu (-10,10). Łącznie daje to jakieś (10-(-10)*10000= 200 000 możliwych wartości (od -10,00000 do 10,00000).
Wiesz ile będziesz musiał do tego potrzebować zmiennych binarnych żeby to zakodować? dokładnie 17! Teraz zastanów się co jest bardziej wydajne: korzystanie z jednej zmiennej typu double (liczby rzeczywistej) czy korzystanie z 17 liczb typu bool?
Oczywiście pozostaje kwestia "łatwości". Wiesz ile trzeba zabawy, żeby liczbę typy: [0,1,1,1,0,0,1,0,...] (czyli coś zapisane binarnie) rozkodować?

Pomijam już fakt, że takie kodowanie umożliwi Ci korzystanie jedynie z liczb z zakresu od -10 do 10 z dokładnością do 5 miejsca po przecinku a w przypadku liczby typu double korzystasz z wartości od 2.2E-308 do 1.8E308. Do tego dochodzi jeszcze kwestia zapisania tych zmiennych w jakieś tablicy i wykonywania na nich obliczeń (np. mnożenia) -> w końcu musisz jakoś odkodować tą liczbę, którą zapisałeś w postaci binarnej co nie?

To oczywiście tylko część problemów związanych z kodowaniem liczb w aspekcie AG.
Pozdrawiam
(\(^.^)/)

Awatar użytkownika
Sigmalko
Stały bywalec
Stały bywalec
Posty: 40
Rejestracja: 20 sty 2010, 17:15

Nieprzeczytany post autor: Sigmalko »

Czy jest sens pakować do genów MACD, SMA, ATR i inne wskaźniki, w końcu wszystkie one gdzieś tam na końcu są pochodną ceny. To może w takim układzie optymalniej będzie zrobić np. 18 bitów, gdzie:

8 bitów pójdzie na indeks świeczki (czyli mamy do analizy 256 świeczek wstecz)

1 bit pójdzie na znak (wzrost / spadek)

9 bitów pójdzie na % zmianę świeczki z przeszłości (tej wskazanej 8-bitami), czyli mielibyśmy 512 wartości, je dzielimy na 100 i mamy % zmianę kursu względem świeczki poprzedniej.

Jest 18 bitów, czyli 262 144 możliwości.

I teraz taki będzie parametrem określającym jakąś świeczkę, nie późniejszą niż 256 do tyłu.

Teraz, jeśli mamy gen, to teraz ile świeczek chcemy analizować? Powiedzmy, że 20, to mamy 20 genów w chromosomie.


Tak jak mówisz, kupno/sprzedaż pójdzie do funkcji celu, tak jak oczekiwanie, że zysk ma być w ciągu np. 3 kolejnych świeczek.

Przepuszczam to przez historię i mam wyniki.

Potem jeśli się sprawdzi, to można dodać do genu indeks instrumentu, by można było optymalizować stosowanie korelacji między instrumentami.

Dodano po 20 minutach:

Ale to wsumie do bani, bo powstaną mi twory

KUP gdy:
1 świeczka # Wzrost o min. 1%
2 świeczka # Wzrost o min. 2%
3 świeczka # Wzrost o min. 1%
4 świeczka # Wzrost o min. 0,5%
5 świeczka # Wzrost o min. 0,5%
6 świeczka # Spadek o min. 1%

:(, czyli o wątpliwej wartości.



Może lepiej kodować zamiast świeczek, to ostatnie lokalne ekstrema?

Np:
- gdy [ostatnie] lokalne ektremum z zakresu [n] swieczek jest [szczytem] i jego cena różni się od [obecnej] o min [0,5%] i max [1%]

gdzie:
[ostatnie] = indeks ekstrema
[n] = ilość świeczek do zakresu
[szczyt] = szczyt / dno
[obecnej] = indeks świeczki do której porównujemy
[0,5%] = wartość w % albo pipsach
[1%] = wartość w % albo pipsach

Wtedy powstawały by mi twory w rodzaju:

Sprzedaj jeśli:
[gen 1] - obecna cena zbliża się do ostatniego szczytu, i dzieli nas od niego tylko 0,1%
[gen 2] - obecna cena jest oddalona o 161,8% od przed ostatniego ekstremum - dołka

Dodano po 49 sekundach:

Czy nie jest tak, że trudniejsze będzie tu zdefiniowanie tego co ma być w genach, niż określenie funkcji przystosowania?

Dakhr
Stały bywalec
Stały bywalec
Posty: 76
Rejestracja: 14 lis 2009, 11:05

Nieprzeczytany post autor: Dakhr »

Raczej chodziło mi o kodowanie wyrażeń symbolicznych i operacje mutacji i krossowania np ema20>ema30= 00001111 to nasz gen , robimy mutacje 10001111 i mamy np ema20>ema30 zrob to samo na rzeczywistych niewygodne prawda??

wojnowy
Stały bywalec
Stały bywalec
Posty: 63
Rejestracja: 24 wrz 2010, 10:09

Nieprzeczytany post autor: wojnowy »

Sigmalko zrozum! Ty nie masz czegokolwiek "pakować" do genów! Masz stworzyć strategię a później możesz zoptymalizować zmienne, z których będziesz korzystać w swojej strategii czyli mówiąc twoim żargonem "zapakować do genów".

Zrozum, że AG to nie jest sieć neuronowa, do której coś wrzucasz. AG jedynie optymalizuje. Czyli kolejność jest taka:
tworzysz swoją strategię (która korzysta z jakiś zmiennych) -> zmienne, które chcesz optymalizować (a które mają wpływ na przyjętą przez Ciebie funkcję celu) kodujesz np. do postaci binarnej -> optymalizujesz -> i cieszysz się (zazwyczaj) z przeoptymalizowanej strategii.
To jest na identycznej zasadzie jak AG w MT4. Póki tego nie rozumiesz korzystaj z tej funkcji. Niczego więcej niż ta funkcja dzięki AG nie osiągniesz (jedynie zoptymalizujesz już istniejącą strategię, która jest częścią Twojej funkcji).
(\(^.^)/)

Dakhr
Stały bywalec
Stały bywalec
Posty: 76
Rejestracja: 14 lis 2009, 11:05

Nieprzeczytany post autor: Dakhr »

wojnowy pisze:
Dakhr pisze: Ahh powiedzą, powiedzą jak zakodujesz w chromosomie, np sygnały techniczne,fundamentalne i zoptymalizują ci to pod wzgledem profitu ilosci tranzakcji ,drawdown ,sharpe ratio i co tam sobie tylko upchniesz w funkcje przystosowania.
Poważnie
wojnowy pisze:
Ty chyba nie rozumiesz problemu.
O innym problemie mówimy, nie znam sie na NN

wojnowy
Stały bywalec
Stały bywalec
Posty: 63
Rejestracja: 24 wrz 2010, 10:09

Nieprzeczytany post autor: wojnowy »

Dakhr pisze:Raczej chodziło mi o kodowanie wyrażeń symbolicznych i operacje mutacji i krossowania np ema20>ema30= 00001111 to nasz gen , robimy mutacje 10001111 i mamy np ema20>ema30 zrob to samo na rzeczywistych niewygodne prawda??
Nie wiem czy wiesz, ale jest jeszcze coś takiego jak kodowanie liczbami całkowitymi. Poza tym nie rozumiem o co Ci chodzi. Co to znaczy ema20>ema30 = 00001111? Gdyby to rozkodować to by wyszło:
Dakhr pisze:Raczej chodziło mi o kodowanie wyrażeń symbolicznych i operacje mutacji i krossowania np ema20>ema30= 15 to nasz gen , robimy mutacje 143 i mamy np ema20>ema30 zrob to samo na rzeczywistych niewygodne prawda??
Dakhr pisze: O innym problemie mówimy, nie znam sie na NN
Tu nie chodziło o NN - tu chodziło o wskazanie praktycznego problemu związanego z kodowaniem
(\(^.^)/)

Dakhr
Stały bywalec
Stały bywalec
Posty: 76
Rejestracja: 14 lis 2009, 11:05

Nieprzeczytany post autor: Dakhr »

Dakhr pisze: O innym problemie mówimy, nie znam sie na NN
wojnowy pisze: Tu nie chodziło o NN - tu chodziło o wskazanie praktycznego problemu związanego z kodowaniem
wojnowy pisze: Poza tym nie rozumiem o co Ci chodzi. Co to znaczy ema20>ema30 = 00001111?
Chodzi o praktyczne rozwiązanie problemu

ODPOWIEDZ