Optymalizacja systemów w Amibrokerze

We wcześniejszych wpisach ?Testowanie przeszłości” część 1 i 2 autorstwa Zbyszka Jabłońskiego opisane zostały możliwości testowania systemu transakcyjnego przy użyciu Amibrokera. Dzięki tym testom, można było  dowiedzieć się, czy nasz system oparty na wskaźnikach był w stanie zarobić w przeszłości, a zatem czy przyjęte do jego budowy założenia miały jakikolwiek sens. Jednakże każdy wskaźnik, tym bardziej system wymaga pewnych stałych, określonych parametrów.

Autorzy wielu książek przedstawiający ?złote” metody na zarabianie pieniędzy w oparciu o analizę wskaźników proponowali swoje własne długości okresów dla wyliczania średnich, czy wskaźników. Dla przykładu, system Eldera oparty jest m.in. na tygodniowym MACD i sygnałach opartych na 2 dniowej EMA przecinającej swoją linię centralną (więcej w ?Zawód Inwestor Giełdowy” Alexander Elder). Dla systemu opartego na wskaźnikach AT, oczywiście poza częścią wspólną dla wszystkich systemów transakcyjnych tj. regułami wejścia na rynek i zamknięcia pozycji podstawową rzeczą będzie dobór parametrów dla wybranego wskaźnika. Wszakże to, co świetnie działało w którejś z amerykańskich książek z lat 80tych na kontraktach zbożowych może ponieść całkowitą klapę na futures na Wig20 w XXI wieku, mimo że dana metoda wydaję się mieć sens jako taka.

Tu z pomocą przychodzi Amibroker i formuła Optimize(). Przy jej użyciu możemy praktycznie zautomatyzować dobór najlepszych parametrów dla systemu transakcyjnego, biorąc pod uwagę zysk całkowity, średni zysk/stratę, czy jakąkolwiek inna miarę statystyczną rezultatu zawartych transakcji. Funkcja ta pozwala zbadać, czy dany system lepiej radzi sobie w krótkim, czy długim terminie, jak zachowuję się przy dużej zmienności danego waloru itp. Od strony technicznej formuła Optimize() umożliwia optymalizację od jednego do dziesięciu parametrów oraz pozwala określić wartości minimum/maximum, a także krok zmiany poszczególnych wartości. Funkcja może być używana jednocześnie na jednym, lub wielu instrumentach.

Sposób użycia formuły jest bardzo prosty, wystarczy określenie przy użyciu języka AFL optymalizowanego parametru, oraz warunku wejścia i wyjścia z rynku.

Składnia wygląda następująco:

zmienna = Optimize( “Etykieta”, default, Min, Max, krok);

gdzie:

?zmienna’ – to zmienna do której przyporządkowywane będą kolejne wartości w procesie optymalizacji.
?”Etykieta”‘ – to nazwa kolumny w tabeli wyników, gdzie prezentowane będą rezultaty dla danej wartości zmiennej
?default’ – ta wartość będzie używana podczas skanowania, eksploracji i innych opcji Automatic Analysis
?Min, Max, krok’- minimum, maximum, oraz krok, o jaki będzie zwiększana wartość zmiennej

Przykłady:

1.      Transakcje zawierane w oparciu o przecięcie linii sygnalnej MACD

sygnalna = Optimize( “Linia Sygnalna”, 9, 2, 30, 1 );

Buy = Cross( MACD( 12, 26 ), Signal( 12, 26, sygnalna ) );
Sell = Cross( Signal( 12, 26, sygnalna ), MACD( 12, 26 ) );

Słowo komentarza dla osób mniej obeznanych z językiem AFL: optymalizowany jest ostatni parametr funkcji Signal(), gdyż dwa pierwsze to okresy dla jakich ma ona być wyliczona i w założeniu powinny być takie same jak MACD.

2.      Dla odmiany CCI i dwie zmienne optymalizowane

per = Optimize(“per”, 2, 5, 50, 1 );
Level = Optimize(“level”, 2, 2, 150, 4 );

Buy=Cross( CCI(per), -Level );
Sell = Cross( Level, CCI(per) );

3.      Jak już wspominałem, Optimize() może działać na 10 parametrach jednocześnie. Tu przykład z modyfikacją wszystkich zmiennych MACD i linii sygnalnej

mfast = Optimize( “MACD Fast”, 12, 8, 16, 1 );   //średnia ruchoma szybka
mslow = Optimize(“MACD Slow”, 26, 17, 30, 1 );   //średnia ruchoma wolna
sigavg = Optimize( “Signal average”, 9, 2, 20, 1 );

Buy = Cross( MACD( sr_szybka, sr_wolna ) , Signal( sr_szybka, sr_wolna, sygnalna ) );
Sell = Cross( Signal( sr_szybka, sr_wolna, sygnalna ), MACD( sr_szybka, sr_wolna ) );

Po wybraniu “Optimize” w oknie Automatic Analysis wyświetlone zostaną wyniki testu, które możemy dowolnie sortować klikając na etykiecie kolumny. Domyślnie całość posegregowana jest w oparciu o zysk netto.

okno Automatic Analysis

