Amibroker – testowanie przeszłości cz. 1

Kontynuujemy cykl tekstów, które mają przybliżyć ciekawe funkcjonalności Amibrokera. Tym razem opiszemy funkcje, której używanie “odróżnia mężczyzn do chłopców” w tradingu. Z drugiej strony dzieli projektujących systemy na “prawie” milionerów i tych którzy porzucili wszelką nadzieję. Złośliwi twierdzą, że funkcja ta może również uzależnić – trader zamiast handlować będzie “gonić króliczka” czyli testować testować…. Ta funkcja to BACKTEST.

Z założenia backtest ma zastąpić testowanie projektowanych systemów na prawdziwych pieniądzach. Sprawdzenie skuteczności naszego systemu transakcyjnego na danych historycznych powinno pomóc nam również szybciej zidentyfikować
i wyeliminować jego słabe strony.

Zakładając, iż stworzyliśmy już system transakcyjny, który pozwoli nam w krótkim czasie stać się milionerami 😉 lecz mamy jeszcze pewne wątpliwości co do jego słuszności powinniśmy przeprowadzić testy bazujące na danych historycznych, najlepiej na szerokim horyzoncie czasowym ze względu na zmieniające się cechy danego rynku.

Algorytm

W pierwszej kolejności reguły otwierania i zamykania pozycji z naszego systemu należy zapisać w języku AFL(składnia tego języka jest bardzo intuicyjna i przypomina inne języki w których tworzy się systemy transakcyjne). W tym celu można wykorzystać następujące zmienne języka AFL zarezerwowane dla otwierania i zamykania pozycji długich i krótkich:

buy – wartość “prawda ” lub 1 otwiera pozycję długą
sell – wartość “prawda ” lub 1 zamyka pozycję długą
short – wartość “prawda ” lub 1 otwiera pozycję krótką
cover – wartość “prawda ” lub 1 zamyka pozycję krótką

Przy zastosowaniu strategii ?zawsze na rynku”(stop i odwrócenie) należy przypisać sprzedaż (zmienna sell) do zmiennej short, natomiast kupno(zmienną buy)do zmiennej cover:

short = sell;
cover = buy;

Do zaprezentowania szerokiej funkcjonalności Backtestu posłużę się bardzo prostym systemem transakcyjnym opartym na MACD:

Buy = MACD()>0;
Sell = MACD()<0;

Short = MACD()<0;
Cover = MACD()>0;

Testowaniu zostanie poddana spółka KGHM w okresie 07.04.2006 – 24.07.2008 przy założeniu, że sygnały będą generowane na wykresie godzinowym.

Po wpisaniu powyższej formuły w oknie ?Formula Editor“, w celu przetestowania historycznego systemu należy kliknąć na przycisk ?Back test” w oknie ?Automatic analysis“.

Analiza

Okno Automatic Analysis z listą symulowanych transakcji wygląda następująco:

Automatic Analysis

W dolnej części okna ?Automatic Analisys” zamieszczone są wstępne wyniki testu, które pozwalają na szybką ocenę wydatności systemu.

Sekcja ?Apply to”

Przeprowadzony test dotyczy jedynie obecnie przeglądanej spółki KGHM, za co odpowiedzialna jest sekcja ?Apply to” opcja ?current symbol“. Amibroker pozwala także na jednoczesne przetestowanie systemu na wszystkich walorach dostępnych w naszej bazie, wtedy powinniśmy zaznaczyć opcję ?all symbols“. Jeżeli np. system nasz stworzyliśmy w celu dokonywania transakcji jedynie na akcjach, a nasza baza Amibrokera zawiera wszystkie instrumenty notowane na GPW, przy użyciu opcji ?use filter” i zdefiniowaniu odpowiedniego filtra jesteśmy w stanie wybrać pożądane walory.

Sekcja ?Range”

Test systemu przeprowadzony został na wszystkich dostępnych danych w naszej bazie. Jeżeli jednak uważamy, iż wynik naszego testu zostanie zniekształcony przez sytuację jaka miała miejsce np. na początku notowania waloru kiedy płynność była bardzo ograniczona możemy pominąć ten okres korzystając z sekcji ?Range“. Należy zaznaczyć opcję ?from” i wybrać interesujący nas okres. Dostępne są też innej opcje:
n last quotations – ilość ostatnich kwotowań,
n last days – ilość ostatnich dni.

Sekcja ?Results”


