czwartek, 2 lutego 2012

6 największych błędów przez które Twój system inwestycyjny w AFL będzie oszukiwał przy testach, a potem będzie tracił na giełdzie - błąd #6

6 największych błędów przez które Twój system inwestycyjny w AFL będzie oszukiwał przy testach, a potem będzie tracił na giełdzie - błąd #6

Autorem artykułu jest Rafał Wysocki



Język AFL w Amibrokerze jest potężnym narzędziem konstruowania systemów inwestycyjnych. Można też przeprowadzić bardzo rozbudowane testy zanim zainwestuje się prawdziwe pieniądze. Jednak te kilka błędów może spowodować, że wszystkie testy będą przekłamane, a Twoja inwestycja będzie zagrożona. Zobacz jak się przed tym uchronić.

Błąd szósty polega na braku płynności waloru. Możesz go popełnić przy testowaniu na danych giełdowych za pomocą dowolnego programu. Choć trzeba przyznać, że niektóre z nich zabezpieczą Cię lepiej, inne gorzej. Na szczęście Amibroker należy do tych pierwszych. Jednak nawet przy jego użyciu dużo zależy od Ciebie.

W kolejnych etapach tworzenia systemu inwestycyjnego najczęściej zaczyna się jego konstruowanie od zasad wejścia w rynek i wyjścia z niego. Dobra praktyka twórcy jest taka, aby dokładał on i doskonalił kolejne składowe dopiero po skonstruowaniu poprzednich.

Tak więc na początku najczęściej brakuje zarządzania kapitałem. Dla instrumentów z dźwignią zazwyczaj również pomija się ją i pierwsze testy przeprowadza się bezpośrednio na punktach lub pisach.

Nadchodzi jednak moment w którym nad zarządzaniem kapitałem należy pomyśleć. Dla wspomnianych walorów z dźwignią przejdziesz na obliczenia w prawdziwych pieniądzach. I tu kryje się pułapka. Bowiem jeżeli nie przypilnujesz, wyniki testu mogą wyjść całkowicie niezgodne z rzeczywistymi możliwościami jakie na rynku istniały.

Jeżeli test zaczynasz np. z kapitałem 100 tys. zł i w momencie zawierania transakcji Twój system przewiduje zainwestowanie 50% posiadanych pieniędzy, możesz mieć problem. Wystarczy, że walor na którym testujesz ma średni obrót na sesję 20 tys. zł. Oczywiście przy braku kontroli program przyjmie zakup za 50 tys. zł i nie zaprotestuje. Jednak ten wynik jest już oderwany od rzeczywistości. Nawet gdyby średni obrót był równy potrzebnym 50 tys. zł, to i tak nie możesz zakładać, że jednego dnia rynek będzie należał wyłącznie do Ciebie.

Jak poradzić sobie z tym problemem? Metody jak zwykle są dwie.

Po pierwsze możesz przewidzieć i zaprogramować taką sytuację w kodzie AFL. Jednak jest to rozwiązanie trudniejsze i nie do końca skutecznie.

Jednak drugi sposób jest prosty i uniwersalny. Otóż przy zaawansowanych testach które wykonasz Amibrokerem włącz sobie najpierw okienko "Backtester Settings" i tam w zakładce "Portfolio" znajdziesz dwie pozycje.