Przykładowy test ?systemu” (kod #2) na 100 ostatnich notowaniach kontraktu FW20.

Największy zysk netto możliwy do osiągnięcia przy takich warunkach zawierania transakcji to 8,18% przy parametrach 38/118 🙂

Amibroker w ramach optymalizacji zmiennych poza prezentacją wyników w tabeli oferuje również wizualizację. Badając dwa parametry możemy wyświetlić wykres trójwymiarowy pokazujący zmianę wyniku – np. zysku netto wraz ze zmieniającymi się parametrami:

wykres 3D

By zamienić ?zysk netto’ należy posegregować ww. tabelę klikając na etykiecie kolumny, która nas interesuje i wygenerować wykres 3D ponownie. Używając wykresów trójwymiarowych możemy badać, czy system nie jest aby ?przeoptymalizowany” tj. dostosowany do jednego waloru z danego okresu czasu. W teorii najlepsze parametry kryją się tam, gdzie wykres jest możliwie najbardziej płaski, a ostre szczyty świadczą o zbytnim dostosowywaniu zmiennych do testu.

Okno Automatic Analysis zawiera jeszcze jedną ciekawą funkcjonalność ułatwiającą pracę przy optymalizacji zmiennych. Jest to przycisk ?Parameters’ dzięki któremu można edytować dowolny parametr z poziomu interfejsu graficznego, bez potrzeby każdorazowej ingerencji w kod.

formatka Parameters

Aby móc się nim posłużyć należy skorzystać z funkcji Param(), która zostanie zagnieżdżona w miejsce zwykłej zmiennej liczbowej w funkcji Optimize().

Przykład:

per = Optimize(“per”, 2, Param(“min_per”, 2, 2, 50, 1, sincr = 1),
Param(“max_per”, 10, 10, 150, 1, sincr = 1), 1 );

Zastąpione zostały parametry MIN i MAX funkcji Optimize() odpowiedzialne za zakres, w którym będzie optymalizowana zmienna per. Dokładny opis funkcji Param znajduje się na stronie Amibrokera (link powyżej).

Bartłomiej Szuba
b.szuba@bossa.pl

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

9 Komentarzy

  1. karlkir

    JA UŻYWAM CZEGOŚ TAKIEGO NIE BARDZO SIĘ ZNAM NA TYM JEZYKU ALE CZY NIE DAŁO BY SIĘ TEOGO JAKOŚ OPTYMALIZOWAĆ CHYBA CHODZIŁO BY O ZMIENNĄ PERIOD

    function ZeroLagTEMA( array, period )
    {
    TMA1 = TEMA( array, period );
    TMA2 = TEMA( TMA1, period );
    Diff = TMA1 – TMA2;
    return TMA1 Diff ;
    }
    /////////////////////
    // Heikin-Ashi code
    HaClose = (O H L C)/4;
    HaOpen = AMA( Ref( HaClose, -1 ), 0.5 );
    HaHigh = Max( H, Max( HaClose, HaOpen ) );
    HaLow = Min( L, Min( HaClose, HaOpen ) );
    // Velvoort is using not original, but modified Heikin-Ashi close
    HaClose = ( HaClose HaOpen HaHigh HaLow )/4;
    // you can switch between Heikin-Ashi chart and regular candlestick chart
    if( ParamToggle("Plot Heikin-Ashi", "No,Yes", 1 ) )
    PlotOHLC( HaOpen, HaHigh, HaLow, HaClose, "Heikin Ashi " Name(),
    colorBlack, styleCandle );
    else
    Plot( C, "Regular candles " Name(), colorBlack, styleCandle );
    period = Param("Avg. TEMA period", 55, 1, 100 );
    ZLHa = ZeroLagTEMA( HaClose, period );
    ZLTyp = ZeroLagTEMA( Avg, period );
    Plot( ZLHa, "ZLTema(Ha," period ")", colorRed );
    Plot( ZLTyp, "ZLTema(Typ," period ")", colorGreen );
    Buy = Cross( ZLTyp, ZLHa );
    Sell = Cross( ZLHa, ZLTyp );
    PlotShapes( shapeUpArrow * Buy, colorGreen, 0, HaLow );
    PlotShapes( shapeDownArrow * Sell, colorRed, 0, HaHigh );

  2. karlkir

    niestety wcięło wszystkie znaki plusa i nie będzie to działać

  3. Mike

    Jak chcesz na tym blogu wklejać kody, to musisz wrzucić gdzieś do sieci plik .afl i tu wpisać do niego link. Inaczej wycina wiele znaków i formuła jest kadłubkiem.

  4. karlkir

    ZNALAZŁEM TO NA STRONCE http://www.traders.com/Documentation/FEEDbk_docs/Archive/052008/TradersTips/TradersTips.html#amibroker
    ALE JUŻ ROZGRYZŁEM POWOLI TĄ OPTYMALIZACJĘ CAŁKIEM FAJNA SZCZEGÓLNIE JAK SIĘ MA WIĘCEJ NIŻ JEDEN PARAMETR

  5. bszuba

    w razie watpliwosci:

    period = Optimize("Avg TEMA", Param("domyslna_wartosc", 55, 10, 100), 10, 100, 1);

    🙂

  6. karlkir

    ok dzięki z parametrem nie próbowałem

  7. DAPI

    P. Michale

    Kiedy w koncu będą dane z rynku akcji skorygowane o dywidendy, splity i PP ?

  8. karlkir

    BIORĘ BAZĘ ZE STOOQ.PL TAM TO ROBIĄ 5 MINUT Z DWA LATA CHYBA OK 25ZŁ ZA MIESIĄC

  9. Pingback: MANUEL

Dodaj komentarz

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

Proszę podać wartość CAPTCHA: *