W tej części okna Automatic Analysis przedstawione jest zestawienie wszystkich symulowanych transakcji w czasie trwania testu wraz ze szczegółowymi danymi. Chcąc zaobserwować w jakim momencie na wykresie miały miejsce wygenerowane transakcje (spełniony został dany warunek kupna lub sprzedaży) należy kliknąć prawym przyciskiem myszy na dowolny wiersz i wybrać ?Show arrows for actual trades“. W podobny sposób można zilustrować pojedynczą transakcje, w tym celu należy dwukrotnie kliknąć na wybrany wiersz jednocześnie trzymając wciśnięty klawisz SHIFT. Zaznaczona niebieską obwódką transakcja na wykresie prezentuje się następująco (strzałki oznaczają moment wejścia i wyjścia):

Przykładowe transakcje

Raporty

Amibroker umożliwia także wygenerowanie zestawienia zawierającego szczegółowe dane statystyczne dotyczące testowanego systemu. Należy kliknąć na przycisk ?Report” w oknie Automatic analysis. Analiza poszczególnych pozycji wygenerowanego raportu pomoże nam ocenić zyskowność oraz ryzyko testowanej strategii.
Poza danymi (zaznaczone w raporcie na czerwono), które dostępne były w dolnej części okna Automatic analysis raport zawiera szereg innych ważnych danych statystycznych.
Analizując powyższy raport możemy stwierdzić, iż transakcji stratnych było prawie dwukrotnie więcej niż zyskownych (39 do 22), co przy osiągniętym zysku rzędu 53,21% powinno nieco wzbudzić nasze podejrzenia i od razu wskazać element, który wart jest poprawienia. Kolejne dane dotyczące średniej wartości osiąganego zysku lub straty mogą pomóc nam w zdefiniowaniu ewentualnych stopów.
W podobny sposób można interpretować pozostałe dane.
Przy testowaniu kolejnych systemów transakcyjnych zapewne ujawnią się inne charakterystyczne elementy, które będą warte ulepszenia lub niestety spowodują, iż będziemy musieli zrezygnować z naszego systemu.

Statystyki

c.d.n. a w nim m.in. dystrybucja zysków i strat, krzywa kapitału, ustawienia backtester’a.

Zbigniew Jabłoński

[Głosów:0    Średnia:0/5]

