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.
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:
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.
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
9 Komentarzy
Dodaj komentarz
Niezależnie, DM BOŚ S.A. zwraca uwagę, że inwestowanie w instrumenty finansowe wiąże się z ryzykiem utraty części lub całości zainwestowanych środków. Podjęcie decyzji inwestycyjnej powinno nastąpić po pełnym zrozumieniu potencjalnych ryzyk i korzyści związanych z danym instrumentem finansowym oraz rodzajem transakcji. Indywidualna stopa zwrotu klienta nie jest tożsama z wynikiem inwestycyjnym danego instrumentu finansowego i jest uzależniona od dnia nabycia i sprzedaży konkretnego instrumentu finansowego oraz od poziomu pobranych opłat i poniesionych kosztów. Opodatkowanie dochodów z inwestycji zależy od indywidualnej sytuacji każdego klienta i może ulec zmianie w przyszłości. W przypadku gdy materiał zawiera wyniki osiągnięte w przeszłości, to nie należy ich traktować jako pewnego wskaźnika na przyszłość. W przypadku gdy materiał zawiera wzmiankę lub odniesienie do symulacji wyników osiągniętych w przeszłości, to nie należy ich traktować jako pewnego wskaźnika przyszłych wyników. Więcej informacji o instrumentach finansowych i ryzyku z nimi związanym znajduje się w serwisie bossa.pl w części MIFID: Materiały informacyjne MiFID -> Ogólny opis istoty instrumentów finansowych oraz ryzyka związanego z inwestowaniem w instrumenty finansowe.
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 );
niestety wcięło wszystkie znaki plusa i nie będzie to działać
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.
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
w razie watpliwosci:
period = Optimize("Avg TEMA", Param("domyslna_wartosc", 55, 10, 100), 10, 100, 1);
🙂
ok dzięki z parametrem nie próbowałem
P. Michale
Kiedy w koncu będą dane z rynku akcji skorygowane o dywidendy, splity i PP ?
BIORĘ BAZĘ ZE STOOQ.PL TAM TO ROBIĄ 5 MINUT Z DWA LATA CHYBA OK 25ZŁ ZA MIESIĄC
Pingback: MANUEL