Budowa systemu transakcyjnego dla rynku kontraktów futures na indeks WIG20. ANNA CHUDOWSKA ADAM WOSIK WARSZAWA 2008
WSTĘP Przystępując do budowy systemu transakcyjnego musieliśmy najpierw opracować pewną wizję tego, na czym opierać się będzie nasz system. Postanowiliśmy skonstruować taki system, który będzie w stanie odróżnić siłę trendu rynkowego i następnie zastosować odpowiednie wskaźniki. System będzie mierzył siłę trendu w oparciu o wskaźnik ADX (Average Directional Movement Index). Wskaźnik ten niestety nie pokazuje kierunku trendu oraz działa z opóźnieniem, co ogranicza jego skuteczność w najbardziej interesujących inwestorów momentach odwrócenia trendu (formacjach V). Przyjmujemy jednak, że wartość ADX>=15 pokazuje silny trend, dodatkowo gdy ADX rośnie mamy do czynienia z coraz silniejszym trendem. ADX będzie więc pewnego rodzaju przełącznikiem pomiędzy wskaźnikami generującymi sygnały w okresie silnych trendów oraz wskaźnikami generującymi sygnały w okresach horyzontalnych. Wskaźnikiem generującym sygnały w silnych trendach w naszym systemie będą dwie wykładnicze średnie kroczące a dokładniej ich odpowiednie przecięcia. Oczywiście rozważyć możemy przecięcie trzech średnich lub zastąpienie średnich kroczących wskaźnikami DEMA bądź TEMA w celu eliminacji zbyt dużej liczby mylnych sygnałów (niestety dobre sygnały też zostaną ograniczone). To samo możemy osiągnąć poprzez odpowiednie wydłużenie okresów, z jakich mają być liczone średnie. W okresach, kiedy brak wyraźnego trendu na rynku, system powinien generować sygnały w oparciu o RSI (Relative Strenght Index) i Oscylator Stochastyczny. Wykorzystujemy dwa wskaźniki w celu uzyskania bardziej pewnych sygnałów. RSI powinien generować sygnały kupna gdy znajduje się w strefie wyprzedania (poniżej wartości 30) i wychodzi z niej (przebija od dołu linię 30). Sygnał sprzedaży powinien być generowany po opuszczeniu strefy wykupienia (przecięcie lini 70 od góry). Oscylator Stochastyczny będzie generował sygnał kupna przy wzroście wskaźnika ponad poziom wysprzedania (przyjmujemy wartość 10) a sygnał sprzedaży zostaje wygenerowany przy spadku wskaźnika poniżej poziomu wykupienia (przyjmujemy wartość 90). Możemy również rozważyć występowanie dywergencji. W systemie nie można zapomnieć o uwzględnieniu odpowiednich stopów. Nasz system na pewno będzie zawierał stop loss. Jego wielkość oraz ewentualnie użycie innych stopów i ich wielkości zostaną dobrane po części metodą prób i błędów. Parametry wykorzystywanych wskaźników dobrane zostaną na podstawie optymalizacji na danych
historycznych (FW20, okres od 20-01-1998 do 20-01-2006). Działanie systemu sprawdzimy na danych dla FW20 od 21-01-2006 do 16-05-2008. Pierwszym zbudowanym przez nas systemem, który spełniałby powyższe założenia był system, którego formuły wyglądały następująco: formuła kupna IF((ADX(OPT3)>=15 AND adx(opt3)>=ref(adx(opt3),-opt4)), Cross(Mov(c,opt1,e),Mov(c,opt2,e)), ((ALERT(CROSS(RSI(OPT5),30),OPT8) and CROSS(STOCH(opt6, opt7),10)) OR (ALERT(CROSS(STOCH(OPT6,OPT7),10),OPT8) and CROSS(RSI(OPT5),30)))) formuła sprzedaży IF((ADX(OPT3)>=15 AND adx(opt3)>=ref(adx(opt3),-opt4)), Cross(Mov(c,opt2,e),Mov(c,opt1,e)), ((ALERT(CROSS(70,RSI(OPT5)),OPT8) and CROSS(90,STOCH(opt6, opt7))) OR (ALERT(CROSS(90,STOCH(OPT6,OPT7)),OPT8) AND CROSS(70,RSI(OPT5))))) Powyższy system zakłada, że podczas występowania silnego trendu (czyli w sytuacji kiedy ADX jest większe od 15, oraz nadal rośnie), korzystamy z przecięcia się krótkookresowej i długookresowej średniej kroczącej. W przeciwnym wypadku (podczas słabego trendu), system niniejszy korzysta ze wskaźnika względnej siły - Relative Strenght Index oraz oscylatora stochastycznego. W tej pierwotnej wersji zastosowaliśmy jedynie tzw. stop loss na poziomie 10%. Wynik optymalizacji tego systemu możemy zaobserwować poniżej. Linia equity wygląda następująco: Widzimy zatem, że linia equity nie przynosi jakichś szczególnych obsunięć kapitału i jest względnie stabilna przynosząc w miarę ciągły zysk. Dochód jaki został wypracowany po zastosowaniu tego na historycznych danych systemu wyniósł 4980,8 punktów. Ilość zawartych transakcji pozwala stwierdzić, że stworzony przez nas system jest bardzo ostrożny,
gdyż suma zawartych kontraktów to tylko 12. Pocieszający jest jednak fakt, że 9 z nich jest transakcjami zyskownymi, a średnia korzyść jaką otrzymujemy z nich jest ponad 10 razy większa niż średnia poniesiona przez nas strata. Szczegółowy wydruk dotyczący tego systemu znajduje się w załączniku 1. W dalszej części pracy próbowaliśmy polepszyć swoje zyski ustawiając różnorodne kombinacje tzw. stopów. Najbardziej optymalne (zyskowne) ustawienie zamieściliśmy poniżej. Dzięki takiej kombinacji stopów udało nam się podnieść zyskowność naszych operacji do 5044,610 punktów. Niestety nie zmienił nam się stosunek ilości trafionych operacji do kontraktów nietrafionych. Na niekorzyść wypadła też relacja średniego zysku do średniej straty. Przytaczamy jednak ten system gdyż przynosi on większe korzyści niż poprzednia wersja. Co do linii equity, którą się wspieramy, wydaje się być ona bardziej wyrównana, niż tożsama wersji poprzedniej.
Szybsza jest także reakcja tego systemu na wejście na rynek., dzięki czemu po dość niedługim czasie możemy odnosić korzyści z obrotu rynkowego. Szczegółowe informacje dotyczące systemu w wersji 2 znajdują się w załączniku 2. Ze względu na dość wyrównany kształt tej linii, ta wersja systemu była pierwszą, na której sprawdziliśmy skuteczność systemu na okresie prognozy (danych rzeczywistych). Wersja systemu nie była już wtedy optymalizowana. Wyniki badania zamieszczamy poniżej. Jak widzimy, linia equity wygląda znacznie gorzej. Podczas całego badanego czasu ponosimy znaczne straty, aczkolwiek ostatecznie wychodzimy na niewielkim plusie otrzymując zysk na poziomie 377,58. Podczas tego dwuletniego okresu prognozy nasza linia equity jest bardzo niestabilna i generuje na zmianę zarówno zyski jak i znaczne straty. Nie jest to system, któremu bylibyśmy w stanie zaufać jeśli chodzi o rzeczywiste pieniądze i rzeczywiste ryzyko towarzyszące zawieranym kontraktom. Widzimy zatem, iż mimo bardzo ładnie wyglądającej linii equity na danych optymalizowanych, system nie do końca sprawdził się na danych prognozowanych. Dalsze poszukiwania najlepszego systemu transakcyjnego rozpoczęliśmy od zweryfikowania poprzednio użytej formuły. Wydało nam się bowiem, że zbyt dużo obwarowań w poprzedniej wersji powodowało, że tracimy szansę zawarcia kontraktu, nawet w dość pewnych sytuacjach. Była to bardzo zachowawcza wersja dobra dla ostrożnych inwestorów. W kolejnej wersji naszego systemu postanowiliśmy zatem złagodzić warunki, w których system dawałby sygnały na zawarcie transakcji kupna bądź sprzedaży.
W kolejnym systemie, nie skorzystaliśmy z indeksu RSI. Co prawda, nasze rozumowanie było dość zbliżone do poprzedniej wersji, czyli kiedy wskaźnik ADX wskazywał na silny trend, korzystaliśmy z 2 średnich kroczących, jednak zwiększyliśmy próg ponad którym miała znajdować się linia ADX, z 12 do 20. Dzięki temu, byliśmy pewni, że jesteśmy w momencie bardzo silnego trendu, a jednocześnie pozwoliliśmy aby oscylator stochastyczny mógł wygenerować więcej sygnałów, kiedy ten warunek nie zostanie spełniony. Zmieniliśmy także samą formułę dotyczącą tego oscylatora opierając go nie tyle na poziomach wykupienia i wyprzedania, ale na przecięciu się go z linią sygnalną. Dzięki temu uzyskujemy także więcej sygnałów generowanych przez ten wskaźnik. Formuła tego systemu była zatem następująca: Dla kontraktu kupna IF((ADX(OPT3)>=20 AND adx(opt3)>ref(adx(opt3),-opt4)), Cross(Mov(c,opt1,e),Mov(c,opt2,e)), CROSS(STOCH(opt6, opt7),mov(stoch(opt6,opt7),3,s))) Dla kontraktu sprzedaży IF((ADX(OPT3)>=20 AND adx(opt3)>ref(adx(opt3),-opt4)), Cross(Mov(c,opt2,e),Mov(c,opt1,e)), CROSS(MOV(STOCH(OPT6,OPT7),3,S),STOCH(opt6, opt7))) Dzięki tak zapisanej regule, otrzymaliśmy naprawdę zadowalającą linię equity widoczną poniżej. Linia ta sugeruje, że system jest dość prężnie działający i zawiera transakcje właściwie już od początku bycia na rynku. Dodatkowo cechuje go stabilny, równomierny wzrost. Spełnione zostały także nasze oczekiwania dotyczące ilości zawartych kontraktów. Ich liczba wzrosła z 12 aż do 504! Zatem nasze założenia były skuteczne. Ilość transakcji trafionych, do tych mało korzystnych była porównywalna 225/279, a średni zysk był prawie 2 razy większy od średniej straty. Niestety łączny zysk jaki otrzymaliśmy na danych obserwowanych
był nieco niższy i wyniósł 3209,2. Szczegółowy wydruk z programu Metastock znajduje się w załączniku 3. Zachęceni tym sukcesem, rozpoczęliśmy dalszą modyfikację wcześniejszej wersji, zmieniając warunki optymalizacji. Korzystając z nowej wersji systemu, podnieśliśmy uzyskane przez nas zyski do 3306,4 punktów oraz bardzo na korzyść zmieniła się proporcja operacji zyskownych do mało korzystnych. System ten generuje nam bowiem aż 160 prawidłowo rozpoznanych sygnałów i tylko 153 błędne, a średni zysk dodatkowo jest prawie 2 razy większy niż średnia strata. Linia equity dla tego systemu wygląda następująco: Widzimy zatem, że linia ta charakteryzuje się dość wygładzoną strukturą, bez większych wahań, co pozwala na stały i dość pewny zysk. Szczegóły dotyczące tej wersji systemu zawiera załącznik 4. Zastanawiając się nad prawidłowym działaniem tej wersji programu, postanowiliśmy zbadać jaką skuteczność ma ona jeśli chodzi o okres prognozy. Okazało się, że dzięki naszemu systemowi udało nam się wygenerować niewielki zysk w wysokości 644 punktów. W porównaniu do wcześniej badanego na tym okresie systemu, jest to całkiem niezły wynik. Linia equity wygląda natomiast następująco: Możemy zaobserwować (mimo nieznacznych wahań) dość stabilny wzrost. Aby otrzymać jeszcze lepsze wyniki, stworzyliśmy kombinacje stopów, która pozwoliłaby nam na osiągnięcie jeszcze lepszych wyników i na bardziej równomiernie zdobywane zyski.
Dzięki takim ustawieniom, nasz system powiększył swoje zyski do 3844,44 punktów. Zdecydowaliśmy, że będzie to ostateczna wersja naszego systemu o następującej formule: dla transakcji kupna IF((ADX(9)>=20 AND adx(9)>ref(adx(9),-1)), Cross(Mov(c,4,e),Mov(c,12,e)), CROSS(STOCH(5, 3),MOV(STOCH(5,3),3,S))) dla transacji sprzedaży IF((ADX(9)>=20 AND adx(9)>ref(adx(9),-1)), Cross(Mov(c,12,e),Mov(c,4,e)), CROSS(MOV(STOCH(5,3),3,S),STOCH(5, 3)))
Linia equity dla tego systemu wygląda następująco: Wybraliśmy ten system, gdyż charakteryzuje się on względną stałością- nie ma strasznych załamań, nie odnosi znaczących strat. Dodatkowo zawiera optymalną liczbę zawieranych transakcji i prawie dwa razy większy średni zysk od średniej straty. Szczegółowe wydruki z programu Meastock znajdują się w załączniku 5. System ten został zbadany przez nas także na okresie prognozy. Widzimy zatem, że mimo dość licznych zawirowań system ogólnie osiąga stałe zyski. Dochód jaki otrzymaliśmy dzięki takiej konstrukcji systemu jest ponad dwa razy większy niż w ostatniej wersji i wynosi 1351 punktów. Według nas, porównując do otrzymanych wyników podczas całego poszukiwania idealnego systemu, jest to naprawdę dobry wynik. Wydruki dla ostatecznej wersji sprawdzanej dla okresu dwuletniej prognozy znajdują się w załączniku 6. Dojście do wersji ostatecznej wymagało od nas przebadania wielu systemów bazujących na innych pomysłach niż nasza ostateczna wizja. Niektóre z nich zamieszczamy w załączniku 7 wraz z odpowiednimi dla nich liniami equity oraz zastosowaną formułą, aby pokazać, jak na tle innych systemów wygląda system przez nas wybrany.
Załącznik 1
Załącznik 2
Załącznik 3
Załącznik 4
Załącznik 5
Załącznik 6
Załącznik 7 Poniżej przedstawiamy linie equity dla kilku innych systemów, które konstruowaliśmy: 1. System oparty na przecięciu dwóch średnich kroczących Buy Order: Cross(Mov(c,2,e),Mov(c,11,e)) Sell Order: Cross(Mov(c,11,e),Mov(c,2,e)) 2. System oparty na przecięciu dwóch średnich koroczących oraz na silnym trendzie (wartości ADX) Buy Order: ADX(5)>=15 and Cross(Mov(c,2,e),Mov(c,13,e)) Sell Order: ADX(5)>=15 and Cross(Mov(c,13,e),Mov(c,2,e)) 3. System oparty na przecięciu dwóch wskaźników DEMA Buy Order: CROSS(DEMA(C,4),DEMA(C,14)) Sell Order: CROSS(DEMA(C,14),DEMA(C,4)) 4. System oparty na przecięciu dwóch wskaźników TEMA przy silnym trendzie oraz sygnałach generowanych przez RSI i Oscylator Stochastyczny przy braku wyraźnego trendu.
Buy Order: IF((ADX(10)>=20 AND ADX(10)>=REF(ADX(10),-1)), Cross(TEMA(c,4),TEMA(c,12)), ((ALERT(CROSS(RSI(12),30),1) and CROSS(STOCH(5, 3),10)) OR (ALERT(CROSS(STOCH(5,7),10),1) AND CROSS(RSI(12),30)))) Sell Order: IF((ADX(10)>=20 AND ADX(10)>=REF(ADX(10),-1)), Cross(TEMA(c,12),TEMA(c,4)), ((ALERT(CROSS(70,RSI(12)),1) and CROSS(90,STOCH(5, 3))) OR (ALERT(CROSS(90,STOCH(5,3)),1) AND CROSS(70,RSI(12))))) 5. System oparty na przecięciu trzech średnich kroczących. Buy Order: ALERT(CROSS(MOV(C,5,E),MOV(C,8,E)),3) AND CROSS(MOV(C,5,E),MOV(C,20,E)) Sell Order: ALERT(CROSS(MOV(C,8,E),MOV(C,5,E)),3) AND CROSS(MOV(C,20,E),MOV(C,5,E)) 6. System oparty na MACD Buy Order: MACD() > Mov( MACD(), 12, EXPONENTIAL) AND macd()<12 Sell Order: MACD() < Mov( MACD(), 12, EXPONENTIAL) AND macd()>22