11 Komentarzy

  1. TomekB

    stosowanie backtestów jest chyba trochę bez sensu – dla dowolnego ciągu wyników można znaleźć nieskończenie dużo pasujących algorytmów…

  2. wojgall

    " Autor: TomekB – 01/08/2008 19:26

    stosowanie backtestów jest chyba trochę bez sensu – dla dowolnego ciągu wyników można znaleźć nieskończenie dużo pasujących algorytmów?"

    To jak twoim zdaniem inaczej testować systemy ??

  3. SuperGrover

    A teraz coś z zupełnie innej beczki:)

    Zachęcony Państwa materiałami edukacyjnymi, zainteresowałem się rynkiem opcji. Przyznam, że to rynek bardzo interesujący.

    Co mnie uderzyło?

    Będąc aktywnym na rynku kontraktów, i będąc drobnym ciułaczem – wiem, że jeżeli w bieżącym miesiącu mój obrót wyniesie 10 kontraktów, to nie muszę wnosić dodatkowych opłat za pakiet zielony1. Tymczasem w przypadku rynku opcji muszę dokonać obrotu aż 50 opcjami. Policzmy:

    Wykonując minimalny wymagany obrót, z tytułu prowizji przynoszę Wam dochód w wysokości:

    – na rynku kontraktów:
    od 84,5zł (5 kontraktów x 9,9zł 5 x 7zł), w przypadku handlu jednodniowego, do 99zł (10 kontraktów x 9,9zł), gdy pozycje są zamykane w innym dniu niż zostały otwarte.

    – a na rynku opcji:
    od 75zł (50 x minimalna stawka za jedną opcję – 1,5zł), do aż 495zł (50 x maksymalna stawka – 9,9zł).

    Pięciokrotne powtórzenie najprostszej operacji: K-S, na rynku opcji to: 5×1 opcja 5×1 opcja = obrót 10 (wymagany 50), ale już prowizja 5x 9,9zł 5x 9,9zł = 99zł. A więc z tytułu prowizji zarobiłem dla Was tyle samo, co inwestor aktywny na rynku kontraktów, który handluje w horyzoncie kilku sesji (i prawie 15zł więcej od inwestora handlującego w horyzoncie jednej sesji), a mimo to oni uzyskują prawo do bonusu – darmowy pakiet zielony1, a ja – nie. Sprawiedliwe to to raczej nie jest.

    Rozumiem, charakter tego rynku jest taki, że wartość prowizji z tych 10 transakcji niekoniecznie musi wynieść między 84,5zł – 99zł, ale za otwarcie na przykład – 5x 1,5zł = 7,5zł, i za zamknięcie na przykład – 5x 4zł = 20zł, razem – 27,5zł.

    Dlatego może warto rozważyć wprowadzenie na rynku opcji, zamiast systemu ilościowego – system kwotowy? Na rynku kontraktów maksymalna stawka jaką Państwo uzyskujecie od minimalnego wymaganego obrotu to 99zł. Na rynku opcji mogłoby to działać w ten sposób, że inwestor uzyska bonus, w postaci darmowego pakietu zielony1, pod warunkiem, że wartość prowizji od transakcji przekroczy 100 zł? Chyba nie wchodzą w grę jakieś dodatkowe koszty bo 50 x 1,5 to jest o 10 zł mniej niż minimalny dochód jaki uzyskujecie od inwestora na rynku kontraktów (84,5zł)?

    Ciekawe co na to inni drobni ciułacze obecni na tym rynku?

  4. TS

    Sprawdź jeszcze jakie opłaty pobiera Krajowy Depozyt Papierów wartościowych od kontraktów a jakie od opcji.

  5. kysiek

    do Tomek B: dlatego po znalezieniu optymalnych wartosci nalezy testowac na tych ktorych system nie widzial.
    Poza tym, tu nie bylo nic optymalizowane wiec nie ma o czym mowic.
    Inan sprawa jest ze nalezy uzwgledniz ze AB standardowo ma ustawione podczas BackTestu kupowanie w obcnej cenie zamkniecia. Nlezy ustawic na realna czyli np cene otwarcie na drugi dzien

  6. mwojciechowski

    @SuperGrover
    Jak słusznie zauważyłeś przychody dla biura od 50 opcji wynoszą od 75 zł do 495 zł. Odejmując koszty KDPW i GPW, dla biura zostaje od 55 zł do 335 zł.
    Dla 10 kontraktów jest to 74 zł.
    Problem polega na tym, że większość obrotu jest generowana na opcjach OTM (śr. wartość opcji to 82zł) czyli nasze przychody oscylują wokół kwoty 55-100 zł – bardzo podobnie jak w przypadku kontraktów.

    Co do systemu ilościowego. Mieliśmy taki system kilka lat temu – dla kontraktów i akcji. Niestety otrzymywaliśmy bardzo dużo głosów
    od klientów, że jest mało zrozumiały i postulaty, żeby przejść na system ilościowy. Co też uczyniliśmy ;(

    P.S. Pamiętaj o możliwościach negocjacji. Również opłat 😉

  7. mike_05

    Zainteresowanych danymi do Ami (15-minut, nazwy krótkie) dla stworzenia bazy w formacie .csv zapraszam. Baza może współpracować z pluginem StaticaN3 po odpowiednim zdefiniowaniu.

  8. Jarek

    Witam serdecznie:)

    Dopiero zaczynam przygode z Amibrokerem oraz gielda.
    Dziekuje za bardzo dobry wstep – ile ja sie naszukalem opcji pokazania strzalek na wykresie! – w koncu znalazlem tutaj.

    Od razu zaczalem sie interesowac jezykiem AFL i mam w zwiazku z tym kilka watpliwosci – bardzo prosze o pomoc.

    1. Rozumiem, ze cala formula jest wykonywana dla kazdego slupka, tak? Czyli wszystko co jest w formule (petle, warunki itp.) dotycza danego slupka.
    2. Jezeli tak, to czy zdefiniowane w formule zmienne nie zostaja skaskowane przy przejsciu do nastepnego slupka? – w formule zmienne zostana zmienione dopiero po nastapieniu jakiejs przyczyny.
    3. Pytania dotycza chyba blahego problemu, a mianowicie chcialbym miec mozliwosc odwolania sie do danych dotyczacych wczesniejszych slupkow np. chcialbym miec mozliwosc porownania biezacej ceny zamkniecie z maksimum ze slupka wskazanego w zmiennej. Problem w tym, ze w ogole nie widze mozliwosci przechowania takich danych i wykorzystania ich pozniej:( Przypuszczam, ze taka opcja MUSI byc dostepna, ale nie wiem gdzie – probowalem barcount, barindex, cum, status itp.

    Aby zilistrowac problem podam przyklad, co chcialbym uzyskac:
    1. jest 1.6.2009 i wlasnie przecinaja sie dwie srednie
    2. tworze zmienna, ktora zapamieta numer slupka lub jakiekolwiek dane pozwalajace sie do niego odwolac w przyszlosci (podczas dzialana formuly na kolejnym/kolejnych slupkach)
    3. formula ma wyslac sygnal zakupu jezeli np. biezaca cena otwarcia (przyszle slupki po wystapieniu sygnalu) jest wieksza niz cena otwarcia w dniu przeciecia srednich tj. 1.6.2009.

    Za nic nie moge dobrac sie do danych z dnia przeciecia srednich i tym samym uruchomic warunku:(((
    Moze ktos ma jakis pomysl? Nie wyobrazam sobie, aby to bylo niemozliwe – to chyba jakas podstawowa funkcja.

    Bede wdzieczny za wszelka pomoc:)
    Pozdrawiam serdecznie,
    Jarek

    PS.
    Ostatnie pytanie laika dotyczace GPW: czy skladajac zlecenie z limitem ceny, system wybiera najbardziej korzystne dla mnie transakcje do ustawionego limitu?
    Wszedzie szukalem i nie znalazlem na to potwierdzenie, wiem natomiast, ze PKC tak dziala. Dziwne byloby gdyby z limitem ceny tak nie bylo.
    To akurat jest mi potrzebne do zlecen DDM+ – PKC mozliwe jest tylko na jedna sesje, ale jezeli ustawie sobie limit ceny na bardzo niska wartosc, np. 1, to w zasadzie mam PKC na dluzszy okres, tak?
    Boje sie tylko, ze system jakos niekorzystnie paruje zlecenia z limitem – stad moje obawy.

  9. mdlubak

    @Jarek

    Cześć 🙂 Przede wszystkim zajrzyj tutaj:
    http://bossa.pl/oferta/internet/amibroker/porady.html#pomoc

    Nie jestem pewny czy wszystko dobrze zrozumiałem, formuły działają w zdefiniowanym przez Ciebie okresie i interwale. Musisz napisać coś więcej ponieważ używasz sporo ogólników np. jakich średnich chcesz używać w jakiej formule, wzór ?

    Co do zleceń to zajrzyj do naszej edukacji, polecam:
    http://bossa.pl/edukacja/warset/nowe_zlecenia.html

    A następnie poczytaj na temat Ustalania kursu na GPW:
    http://bossa.pl/edukacja/ustalanie_kursu.html

    Napisz do mnie na mail:m.dlubak@bossa.pl postaram się pomóc 🙂


    pozdro
    MD

  10. Jarek

    @mdlubak

    Hej!

    Bardzo dziekuje Ci za odpowiedz!!!:) Myslalem, ze post utonal i nikt go nie zauwazy;)
    Jeszcze dzisiaj odezwe sie na maila, a teraz na szybko sprecyzuje o co mi chodzilo.

    Co do zlecen, to “przeswietlilem” wiele stron, w tym bosse i gpw, ale nigdzie nie znalazlem stwierdzenia, ze zlecenie z limitem ceny jest realizowane po najlepszych dla mnie kursach do tego limitu. Dodam, ze przy PKC prawie wszedzie jest to uwypuklone, a w tym przypadku cisza. Ostatnio sprzedalem z limitem ceny i dwa razy sprzedalem po limicie, czyli najgorszej dla mnie mozliwosci. Mozliwe, ze to z racji malej plynnosci i waskich widelek, ale wolalbym miec pewnosc:)

    Odnosnie dzialania “backtestu” w Amibrokerze, to chodzilo mi o to w jaki sposob dziala formula w backtescie. Program wykonuje ja przy kazdym slupku, realizujac wszystkie jej wiersze, tak?
    Jezeli tak, to czy jest mozliwe stworzenie jakiejs zmiennej, ktora przechowalaby (na dalszy ciag trwania backtestu) jakas wartosc?

    Moznaby te wartos wykorzystac do porownania przy analizie kolejnych slupkow, przykladowo formula backtestu wygladalaby tak:
    1. jezeli szybka srednia przecina wolna srednia od dolu, to zapamietaj ktory to slupek LUB zapisz wartosc maksymalnej ceny z tego dnia w zmiennej X
    2. porownuj, czy dana cena otwarcia w kolejnych dniach jest wieksza niz wartosc zmiennej X, a jezeli tak, to daj sygnal kupna.

    To tylko przyklad wymyslony na poczekaniu, jednak bardziej mi chodzi o to, czy mozna jakos przypisac wartosci do zmiennej W CHWILI wystapienia jakiegos zdarzenia (tutaj przecieie srednich).
    Nie potrafie sie dobrac do konretnego slupka, wyciagnac z niego dane i zapisac w zmiennej.

    Wiem, ze moznaby taka formule zapisac przy pomocy funkcji OR i AND, ale to straszna dlubanina, a tak mialbym w kazdym dniu dostep do jednej zmiennej, z ktore wystarczy porownac wartosci wlasnie badanego slupka:)

    Problem jest dosc prosty, ale trudny do wytlumaczenia:)

    Jeszcze raz bardzo dziekuje za odpowiedz i do zobaczenia w mailu;)

    Jarek

  11. wstud

    Witam,

    Dla znających afl, proszę o pomoc:
    http://futures.pl/?did=139&wdid=13038

    Pozdrawiam

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *

Proszę podać wartość CAPTCHA: *