Upload
marek-gad
View
819
Download
1
Embed Size (px)
DESCRIPTION
Każdy system transakcyjny zawiera określony zestaw zasad, wg których otwierane i zamykane są długie i krótkie pozycje. Zasady te zazwyczaj wymagają wprowadzenia parametrów, od których zależeć będzie moment wygenerowania sygnału kupna lub sprzedaży. Zmiana tych parametrów spowoduje również zmianę dochodowości całego systemu, dlatego kluczowa jest ich optymalizacja.
Citation preview
Marek Gąd
MQL Advisors
www.mqladvisors.com
Najczęściej popełniane błędy podczas optymalizacji systemu
transakcyjnego w programie MetaTrader4.
Spis treści
1. Wprowadzenie .................................................................................................................... 3
2. Błędy wynikające z konstrukcji testera ............................................................................... 3
2.1. Modelowanie kursu wewnątrz świec .......................................................................... 3
2.2. Model brokera ............................................................................................................. 6
2.3. Slippage ........................................................................................................................ 7
2.4. Algorytm genetyczny ................................................................................................... 8
3. Błędy interpretacyjne .......................................................................................................... 8
3.1. Analiza wykresu optymalizacji ..................................................................................... 8
3.2. Optymalizacja wielu okresów .................................................................................... 10
3.3. Analiza equity line ...................................................................................................... 10
3.4. Poziom i waluta depozytu początkowego ................................................................. 11
4. Podsumowanie .................................................................................................................. 12
1. Wprowadzenie
It would be nice to develop trading systems without giving a thought to optimization.
Realistically, however, the development of a profitable trading strategy is a trial-and-error
activity in which some form of optimization always plays a role.
- J. Katz, D McCormick
Każdy system transakcyjny zawiera określony zestaw zasad, wg których otwierane
i zamykane są długie i krótkie pozycje. Zasady te zazwyczaj wymagają wprowadzenia
parametrów, od których zależeć będzie moment wygenerowania sygnału kupna lub
sprzedaży. Zmiana tych parametrów spowoduje również zmianę dochodowości całego
systemu, dlatego kluczowa jest ich optymalizacja.
Najpopularniejszy program do handlowania na Forexie, MetaTrader, udostępnia narzędzie
do testowania i optymalizowania strategii napisanych w języku MQL na danych
historycznych. Tester nie jest jednak pozbawiony wad, istnieje więc zagrożenie, że strategia,
która po optymalizacji wykazuje wspaniałe historyczne zyski, w rzeczywistości wyczyści konto
nieuważnego tradera. Innym zagrożeniem są również błędy w interpretacji otrzymanych
wyników.
2. Błędy wynikające z konstrukcji testera
2.1. Modelowanie kursu wewnątrz świec
Tester optymalizuje strategie wykorzystując dane historyczne. Jedyne dane o cenach każdej
świecy, które posiada, to poziom otwarcia, zamknięcia, maksymalny i minimalny.
Zachowanie kursu pomiędzy otwarciem a zamknięciem musi być więc modelowane.
MetaTrader umożliwia wybranie jednego z trzech sposobów:
Każdy tick,
Kontrola punktów,
Tylko ceny otwarcia.
Trzeci ze sposobów jest użyteczny tylko dla strategii, która generuje sygnały wyłącznie
w oparciu o ceny otwarcia świec i pozwala na znaczne skrócenie procesu optymalizacji, ale
jest bezużyteczny w każdym z innych przypadków. Metoda kontroli punktów modeluje
zachowanie kursu na podstawie danych z najbliższego krótszego okresu czasowego, np. dla
świec jednogodzinnych użyte zostaną dane trzydziestominutowe. Ta metoda daje tylko
bardzo uproszczone wyniki i w zasadzie powinna być wykorzystywana np. podczas
pierwszego testu strategii w trybie wizualnym, aby sprawdzić, czy sygnały są generowane
prawidłowo.
Najbardziej dokładna metoda, każdy tick, wykorzystuje najmniejszy dostępny przedział
czasowy do modelowania zachowań kursu wewnątrz świecy. Najczęściej są to dane
jednominutowe, gdyż poszczególne ticki nie są udostępniane przez dostawców notowań,
a sam MetaTrader nie przechowuje tych danych napływających w czasie rzeczywistym
z wyjątkiem krótkiego przedziału czasowego (widocznego np. podczas własnoręcznego
wystawiania zleceń), ale dane te są systematycznie usuwane wraz z pojawianiem się nowych.
Wynika stąd pewien problem. Wykorzystanie danych jednominutowych zamiast ticków
sprawia, że testowanie jakiegokolwiek systemu skalpingowego lub docelowo mającego
handlować na wykresie jednominutowym mija się z celem. W racji tego, że nie istnieją dane
mogące wskazać na zachowanie kursu wewnątrz świecy 1M, kurs w przybliżeniu
modelowany jest w następujący sposób:
1. Rozpoczęcie na poziomie otwarcia,
2. Powolne „rozpychanie” świecy w kierunku minimum i maksimum,
3. Zakończenie na poziomie zamknięcia.
Rysunek 1. Przykład modelowania kursu w świecy jednotickowej
Źródło: Opracowanie własne
Załóżmy, że w przykładzie zobrazowanym na rysunku 1 testowany system w momencie
otwarcia wystawił zlecenie buy stop na poziomie nieco powyżej późniejszego kursu
zamknięcia ze stop loss poniżej otwarcia. Podczas testowania zlecenie to zostanie wykonane,
a następnie automatycznie zamknięte z powodu osiągnięcia poziomu stop loss.
W rzeczywistości jednak kurs mógł po otwarciu spaść do minimum, później wzrosnąć do
maksimum i łagodnie opaść do zamknięcia. W takiej sytuacji zlecenie zostanie wykonane, ale
wraz z zamknięciem świecy pozostanie otwarte, gdyż stop loss nie został osiągnięty.
Wynik podany przez tester dla tej strategii miałby więc niewiele wspólnego z rzeczywistością,
a optymalizator wskazałby na parametry pozwalające wyeliminować wpływ modelowania
kursu, a nie na najlepsze pod względem rzeczywistej dochodowości systemu. Jedyny sposób
na poradzenie sobie z tym problemem to odpowiednie dostosowanie kodu strategii tak, aby
zachowanie kursu wewnątrz świecy nie było kluczowym czynnikiem generującym sygnały
kupna/sprzedaży.
Problem nie dotyczy jednak wyłącznie świec jednominutowych. Załóżmy, że trader chce
zoptymalizować strategię opartą na świecach godzinowych w okresie 01.01.2005 –
31.12.2011. Tester w chwili uruchomienia wyszuka najniższe dostępne świece pokrywające
ten okres w celu modelowania świec jednogodzinnych.
Brokerzy zazwyczaj nie udostępniają jednak tak dużych baz danych świec jednominutowych.
Istnieje więc możliwość, że do modelowania użyte zostaną świece pięcio-, piętnasto- lub
trzydziestominutowe. Istnieje nawet możliwość, że tester wykorzysta tylko dane godzinowe,
modelując kurs tak jak zobrazowane jest to na rysunku 1. Aby zapewnić najwyższą jakość
modelowania, konieczne jest posiadanie szerokiej bazy danych świec jednominutowych.
MetaTrader umożliwia importowanie zewnętrznych danych z plików tekstowych lub CSV.
Dane takie można ściągnąć za darmo z kilku serwisów forexowych (np.
http://www.forextester.com/data/datasources.html). Istnieje jednak możliwość, że
zaimportowane dane jednominutowe nie będą się pokrywać z wyższymi przedziałami
czasowymi (np. wykres jednominutowy przekroczył maksimum świecy jednogodzinnej z tego
samego przedziału czasowego). W takim wypadku tester odrzuci wartości jednominutowe,
obniżając jakość modelowania. Aby poradzić sobie z tym problemem, należy wykorzystać
skrypt dostarczany standardowo z każdym terminalem o nazwie period_converter na
wykresie jednominutowym i jako parametr wpisać żądany okres świecy jako wielokrotność
jednej minuty (np. dla jednogodzinnych świec będzie to 60, dla jednodniowych 1440).
Uzyskane w ten sposób dane zapewnią najwyższą jakość modelowania kursu.
MetaTrader umożliwia dokonanie własnej analizy jakości modelowania. W momencie
uruchomienia testera program generuje szereg czasowy, który jest wykorzystywany podczas
testu i optymalizacji. W celu pokazania go na wykresie, należy wybrać Plik -> Otwórz offline,
a następnie znaleźć interesujący nas przedział czasowy i symbol. Dane generowane przez
tester posiadają oznaczenie G. Przedstawia to rysunek 2.
Rysunek 2 Otwieranie danych generowanych
Źródło: MetaTrader
Jeśli otrzymany wykres będzie się charakteryzował długimi ruchami kursu w linii prostej, to
jakość modelu jest niska, natomiast częsta zmiana kierunku ruchu wskazuje na wysoką
jakość. Przykład dobrego modelowania przedstawia rysunek 3.
Rysunek 3 Przykład dobrego modelowania jednej świecy 5M
Źródło: MetaTrader
2.2. Model brokera
Kolejny problem, niezależny od użytkownika i MetaTradera, wynika z rodzaju konta, na
którym docelowo ma działać dany system. Najpopularniejszym obecnie jest model market
maker, w którym broker jest stroną transakcji. Zazwyczaj posiadanie takiego konta nie wiąże
się z jakimikolwiek opłatami lub prowizjami, a broker zarabia wyłącznie na spreadzie.
Model ten posiada dwa warianty. W jednym z nich spread pozostaje na stałym poziomie,
w drugim natomiast podlega ciągłym zmianom. Ponieważ terminal nie przechowuje
historycznych danych dotyczących wielkości spreadu, podczas testowania i optymalizacji
przyjmowany jest jego aktualny poziom. Jeśli obecnie jest on wyjątkowo niski, to wyniki
zwracane przez tester będą zawyżone w stosunku do rzeczywistości, a jeśli wysoki –
zaniżone. Dla najbardziej płynnych par walutowych o niskim średnim spreadzie błędy będą
niewielkie, jednak dla pozostałych może znacznie zafałszować obraz dochodowości strategii.
Największy problem pojawia się jednak, jeśli korzystamy modelu NDD (no dealing desk).
Broker nie występuje tutaj jako strona transakcji i nie ustala kursu – ceny podawane są
w czasie rzeczywistym z rynku międzybankowego. W tym modelu broker pobiera prowizję od
każdej transakcji, uzależnioną od wielkości pozycji.
Rozważmy więc system, który uzależnia wielkość pozycji od ekspozycji na ryzyko strat. Każde
zlecenie naraża tradera na stratę w wysokości 1% kapitału. W tym systemie wielkość pozycji
będzie odwrotnie proporcjonalna do szerokości przedziału kurs otwarcia pozycji – poziom
stop loss (wyrażonego jako wartość dodatnia).
W modelu NDD broker nalicza prowizję dopiero po otworzeniu pozycji. Język MQL nie
dostarcza narzędzi pozwalających na uzyskanie jej wysokości w momencie wyliczania ilości
lotów, co sprawia, że faktyczna ekspozycja na ryzyko wynosi 1% kapitału + prowizja.
Wyniki zwracane przez tester nie uwzględniają prowizji. Sprawia to, że w modelu NDD
strategia będzie zawsze przynosić gorsze rezultaty niż wynikało by to z optymalizacji na
danych historycznych. Sposobem rozwiązania tego problemu może być wprowadzenie do
kodu strategii modelu symulacji wielkości prowizji przed otwarciem zlecenia i wliczenie jej do
ekspozycji na ryzyko. Nie jest to jednak sposób doskonały, gdyż spowoduje to obniżenie
średniej wielkości pozycji w rzeczywistym handlu w stosunku do wyników testera na danych
historycznych, a tym samym niższa będzie dochodowość strategii. Jedynym skutecznym
sposobem jest jednak po prostu niewykorzystywanie modelu NDD.
2.3. Slippage
Na bardzo płynnych rynkach, między chwilą wysłania zlecenia buy lub sell a jego realizacją,
kurs może się zmienić, powodując otwarcie pozycji na poziomie innym niż pożądany. Ma to
szczególne znaczenie dla strategii skalpingowych i grających na niewielkich zmianach kursu
wysokimi lotami.
Jednym z parametrów funkcji OrderSend() jest tzw. slippage. Określa on maksymalne
odchylenie kursu (w pipsach wyrażonych liczbą całkowitą) od poziomu z chwili wysłania
zlecenia z egzekucją rynkową (zlecenia oczekujące z reguły wykonywane są po danej cenie,
ponieważ serwer brokera już je zarejestrował wcześniej, nie występują więc opóźnienia).
Podczas testowania i optymalizacji strategii tester zawsze otwiera zlecenia po cenie z danej
chwili, odchylenia zawsze wynoszą więc 0.
Konieczna staje się więc analiza wrażliwości strategii na możliwe odchylenia od cen
rynkowych. Najlepszym narzędziem umożliwiającym jej przeprowadzenie jest arkusz
kalkulacyjny, do którego importujemy historię wykonanych przez tester zleceń
i modyfikujemy ceny otwarcia tak, abyśmy uzyskali kilka wariantów pesymistycznych, czyli
zakładających np. średnie odchylenie od ceny rynkowej w wysokości 1 lub 2 pipsów.
Następnie sprawdzamy, czy w istotnym stopniu wpłynęło to na wyniki osiągane przez daną
strategię przy danych parametrach wejściowych.
2.4. Algorytm genetyczny
Podczas optymalizacji w opcjach domyślnie zaznaczona jest opcja wykorzystywania
algorytmu genetycznego. Zasada jego działania w prostych słowach jest następująca – jeśli
tester wykryje po raz pierwszy kombinację parametrów, przy której system jest dochodowy,
to cały dalszy proces będzie bazował na tej właśnie kombinacji. Pozwala to na znaczną
redukcję ilości przebiegów, a tym samym ograniczenie czasu trwania optymalizacji.
Istnieje jednak zagrożenie, że algorytm pominie w ten sposób kombinacje, które
w rzeczywistości przyniosły by bardzo dobre wyniki. Istnieje kilka sposobów na rozwiązanie
tego problemu:
Całkowita rezygnacja z algorytmu genetycznego – jest to sposób drastyczny, gdyż
powoduje, że próbie poddane będą wszystkie możliwe kombinacje parametrów, co
może oznaczać znaczny czas trwania całego procesu,
Zmniejszenie ilości możliwych kombinacji – spowoduje to, że algorytm pominie
procentowo mniej kombinacji,
Przeprowadzenie kilku optymalizacji, za każdym razem wybierając inny parametr
optymalizacji – otrzymane w ten sposób rezultaty można następnie połączyć
i analizować łącznie, np. w Excelu.
3. Błędy interpretacyjne
3.1. Analiza wykresu optymalizacji
Jednym z najczęstszych problemów początkujących traderów jest wybieranie parametrów,
które dają najwyższy zysk, nie uwzględniając faktu, że niewielkie zmiany wartości
parametrów w znaczny sposób wpływają na skuteczność systemu.
Najłatwiejszym sposobem na uniknięcie takiego błędu jest analiza wykresu optymalizacji.
Jeśli optymalizujemy tylko jeden parametr, wykres wyglądać będzie tak, jak na rysunku 4.
Rysunek 4 Przykład wykresu optymalizacji jednego parametru
Źródło: MetaTrader
Powyższy przykład posiada dwa maksima, jedno w przebiegu drugim, drugie w przebiegu
szesnastym. Jeśli wykorzystując parametr z pierwszego maksimum zmniejszymy go lub
zwiększymy o jeden krok, to system nadal będzie zyskowny. Jeśli natomiast wykorzystamy
drugie maksimum, to przy zmniejszeniu parametru o jeden krok system nadal sprawuje się
dobrze, ale zwiększenie o krok spowoduje spadek poniżej początkowego depozytu.
Wykorzystany powinien być zatem parametr z pierwszego maksimum, gdyż wtedy system
jest mniej wrażliwy na zmianę sytuacji rynkowej.
Rysunek 5 Przykład wykresu optymalizacji dwóch parametrów
Źródło: MetaTrader
Jeśli optymalizowane są dwa parametry, wykres przyjmuje wygląd zaprezentowany na
rysunku 5. Najciemniejszy kolor posiadają kombinacje najbardziej dochodowe,
a najjaśniejszy – najmniej. Przytoczony przykład posiada trzy kombinacje, dla których system
jest najbardziej dochodowy – (5,5;9,5), (7;8) i (7;10). Różnica w zysku, jak również innych
wynikach, takich jak największa strata, jest niewielka, trader staje więc przed koniecznością
wybrania jednej z trzech kombinacji. Wykorzystując tok myślenia taki sam jak w przypadku
jednego parametru, gracz powinien wybrać kombinację pierwszą, gdyż dochodowość jest
wtedy najmniej wrażliwa na zmiany parametrów.
Co jednak zrobić, jeśli optymalizacji poddawanych są więcej niż dwa parametry? Najbardziej
efektywnym sposobem jest stworzenie wykresów optymalizacji dla wszystkich kombinacji
par parametrów. Dla trzech parametrów będzie ich trzy, dla czterech – sześć, dla pięciu –
dziesięć itp. Następnie dla każdej pary wybiera się najlepszy i najmniej wrażliwy zestaw
i, porównując otrzymane wyniki, wybiera najbardziej skuteczny zestaw parametrów strategii.
3.2. Optymalizacja wielu okresów
Optymalizując system na danych historycznych otrzymujemy zestaw parametrów, dla
którego strategia osiągnęła najlepszy wynik dla przeszłych warunków rynkowych. Następnie
parametry te docelowo użyte zostają w handlu w czasie rzeczywistym. Aby sprawdzić, czy
proces ten pozwala na dobre przewidywanie optymalnych parametrów, należy dokonać
optymalizacji dla wielu okresów. Zobrazowane zostało to na rysunku 6.
Rysunek 6 Optymalizacja dla wielu okresów
Źródło: Opracowanie własne
Podejście to symuluje wykorzystywanie parametrów z optymalizacji na podstawie przeszłych
okresów w przyszłym handlu. Przykład: optymalizujemy system w okresie 1.01.2011 –
31.03.2011, a otrzymane parametry wykorzystujemy do testu w okresie 1.04.2011 –
30.04.2011. Następnie powtarzamy tę czynność wielokrotnie, za każdym razem przesuwając
okresy o jeden miesiąc w przód. Zestawiając łącznie wyniki z testów jako ciągły proces (np.
w Excelu) możemy sprawdzić, czego należy się spodziewać od systemu w rzeczywistym
handlu i czy optymalizacja rzeczywiście pozwala na ustalanie parametrów odpowiednich do
stosowania w czasie rzeczywistym.
3.3. Analiza equity line
Często popełnianym błędem jest przyjęcie zoptymalizowanych parametrów bez sprawdzenia
wyglądu equity line dla danego zestawu. Dwa przykłady wyglądu linii kapitału przedstawia
rysunek 7 i 8.
Rysunek 7 Przykład niepożądanej linii kapitału
Źródło: MetaTrader
Rysunek 8 Przykład pożądanej linii kapitału
Źródło: MetaTrader
W oba systemy są zyskowne, jednak w pierwszym przypadku trader powinien natychmiast
odrzucić ten zestaw parametrów i spróbować innego zestawu sugerowanego przez tester.
Linia kapitału zachowuje się chaotycznie, skokowo wzrastając i opadając, a seria dwóch
zleceń stratnych (12-13) prawie całkowicie zniweczyła poprzedzającą ją serię czterech
transakcji zyskownych (8-11). Zachodzi więc podejrzenie, że system ten może dla różnych
okresów czasu przynosić zupełnie różne rezultaty.
Drugi przypadek jest przykładem pożądanej linii kapitału. Długie serie zysków są przecinane
krótkimi seriami strat, a zyski osiągane są równomiernie i stabilnie. Tego typu system
teoretycznie będzie przynosił podobne zyski w różnych okresach czasu.
3.4. Poziom i waluta depozytu początkowego
Poziom depozytu początkowego powinien odpowiadać kapitałowi tradera. Wynika to z faktu,
że najczęściej stosowany jest algorytm zarządzania wielkością pozycji powodujący stałą
ekspozycję kapitału na ryzyko strat wyrażony procentowo. Może się więc okazać,
w przypadku niskiego depozytu, że dla danego zlecenia maksymalna wielkość pozycji wynosi
0,08 lota w przypadku, gdy minimalny lot wynosi 0,1. W takim wypadku serwer odrzuci
zlecenie. Jeśli natomiast podczas optymalizacji trader ustawi poziom depozytu na dużo
wyższym poziomie, to w wynikach transakcje tego typu zostaną uwzględnione, gdyż wielkość
pozycji będzie wyższa od minimalnej, co spowoduje, że wyniki tej optymalizacji nie będą
miały odniesienia do efektywności systemu w handlu rzeczywistym.
Tester pozwala również na ustalenie dowolnej waluty depozytu. Lista czterech walut,
proponowana standardowo przez MetaTradera, nie jest listą zamkniętą, gdyż można wpisać
trzyliterowy symbol dowolnej waluty (np. PLN). Rozwiązanie to nie jest pozbawione wad,
gdyż wyliczanie zysku oparte jest na ostatnim znanym kwotowaniu odpowiedniej pary (np.
USDPLN czy EURPLN), a nie rzeczywistym kursie w momencie rozliczenia transakcji. Jeśli
jednak strategia jest wyposażona w algorytm wyliczający zmienną wielkość pozycji, to
wpisanie odpowiedniej waluty depozytu da bardziej odpowiadające rzeczywistej
dochodowości systemu rezultaty.
4. Podsumowanie
Tester strategii, w który wyposażony jest MetaTrader jest narzędziem bardzo prostym
w obsłudze, ale niedoświadczonego tradera może w łatwy sposób doprowadzić do utraty
całego depozytu. Do analizy wyników optymalizacji i backtestingu należy podejść z dużą dozą
obiektywizmu i wiedzą na temat sposobu działania testera. Należy również opanować
początkową chęć rozpoczęcia handlu prawdziwymi pieniędzmi, jeśli system osiąga wspaniałe
wyniki na danych historycznych. Najlepiej jest uruchomić go najpierw na koncie demo i na
bieżąco analizować zawierane transakcje i zyskowność systemu, gdyż, jak pozuje własne
doświadczenie, wtedy twórca systemu otrzyma najbardziej obiektywne wyniki własnej
strategii.