"Limit Trade size as % of entry bar volume" oznacza Twoje niezbędne ograniczenie inwestycji. Podajesz tu jaki procent wolumenu słupka możesz użyć dla swojej transakcji. Wartość 0 oznacza brak takiego limitu. Natomiast wartości (0;100> dają faktyczne ograniczenie. Sam musisz uznać jak dużym graczem chcesz być na danym walorze, ale zazwyczaj lepiej testować to z wartościami 20% lub mniej.

Dodatkowo jeszcze musisz przypilnować, żeby wyłączone pozostało "Disable trade size limit when bar volume is zero". Jego włączenie spowodowało by bowiem ignorowanie pierwszego warunku dla danych o zerowym obrocie. Jest to potrzebne w specyficznych sytuacjach, ale np. dla polskiej giełdy może jedynie generować błędy.

---

Zbuduj swój własny, skuteczny system inwestycyjny.
Więcej dowiesz się na
http://zobacz.CzarodziejAFL.pl/

Akcje, Kontrakty FW20, DAX, S&P500, Forex.


Artykuł pochodzi z serwisu www.Artelis.pl

6 największych błędów przez które Twój system inwestycyjny w AFL będzie oszukiwał przy testach, a potem będzie tracił na giełdzie - błąd #5

6 największych błędów przez które Twój system inwestycyjny w AFL będzie oszukiwał przy testach, a potem będzie tracił na giełdzie - błąd #5

Autorem artykułu jest Rafał Wysocki



Język AFL w Amibrokerze jest potężnym narzędziem konstruowania systemów inwestycyjnych. Można też przeprowadzić bardzo rozbudowane testy zanim zainwestuje się prawdziwe pieniądze. Jednak te kilka błędów może spowodować, że wszystkie testy będą przekłamane, a Twoja inwestycja będzie zagrożona. Zobacz jak się przed tym uchronić.

Błąd piąty jest charakterystyczny dla programowania systemów inwestycyjnych w Amibrokerze. Wynika on ze specyficznego podejścia w nim do zmiennych tablicowych. Oczywiście wynika też z niezrozumienia do końca jak są one obsługiwane.

Ciekawe jest to, że błędy takie trafia się głównie ludziom znającym już język AFL. Dzieje się tak w wyniku tego, że zaczynają swoją drogę od systemów prostych do bardziej skomplikowanych.

Akurat tydzień przed pisaniem tego artykułu otrzymałem zapytanie od jednego z moich uczniów: "czemu nie działa?". Był tam właśnie dokładnie taki błąd.

Nie zdradzę oczywiście jego kodu. Wyobraź sobie jednak prosty system np. na wybicie z formacji świecowej. Założenia są takie, że nie inwestujesz od razu gdy formacja wystąpi, tylko czekasz na potwierdzenie. Wybicie z zakresu formacji w jedną stronę daje sygnał kupna, wybicie w drugą daje zanegowanie formacji. Klasyczna interpretacja.

W takim razie, gdy występuje formacja chcesz zapamiętać jej najwyższą wartość, oraz najniższą. Dzięki temu uzyskasz kanał dwóch cen i możesz obserwować jego przebicie.

I tu pojawił się problem. Niektórzy bowiem próbują stosować konstrukcję:

//w zmiennej "formacja" są już miejsca gdzie ona występuje.
kanalGorny = High;
kanalGorny = Iif( formacja, kanalGorny, Ref(kanalGorny,-1));

Okazuje się jednak, że to nie tworzy kanału. Działa tylko dla następnego słupka, a potem jest lipa.

Wtedy pojawiają się pytania o kolejność przetwarzania danych. No bo przecież jeżeli od lewej strony tablicy, to powinno wstawić High tam gdzie występuje formacja, a w następnych słupkach powinno przepisywać tą wartość z poprzedniej komórki.

Jeżeli też spotkałeś taki problem, to musisz sobie zadać inne pytanie. Jak w ogóle przetwarzane są zmienne w funkcjach?

Otóż wywołanie funkcji powoduje utworzenie kopii zmiennej. Dlatego tworzona na nowo zmienna kanalGorny jest inną zmienną niż zmienna kanalGorny w parametrach funkcji. Przy obliczaniu kolejnych słupków dane są czytane z oryginalnej zmiennej, a zapisywane w nowej. Dopiero po policzeniu wszystkiego stara zmienna jest zastępowana nową. Dlatego nie ma dostępu do wyniku obliczeń w trakcie liczenia.

Jak w takim razie poradzić sobie z tym problemem?

Rozwiązań jest jak zwykle kilka. Najłatwiejsze jednak do zrozumienia jest to z pętlą.

kanalGorny = High;
for(i=1; i {
if( !formacja ) kanalGorny[i] = kanalGorny[i-1];
}

Taki kod przeciągnie wartość kanału od formacji do końca wykresu lub do następnego wystąpienia formacji. Tam gdzie jest formacja zostawia High, a dla kolejnych słupków pobiera wartość ze słupka wcześniejszego. Tu nie ma problemu zmiennej i jej kopii. Tym prostym sposobem możesz już badać przecięcie wykresu i kanału.

Sposób zapisu za pomocą instrukcji tablicowych tu pominę. Jest on krótszy, ale znacznie trudniejszy do zrozumienia.

Zaczynaj od podstaw. Zobaczysz wtedy, że tworzenie systemów jest proste.

---

Zbuduj swój własny, skuteczny system inwestycyjny.
Więcej dowiesz się na
http://zobacz.CzarodziejAFL.pl/

Akcje, Kontrakty FW20, DAX, S&P500, Forex.


Artykuł pochodzi z serwisu www.Artelis.pl

6 największych błędów przez które Twój system inwestycyjny w AFL będzie oszukiwał przy testach, a potem będzie tracił na giełdzie - błąd #4

6 największych błędów przez które Twój system inwestycyjny w AFL będzie oszukiwał przy testach, a potem będzie tracił na giełdzie - błąd #4

Autorem artykułu jest Rafał Wysocki



Język AFL w Amibrokerze jest potężnym narzędziem konstruowania systemów inwestycyjnych. Można też przeprowadzić bardzo rozbudowane testy zanim zainwestuje się prawdziwe pieniądze. Jednak te kilka błędów może spowodować, że wszystkie testy będą przekłamane, a Twoja inwestycja będzie zagrożona. Zobacz jak się przed tym uchronić.

Błąd czwarty nie jest błędem charakterystycznym tylko dla programowania systemów inwestycyjnych, czy dla Amibrokera i języka AFL. Jest to błąd dokuczający programistom w wielu językach programowania, choćby w C/C++, PHP i kilku innych.

Chodzi o drobny błąd zapisu. Jeden znak za mało, ale rezultaty są bardzo nieprzewidywalne. Zwłaszcza, że akurat Amibroker nie ma porządnego debuggera z wykonywaniem kodu linijka po linijce i podglądaniem zawartości zmiennych.

Ten błąd zapisu, to użycie znaku = zamiast == w instrukcjach warunkowych.

W AFL zapis

sesja = Close - Open;

oznacza, że do zmiennej sesja zostanie przypisany wynik obliczenia. W tym wypadku różnica między zamknięciem i otwarciem słupka.

Natomiast porównanie wymaga dwóch znaków równa się "==". Czyli dla przykładu, jeżeli chcesz wyłapać wszystkie sesje które zamknęły się na tym samym poziomie co otworzyły (tak zwana świece doji), możesz zapisać to wg potrzeb:

if( Close[i] == Open [i] ) ...

lub

Iif( Close == Open, ...

lub wreszcie możesz przypisać to do zmiennej

doji = ( Close == Open );

Co się jednak stanie, gdy np. w ostatnim zapisie pomylisz się i zapomnisz o drugim "="?

doji = ( Close = Open );

Otóż Amibroker potraktuje to jako przypisanie. Do zmiennej Close przypisze wartość z Open, a następnie tą sama wartość przypisze do zmiennej doji. Czyli wykona:

Close = Open;
doji = Close;

Nie będzie w tym żadnego sprawdzania i porównywania. Wyjdzie zwykłe podstawienie zmiennych.

A co z instrukcjami warunkowymi If i Iif? Błędnie zapisane:

if( Close[i] = Open [i] ) ...

lub

Iif( Close = Open, ...

również spowodują podstawienie wartości z prawej do zmiennej z lewej strony. I wartość tego podstawienia będzie brana pod uwagę przy decydowaniu o spełnieniu warunku.

W AFL fałsz (False) jest równy 0. Prawda (True) natomiast jest domyślnie liczbą 1. Jednak każda wartość różna od 0 jest uznawana za wynik prawdziwy. Czyli w takich dwóch zapisach jak powyżej, warunek będzie prawdziwy dla wszystkich Open różnych od 0, a fałszywy dla wszystkich Open równych 0. Natomiast Close będzie miało skasowaną oryginalną zawartość i przyjmie wartości z tablicy po prawej stronie zapisu.

Jak bronić się przed tym błędem? Najlepiej pamiętać o "==" w trakcie pisania. Jednak dodatkowo po napisaniu kodu możesz wyszukać w nim wszystkie "if" i sprawdzić czy któryś nie zawiera samego "=" w wyniku pomyłki. Cofnij się kursorem tekstowym na sam początek programu i wciśnij Ctrl-F. Wyskoczy okienko w którym wpiszesz "if". Następnie obserwując wciskaj [Enter] aż do końca kodu. Komputer po kolei pokaże Ci wszystkie miejsca, gdzie znajduje się instrukcja "if". Dodatkowo pokaże także wszystkie instrukcje "Iif". Ty musisz tylko patrzeć uważnie czy zapisy są prawidłowe i ewentualnie dokonać poprawek.

---

Zbuduj swój własny, skuteczny system inwestycyjny.
Więcej dowiesz się na
http://zobacz.CzarodziejAFL.pl/

Akcje, Kontrakty FW20, DAX, S&P500, Forex.


Artykuł pochodzi z serwisu www.Artelis.pl

6 największych błędów przez które Twój system inwestycyjny w AFL będzie oszukiwał przy testach, a potem będzie tracił na giełdzie - błąd #3

6 największych błędów przez które Twój system inwestycyjny w AFL będzie oszukiwał przy testach, a potem będzie tracił na giełdzie - błąd #3

Autorem artykułu jest Rafał Wysocki



Język AFL w Amibrokerze jest potężnym narzędziem konstruowania systemów inwestycyjnych. Można też przeprowadzić bardzo rozbudowane testy zanim zainwestuje się prawdziwe pieniądze. Jednak te kilka błędów może spowodować, że wszystkie testy będą przekłamane, a Twoja inwestycja będzie zagrożona. Zobacz jak się przed tym uchronić.

Błąd trzeci wiąże się również z ceną, ale ma również cechy sięgania do danych przeszłych. Tak samo trudny jest do wykrycia gdy zostanie już mocno obudowany innym kodem. Aby się przed nim uchronić trzeba wyrobić sobie prawidłowy nawyk analizy już na etapie tworzenia założeń systemu.

Błąd ten sięga do danych przeszłych, ale robi to subtelniej. Nie używa on bowiem funkcji Ref(), a jedynie steruje ceną i sygnałem w sposób nie do powtórzenia na rzeczywistym rynku.

Przykładem jego jest wygenerowanie sygnału w trakcie trwania lub na koniec słupka i zawarcie transakcji po cenie otwarcia tego samego słupka.

Zobacz bardzo prosty, ale skrajny kod takiej sytuacji:

Buy = (Close>Open);
Sell = Buy;
BuyPrice = Open;
SellPrice = Close;

Wszystko wygląda w porządku. Amibroker nie wniesie żadnych poprawek do transakcji, bo ceny przyjęte do transakcji rzeczywiście występowały na rynku. Nie ma instrukcji Ref(), więc wydaje się, że nie ma nawet co sprawdzać, czy przypadkiem nie sięgasz do danych przyszłych. Jednak zastanów się nad chronologią.

Kupujesz w cenie otwarcia wg. jakiegoś sygnału - możliwe.

Sprzedajesz w cenie zamknięcia zaraz w tym samym dniu - możliwe.

Sygnał kupna masz gdy słupek jest rosnący, czyli gdy zamknie się wyżej niż się otworzył - jak najbardziej możliwe.

Ale ale. Sygnał przecież jest generowany po zamknięciu słupka. Wtedy dopiero znasz prawdziwą cenę Close. Załóżmy, że inwestujesz na interwale dziennym. Jak zamierzasz wieczorem na koniec sesji zawrzeć realną transakcję w cenie z samego rana?

Musisz zachować uważność nie tylko w trakcie użycia funkcji Ref(). Tak samo w trakcie wyznaczania ceny transakcji nie wystarczy sprawdzić, czy jest ona realnie osiągalna na rynku. Musisz jeszcze pomyśleć nad chronologią.

Po prostu zawsze sprawdź w jakim momencie występuje sygnał, a w jakim momencie występuje przyjmowana cena. Amibroker ma bardzo ograniczone możliwości przypilnowania Ciebie w takiej sytuacji. Jeżeli cena jest dostępna równocześnie z sygnałem - ok. W wielu przypadkach tak będzie dobrze. Jeżeli cena jest brana z otwarcia kolejnego słupka lub transakcja jest jeszcze bardziej opóźniona - masz sytuację idealną i najbardziej zgodną z tym jak inwestowanie wygląda w rzeczywistości.

---

Zbuduj swój własny, skuteczny system inwestycyjny.
Więcej dowiesz się na
http://zobacz.CzarodziejAFL.pl/

Akcje, Kontrakty FW20, DAX, S&P500, Forex.


Artykuł pochodzi z serwisu www.Artelis.pl

6 największych błędów przez które Twój system inwestycyjny w AFL będzie oszukiwał przy testach, a potem będzie tracił na giełdzie - błąd #2

6 największych błędów przez które Twój system inwestycyjny w AFL będzie oszukiwał przy testach, a potem będzie tracił na giełdzie - błąd #2

Autorem artykułu jest Rafał Wysocki



Język AFL w Amibrokerze jest potężnym narzędziem konstruowania systemów inwestycyjnych. Można też przeprowadzić bardzo rozbudowane testy zanim zainwestuje się prawdziwe pieniądze. Jednak te kilka błędów może spowodować, że wszystkie testy będą przekłamane, a Twoja inwestycja będzie zagrożona. Zobacz jak się przed tym uchronić.

Błąd drugi wiąże się z ceną. Również może być trudny do wykrycia. Na dodatek nie wiadomo na ile fałszuje wynik testu. Może to robić tylko trochę, ale może też powodować wyniki niesamowicie różne od możliwych w rzeczywistości.

W Amibrokerze w momencie kiedy zawierasz transakcję masz możliwość zadecydowania po jakiej cenie jest ona wykonywana. Dotyczy to oczywiście wszystkich czterech możliwych transakcji - czy to kupna, czy sprzedaży, czy odpowiednich transakcji dla pozycji krótkiej.

Najlepszą praktyką jest zawsze zawieranie transakcji po cenie zamknięcia słupka, lub jeszcze lepiej po cenie otwarcia następnego słupka. Jednak są sytuacje, kiedy nie będzie to wystarczające. Np. jeżeli wykreślasz linię stop. Możesz sprawdzać jej przekroczenie dopiero po cenach zamknięcia i sprawa jest prosta. Stosujesz wtedy właśnie jedną z dwóch przedstawionych przed chwilą cen.

Ale możesz też traktować stop jako zlecenie oczekujące na rynku. Wtedy nawet gdy inwestujesz wg danych dziennych, stop musisz obserwować w danych intraday. Tak musi być, ponieważ stop ten zadziała również w trakcie sesji, a nie tylko na jej koniec. Jeżeli sesja otworzy się nad linią stop i w ciągu dnia ją przetnie, masz prawo założyć, że zlecenie zrealizowało się dokładnie w cenie przez nią wyznaczanej.

Jednak właśnie tu tkwi jedna z pułapek. Co bowiem, gdy rynek otworzy się luką i od razu będzie sporo poniżej linii stop? Jeżeli przyjmiesz jako cenę transakcji wartość wynikającą z tej linii, to stwarzasz sytuację niemożliwą do osiągnięcia na prawdziwym rynku. W tej konkretnej sytuacji najlepszym rozwiązaniem jest przyjęcie ceny otwarcia słupka. Po prostu zakładasz, że widząc otwarcie słupka poniżej linii stop od razu zamykasz transakcję.

Jest to przykład wzięty z prawdziwych systemów inwestycyjnych. A nie jest on jedyną możliwością zafałszowania ceny.

Tak naprawdę w kodzie AFL możesz podstawić dowolną cenę transakcji. Bez względu na to, czy była ona realnie do osiągnięcia. Bez względu nawet na to, czy taka cena występowała na rynku.

Amibroker stara się taki błąd wyeliminować i ogranicza cenę do takiej jaka w danym słupku była możliwa. Także jeżeli Ty przyjmiesz cenę spoza słupka, on do transakcji weźmie maksimum lub minimum. Jednak dalej jest to sytuacja nieprawdopodobna i wynik testu będzie nieprawdziwy.

Zobacz skrajny przykład kodu fałszującego cenę

Buy = (DayOfWeek()==1);
Sell = Ref(Buy,-1);
BuyPrice = Low;
SellPrice = Ref(Low,-1)*10;

Kod ten kupuje zawsze w cenie minimum w poniedziałek, a usiłuje sprzedać we wtorek w cenie 10 razy wyższej. Samo to, że Amibroker przyjmie przy sprzedaży cenę maksimum nie powoduje prawidłowego działania takiego systemu. Choćby dlatego, że cena minimum i maksimum słupka znana jest dopiero po fakcie, po zakończeniu tego słupka. Więc jest to cena nierealna dla prawdziwych transakcji.

Dlatego właśnie zawsze musisz przemyśleć realność stosowanych cen. Zawsze musisz też sprawdzić, czy były one znane w momencie zawierania transakcji.

---

Zbuduj swój własny, skuteczny system inwestycyjny.
Więcej dowiesz się na
http://zobacz.CzarodziejAFL.pl/

Akcje, Kontrakty FW20, DAX, S&P500, Forex.


Artykuł pochodzi z serwisu www.Artelis.pl