2
PRACA DYPLOMOWA
„SYSTEM INFORMATYCZNY WSPOMAGAJĄCY DECYZJE
TRADERA”
3
SPIS TREŚCI
Wtęp 5
Cel Pracy 6
Rozdział I 7
1.1
Rynek kontraktów terminowych 7
1.1.1 Czas realizacji wzajemnych zobowiązań stron 7
1.1.2 Instrument bazowy, czyli przedmiot kontraktu 8
1.2
Zasady obrotu kontraktami terminowymi na indeksy 9
1.2.1 Nazwy skrócone kontraktów 9
1.2.2 Miesiące wykonania 10
1.2.3 Ostatni dzień obrotu, dzień wygaśnięcia kontraktu i pierwszy
dzień obrotu 10
1.2.4 Jednostka notowania, minimalny krok notowania,
mnożnik, wartość kontraktu 10
1.2.5 Dzienny kurs rozliczeniowy, dzienna cena rozliczeniowa 11
1.2.6 Ostateczny kurs rozliczeniowy, ostateczna cena rozliczeniowa 11
1.2.7 Depozyt zabezpieczający wnoszony przez inwestora 11
1.2.8 System codziennych rozliczeń 15
1.3 Rodzaje pozycji na rynku kontraktów terminowych 17
1.3.1 Pozycja długa (long) 17
1.3.2 Pozycja krótka (short) 18
1.3.3 Pozycja skorelowana 18
1.3.4 Zamknięcie pozycji 19
1.4
Dźwignia finansowa 20
Rozdział II 22
2.1 Transmisja danych giełdowych do systemu informatycznego 22
2.2
Opis systemu WealthLab 3.0 24
Rozdział III
Opracowanie systemu transakcyjnego opartego na logice rozmytej 26
3.1
Wybór kryteriów lokalnych i strategii w podjęciu decyzji traderskich 26
3.2
Wybór kryteriów lokalnych 26
3.3
Formalizacja kryteriów lokalnych za pomocą funkcji użyteczności 27
3.3.1 Zmiany cen zamknięcia poszczególnych barów 28
4
3.3.2 Definicja kryterium opartym o zmianę cen w ujęciu przedziałowym 29
3.3.3 Zmiana wielkości obrotu (wolumenu) na kolejnych barach 30
3.4
Agregowanie kryteriów lokalnych 31
3.5
Strategia działania systemu 36
3.6
Optymalizacja systemu transakcyjnego 36
3.7
Testowanie optymalizowanego systemu 38
3.8
Podsumowanie 40
ROZDZIAŁ IV
System transakcyjny oparty na podejściu ściśle wielokryterialnym 41
4.1
Wybór kryteriów lokalnych i strategii w podjęciu decyzji traderskich 41
4.1.1 Wybór kryteriów lokalnych 41
4.2
Formalizacja kryteriów lokalnych za pomocą funkcji użyteczności 42
4.2.1 Zmiany cen zamknięcia poszczególnych barów 42
4.2.2 Definicja kryterium opartego o zmianę cen w ujęciu przedziałowym 43
4.2.3 Kryterium oparte na zmianach wielkości obrotu (wolumenu)
na kolejnych barach 44
4.3
Agregowanie kryteriów lokalnych 45
4.4
Strategia 47
4.5
Optymalizacja systemu transakcyjnego 47
4.6
Testowanie optymalizowanego systemu 48
4.7
Podsumowanie 52
Zakończenie 53
Literatura 54
Spis tabel 55
Spis rysunków 55
Kody źródłowe 56
5
Wstęp
Tematem mojej pracy są systemy informatyczne wspomagające decyzje tradera.
Inwestowanie na rynku kapitałowym może być bardzo stresującym zajęciem. Uczestnikami
rynku są ludzie. Pod wpływem stresu możemy popełniać błędy. Decyzje, które w
normalnych warunkach zasłużyłyby na miano nietrafnych, w sytuacjach kryzysowych
urastają do rangi ostatniej deski ratunku. Co zrobić aby przeciwdziałać temu zjawisku?
Odpowiedź jest jedna. Zastosować komputer. Komputer nie ma emocji, podejmuje
błyskawicznie decyzje. Nie męczy się. Grający na rynkach kontraktów terminowych
najczęściej słyszą dwie podstawowe zasady postępowania - "ucinaj straty jak
najszybciej" oraz "pozwól zyskom rosnąć". Być może tak częste ich powtarzanie może
budzić irytację. Jednak jak wynika z ankiety przeprowadzonej wśród .użytkowników
serwisu www.futures.pl[1] (w okresie maj - lipiec 2002), nie jest to bezcelowe. Pytanie
zadane w ankiecie brzmiało: Jaki błąd z wymienionych najczęściej popełniasz (lub
najtrudniej Ci sobie z nim poradzić)?
Najczęściej wybieraną odpowiedzią było zbyt długie utrzymywanie stratnych
pozycji (20,7% odpowiedzi).
Wynika z tego, że największym problemem jest zastosowanie pierwszej
(uważanej za najważniejszą) z wymienionych reguł - "ucinaj straty możliwie szybko".
Pogodzenie się z faktem, że działalność na rynkach finansowych kończy się czasem stratą
jest bardzo trudne. Po otwarciu pozycji inwestor jest przekonany, że jego decyzja jest
błędna jeśli nie przynosi zysków zaraz po zawarciu transakcji (czasami wynika to z
opóźnienia w przekazywaniu zleceń pomiędzy brokerami – kilka minut może zmienić obraz
rynku całkowicie). Gdy rynek rusza w przeciwnym kierunku, w wielu w przypadkach
wpływa to na "ego" gracza - nie jestem taki dobry, pomyliłem się. Takie słowa często
obrazują stan psychiczny grającego. Do tego wcześniej czy później może dołączyć
nadzieja, że sytuacja wkrótce zmieni się na korzyść. Pozycja, która po pewnym czasie
jest zła, mogłaby zostać zamknięta z małą stratą, jednak wielu graczy nie może się z tym
pogodzić i czeka d o momentu, aż strata rozrośnie się do zbyt dużych rozmiarów.
Znaczna część graczy działających na rynkach po początkowym inwestowaniu
"na czuja" stara się jak najbardziej "zmechanizować" swoje podejście do handlu. Jednym
ze sposobów wyeliminowania emocji, które wpływają na podejmowanie decyzji jest
wykorzystanie automatycznych systemów transakcyjnych. Na drugiej pozycji pułapek z
6
którymi nie radzą sobie ankietowani wystąpił strach przed zajęciem pozycji po
wygenerowaniu sygnału przez system (17.3% odpowiedzi). Zakres działania systemu jest
mierzony w miesiącach a najczęściej w latach. Statystycznie z dobrym systemem gracz
otrzymuje przewagę nad rynkiem. Krytycznym czynnikiem jest liczba kolejnych
następujących po sobie wpadek. Najczęściej po 3,4 stratnych sesjach gracz zaczyna „wątpić”
w skuteczność opracowanego przez siebie systemu. Skutki ręcznego poprawiania decyzji
systemów mechanicznych są najczęściej opłakane – gracz może nawet w krytycznym
przypadku zbankrutować.
Tyle samo ankietowanych (17.3%) odpowiedziało, że dużym problemem
jest zbyt impulsywne podejmowanie decyzji.
Ponownie pojawia się problem dyscypliny. Zbyt emocjonalne podejście w wielu
przypadkach oznacza reagowanie i podejmowanie decyzji o kupnie i sprzedaży na podstawie
wszelkiego szumu napływającego na rynek - komentarzy analityków, opinii
znajomych, raportów makroekonomicznych, informacji o spółkach i setkach innych
czynników, które nie powinny mieć zbyt dużego wpływu na założony wcześniej plan
działania.
Cel Pracy
Na podstawie powyższych wiadomości jasno rysuje się potrzeba stworzenia czysto
automatycznego systemu komputerowego, który eliminowałby wady człowieka lecz
jednocześnie zachowywałby elastyczność myślenia oraz jego doświadczenie w czasie
podejmowania decyzji. Naturalnym staje się zastosowanie wielokryterialnego systemu
podejmowania decyzji z elementami logiki rozmytej. Celem tej pracy jest stworzenie takiego
systemu.
7
ROZDZIAŁ I
1.1 Rynek kontraktów terminowych
System automatyczny musi działać na określonym rynku (lub portfolio rynków o
podobnym charakterze), dla naszych rozważań skupimy się na rynku kontraktów
terminowych notowanych na Giełdzie Papierów Wartościowych w Warszawie, a zwłaszcza
na jego najpłynniejszym instrumencie – kontrakcie terminowym na indeks WIG20. Czym
jest więc kontrakt?
Kontrakt terminowy jest dwustronną umową, na podstawie której kupujący
zobowiązuje się do nabycia (przyjęcia), zaś sprzedający do zbycia (dostarczenia) w
ściśle określonym momencie w przyszłości określonej ilości wystandaryzowanego
instrumentu bazowego, po cenie ustalonej w momencie zawarcia transakcji. Realizacja
zobowiązań wynikających z umowy może nastąpić również poprzez równoważące
rozliczenie finansowe, polegające na zajęciu pozycji odwrotnej do pierwotnej.[2]
1.1.1 Czas realizacji wzajemnych zobowiązań stron
Jest nim konkretny moment w przyszłości ściśle określony przez giełdę,
na której notowane są kontrakty. Dzięki temu, strony nie są zobowiązane w momencie
zawierania transakcji do posiadania pełnego zabezpieczenia gwarantującego wywiązanie
się z umowy. Sprzedający nie musi posiadać instrumentu bazowego, zaś kupujący środków
odpowiadających wartości kontraktu. Realizację ich wzajemnych zobowiązań
gwarantuje system depozytów i codziennych rozliczeń w postaci tzw. równania do
rynku (mark-to-market). Kontrakty notowane są w seriach, którym przypisane są
konkretne miesiące wygaśnięcia, czyli terminy w których następuje rozliczenie
danej serii kontraktów. Dla kontraktów na indeks WIG20 notowanych na GPW w
Warszawie miesiące wygaśnięcia oznaczane są literami (H-marzec, M-czerwiec, U-
wrzesień, Z-grudzień) [3], a w przypadku notowań obowiązuje zasada trzech serii z
datami wykonania przypadającymi na trzy kolejne miesiące z marcowego cyklu
kwartalnego. Oznacza to, że na przykład w sierpniu w obrocie będą serie wygasające we
wrześniu w grudniu i w marcu następnego roku. Specyficzną cechą kontraktów
terminowych jest również możliwość realizacji zobowiązań każdej ze stron poprzez tzw.
8
równoważne rozliczenie pieniężne. Polega ona na tym, że nie ma konieczności czekania
do momentu wygaśnięcia kontraktu, a poprzez zajęcie pozycji odwrotnej do
pierwotnie posiadanej kupujący, bądź sprzedający mogą dokonać "kompensacji"
swych zobowiązań. Przykładowo strona, która poprzez kupno zobowiązała się do
przyjęcia określonej
ilości instrumentu bazowego może w dowolnej chwili sprzedać
kontrakt, przyjmując tym samym zobowiązanie do dostarczenia tego samego instrumentu.
Dzięki temu równoważy ona swe pierwotne zobowiązanie, a różnica pomiędzy ceną
obu transakcji stanowi zysk lub stratę. W ten sposób zamykana jest zdecydowana
większość kontraktów.
1.1.2 Instrument bazowy, czyli przedmiot kontraktu
Oprócz towarów fizycznych kontrakty terminowe mogą dotyczyć szeregu
instrumentów finansowych, jak chociażby akcje, stopy procentowe, kursy walut, czy
indeksy giełdowe i w takim wypadku określa się je mianem financial futures. Przedmiot
kontraktu jest ściśle wystandaryzowany, czyli określony pod względem ilości, jakości
i innych cech specyficznych dla danego instrumentu bazowego [4]. W znacznym stopniu
ułatwia to obrót kontraktami, gdyż strony dokładnie wiedzą z czym mają doczynienia i
czego mogą oczekiwać. Standaryzacja zapobiega również ewentualnym roszczeniom co
do stanu przedmiotu kontraktu, co ma szczególne znacznie w przypadku towarowych
kontraktów futures. W wielu przypadkach, zwłaszcza dotyczących financial futures, gdzie
fizyczna dostawa przedmiotu kontraktu byłaby utrudniona lub wręcz niemożliwa realizacja
zobowiązań następuje poprzez rozliczenie pieniężne, tak jak ma to miejsce chociażby w
przypadku kontraktów terminowych na WIG20. Jedynym elementem podlegającym
ustaleniu pomiędzy stronami transakcji jest cena kontraktu terminowego. Od
zaakceptowanego kursu zależą między innymi zyski lub straty kupującego i
sprzedającego kontrakt. Kształtowanie się kursu kontraktów zależy od zmian
rzeczywistych cen instrumentu, którego one dotyczą. Korelacja taka wynika chociażby z
faktu, że ostateczne rozliczenie kontraktu następuje w na podstawie cen aktywu
bazowego. Poziomy cen futures i gotówkowych są zazwyczaj inne, a różnice te maleją w
miarę zbliżania się terminu wygaśnięcia kontraktów. Różnica pomiędzy bieżącą ceną
gotówkową instrumentu bazowego, a kursem kontraktu terminowego nosi nazwę bazy,
która może przyjmować zarówno wartości dodatnie jak i ujemne.
9
1.2 Zasady obrotu kontraktami terminowymi na indeksy
Obrót kontraktami terminowymi odbywa się w systemie notowań ciągłych [5].
Otwarcie notowań następuje o godzinie 9.00 i trwa do 16.00. Od godziny 16.00 do
16.10 przyjmowane są zlecenia na zamknięcie notowań. Kurs ustalony na zamknięciu jest
kursem rozliczeniowym. Jednostką notowania jest jeden kontrakt terminowy. Ograniczenie
wahań kursów wynosi 10% od ostatniego kursu odniesienia. W sytuacji braku równowagi
na rynku, przewodniczący sesji może zmienić ograniczenie wahań kursów, przy czym
zmiana przekraczająca 15% od kursu odniesienia, może być dokonana pod warunkiem
uzyskania zgody KDPW.
Kursem odniesienia jest dzienny kurs rozliczeniowy z poprzedniej sesji. W pierwszym
dniu notowania kursem odniesienia jest kurs określony ze wzoru:
gdzie:
F - kurs odniesienia,
I -
ostatnia
wartość
indeksu
będącego
instrumentem
bazowym
z
ostatniej
sesji poprzedzającej sesję, na którą wyznaczany jest kurs odniesienia,
r - średnia ważona stopa rentowności 13 - tygodniowych bonów skarbowych z ostatniego
przetargu, który odbył się przed dniem w którym określany jest kurs odniesienia,
n - ilość dni od dnia ostatniej sesji poprzedzającej sesję, na którą wyznaczany jest kurs
odniesienia do dnia wygaśnięcia kontraktu.
Na rynek kontraktów terminowych przyjmowane są wszystkie rodzaje zleceń dostępne na
GPW w Warszawie.
1.2.1 Nazwy skrócone kontraktów
FW20kr, FTECkr, gdzie:
F- oznaczenie kontraktu terminowego
W20 i TEC - skrót nazwy instrument bazowego odpowiednio WIG20 i TECHWIG
k- kod określający miesiąc wykonania H- marzec, M- czerwiec, U- wrzesień, Z- grudzień
10
r- ostatnia cyfra roku wykonania
np. FW20U1- kontrakt dla którego instrumentem bazowym jest indeks WIG20,
miesiąc wykonania przypada we wrześniu 2001 roku.
1.2.2 Miesiące wykonania
Dla każdego indeksu notowane są jednocześnie trzy serie kontraktów. Miesiącami
wykonania są trzy najbliższe miesiące z cyklu marzec, czerwiec, wrzesień, grudzień.
Na przykład w sierpniu notowane będą jednocześnie serie o kolejnych miesiącach
wykonania wrzesień, grudzień i marzec.
1.2.3 Ostatni dzień obrotu, dzień wygaśnięcia kontraktu i pierwszy dzień
obrotu
Ostatnim dniem obrotu jest trzeci piątek miesiąca wykonania. Jeżeli w tym dniu nie
odbywa się sesja, to wówczas jest to ostatni dzień sesyjny przed trzecim piątkiem
miesiąca wykonania. Dzień wygaśnięcia kontraktu jest to ten sam dzień co ostatni dzień
obrotu. Pierwszym dniem obrotu nowej serii jest pierwszy dzień sesyjny po dniu
wygaśnięcia poprzedniego kontraktu.
1.2.4 Jednostka notowania, minimalny krok notowania, mnożnik, wartość
kontraktu
Kontrakty terminowe na indeksy są notowane w punktach indeksowych.
Oznacza to, że inwestor podaje w zleceniu w punktach indeksowych jaki poziom
indeksu akceptuje kupując lub sprzedając kontrakt (przy jakim poziomie indeksu
zobowiązuje się w przyszłości "dostarczyć" lub "odebrać" koszyk akcji reprezentujących
dany indeks). Minimalnym krokiem notowania jest 1 punkt indeksowy, co oznacza,
że kontrakty są notowane z dokładnością do 1 punktu indeksowego. Mnożnik jest
wielkością służącą do wyliczenia wartości kontraktu i wynosi dla obydwu klas
kontraktów 10 PLN (klasa kontraktu obejmuje wszystkie serie mające ten sam
instrument bazowy).
Wartość kontraktu to : Mnożnik x kurs kontraktu
11
Przykładowo inwestor kupując 1 kontrakt na WIG20 po cenie 1 500 zawiera
transakcję
o wartości 10 PLN x 1500 = 15 000 PLN.
1.2.5 Dzienny kurs rozliczeniowy, dzienna cena rozliczeniowa
Dziennym kursem rozliczeniowym jest kurs zamknięcia kontraktów danej serii. Jeśli
w czasie sesji nie określono kursu zamknięcia za dzienny kurs rozliczeniowy przyjmuje się
ostatni kurs rozliczeniowy.
Jeśli jednak w arkuszu zleceń na zamknięciu jest choć jedno zlecenie z limitem lepszym
(kupna wyższym, sprzedaży niższym) od kursu rozliczeniowego określonego na
w/w warunkach
i wprowadzone przynajmniej 5 minut przed końcem notowań, za kurs
rozliczeniowy przyjmuje się limit najlepszego z tych zleceń. W przypadku zleceń kupna jest
to najwyższy limit zlecenia kupna przekraczający kurs określony na w/w warunkach,
a w przypadku zleceń sprzedaży odwrotnie najniższy limit. Dzienna cena rozliczeniowa to
dzienny kurs rozliczeniowy pomnożony przez mnożnik.
1.2.6 Ostateczny kurs rozliczeniowy, ostateczna cena rozliczeniowa
Ostateczny kurs rozliczeniowy jest określany w dniu wygaśnięcia kontraktu
jako średnia arytmetyczna ze wszystkich wartości indeksu odpowiednio WIG20 i
TECHWIG w czasie ostatniej godziny notowań ciągłych, oraz wartości tego indeksu
ustalonej na zamknięcie sesji giełdowej. Ostateczna cena rozliczeniowa to ostateczny kurs
rozliczeniowy pomnożony przez mnożnik.
1.2.7 Depozyt zabezpieczający wnoszony przez inwestora
System depozytów polega na tym, że w momencie zawarcia transakcji
terminowej strony są zobowiązane uiścić jedynie ułamkową część wartości kontraktu,
wahającą się zazwyczaj od kilku do kilkunastu procent. Jest to więc swego rodzaju
wadium zabezpieczające wzajemne zobowiązania kupującego i sprzedającego
uzasadnione tym, że realizacja zobowiązań wynikających z umowy następuje w określonym
czasie w przyszłości, a nie w chwili zawarcia transakcji. Depozyty rozwiązują również
12
utrudnienia związane ze znaczną wartością kontraktów, stanowiącą barierę
finansową
dla wielu inwestorów. Przykładowo wartość kontraktu terminowego na akcje TPSA przy
kursie 14.5 zł. wynosi 500szt.x14.5zł.=7250 zł. Inwestor nabywający te walory na rynku
kasowym musiałby więc dysponować powyższą kwotą. Kupujący kontrakt terminowy
wnosi natomiast depozyt w wysokości 12.6% wartości kontraktu, czyli w tym
wypadku jedynie 913.5zł. Zgodnie z
obowiązującymi w naszym kraju regulacjami depozyty mogą być wnoszone w
postaci pieniężnej lub papierach wartościowych akceptowanych przez Krajowy Depozyt
Papierów Wartościowych, jednak w praktyce najczęściej wykorzystuje się formę
pieniężną. System depozytów jest jedną ze specyficznych cech rynków futures i
zazwyczaj obejmuje dwa ich rodzaje - depozyt wstępny i utrzymania.
Depozyt wstępny - zgodnie z regulacjami obowiązującymi w Polsce jest ustalany
przez KDPW jako wielkość procentowa liczona od wartości kontraktu określonej na
podstawie ostatniego kursu rozliczeniowego, którą należy wnieść w momencie zawarcia
transakcji. Ten poziom zabezpieczenia stanowi minimum uiszczane przez inwestora,
podczas gdy biura maklerskie, poprzez które następuje realizacja transakcji mogą go
podnosić, zwiększając tym samym wysokość depozytu. Zazwyczaj jednak stosuje
się depozyty wstępne równe wymaganym przez KDPW [6].
Depozyt utrzymania, nazywany również właściwym depozytem zabezpieczającym - jest
to minimalny poziom zabezpieczenia wyrażony również jako procentowa część wartości
kontraktu na podstawie ostatniego kursu rozliczeniowego, który inwestor jest zobowiązany
utrzymywać na swym rachunku. Obniżenie środków poniżej wielkości depozytu
utrzymania
powoduje wezwanie do uzupełnienia kwoty depozytu, a w przypadku niezastosowania się do
niego - zamknięcie utrzymywanej pozycji. Zgodnie z obecnymi przepisami
uzupełnienie następuje do wysokości określonej w umowie rachunku, jednak nie
mniej niż 140% wymagalnego aktualnego depozytu utrzymania. W praktyce
najczęściej powyższa wartość jest zbliżona do poziomu depozytu wstępnego.
13
Przykład
Zakładając, że kurs rozliczeniowy kontraktu terminowego na indeks WIG20 ustalony na
poprzedniej sesji wyniósł 1060 pkt. Wysokość depozytu wstępnego ( według stanu na dzień
15.09.2001r.) wynosi 7.8% wartości kontraktu, zaś depozytu właściwego 5.6%. Wartość
kontraktu,
będąca
podstawą
obliczania depozytów
na następnej
sesji wynosi
więc 10zł.x1060=10600 zł., a ich poziomy odpowiednio: depozyt wstępny - 7.8%x10600zł.=
826.8 zł., a depozyt właściwy - 5.6%x10600zł.= 593.6 zł. Niezależnie od kursu zawartej
transakcji kupujący i sprzedający obowiązani są posiadać na rachunku zabezpieczenie w
wysokości 826.8zł.
Załóżmy, że kurs transakcji wyniósł 1065 pkt., a kurs rozliczeniowy w dniu jej zawarcia
1046 pkt. W takiej sytuacji sprzedający osiągnął zysk wynoszący 190 zł.=(1065pkt.-
1046pkt.)x10zł. i taka kwota zostaje po rozliczeniu dopisana do jego rachunku. Kupujący
poniósł natomiast stratę w powyższej wysokości, o którą jest pomniejszany jego depozyt,
którego stan wynosi obecnie 636.8 zł. (826.8zł.-190zł.) Minimalny poziom zabezpieczenia
na kolejną sesję (na podstawie poprzedniego kursu rozliczeniowego) wynosi
1046pkt.x10zł.x5.6%=585.8 zł.
W kolejnym dniu kurs rozliczeniowy wynosi 1015 pkt. Zakładając, że pozycje
zostały utrzymane zysk sprzedającego wyniósł w tym wypadku 31 pkt. (1046-1015
pkt.) Daje to kwotę 310 zł. (31pkt.x10 zł.), o którą zwiększy się stan jego rachunku.
Nabywca kontraktu zanotował natomiast stratę w podobnej wysokości, czyli 310
zł., pomniejszającą jego depozyt, który wynosi obecnie 636.8 zł. - 310 zł.=326.8 zł.
Właściwy wymagany poziom zabezpieczenia (depozyt utrzymania) na następną sesję
wynosi 1015pkt.x10zł.x5.6%=568.4 zł. Kupujący nie posiada więc wystarczających
środków na swoim rachunku i zostaje wezwany do ich uzupełnienia. Kwota jaką
musi (po uzupełnieniu) posiadać nabywca kontraktu wynosi w tym wypadku
140%x568.4zł.=795.8zł. i jest zbliżona do poziomu depozytu wstępnego
(1015pkt.x10zł.x7.8%=791.7zł.). Uwzględniając stan rachunku należy więc uzupełnić go
o 469 zł
14
1. Parametry wspólne dla wszystkich klas
- parametr ograniczający wartość ryzyka dla opcji
50%
- wysokość stopy procentowej
4,1%
- parametr zwiększający wysokość depozytu
zabezpieczającego
140%
2. Parametry klas
Klasa
WIG 20
- właściwy depozyt zabezpieczający
5,8%
- wstępny depozyt zabezpieczający
8,1%
- zmienność
38,2%
- parametr modyfikujący zmienność dla opcji
5,0%
- współczynnik kredytowy
70,0%
Klasa
TECHWIG
- właściwy depozyt zabezpieczający
5,6%
- wstępny depozyt zabezpieczający
7,8%
Klasa
MIDWIG
- właściwy depozyt zabezpieczający
7,6%
- wstępny depozyt zabezpieczający
10,6%
Klasa
PS5
- właściwy depozyt zabezpieczający
2,0%
- wstępny depozyt zabezpieczający
2,8%
Klasa
USD
- właściwy depozyt zabezpieczający
3,0%
- wstępny depozyt zabezpieczający
4,2%
Klasa
EUR
- właściwy depozyt zabezpieczający
2,0%
- wstępny depozyt zabezpieczający
2,8%
Klasa
PKOBP S.A.
- właściwy depozyt zabezpieczający
8,2%
- wstępny depozyt zabezpieczający
11,5%
Klasa
BANK MILLENNIUM S.A.
- właściwy depozyt zabezpieczający
13,4%
- wstępny depozyt zabezpieczający
18,8%
Klasa
BZ WBK S.A.
- właściwy depozyt zabezpieczający
7,4%
- wstępny depozyt zabezpieczający
10,4%
Klasa
TP S.A.
- właściwy depozyt zabezpieczający
8,4%
- wstępny depozyt zabezpieczający
11,8%
- zmienność
36,1%
- parametr modyfikujący zmienność dla opcji
10,0%
- współczynnik kredytowy
70,0%
Klasa
PKN ORLEN S.A.
15
- właściwy depozyt zabezpieczający
9,4%
- wstępny depozyt zabezpieczający
13,2%
- zmienność
42,8%
- parametr modyfikujący zmienność dla opcji
10,0%
- współczynnik kredytowy
70,0%
Klasa
AGORA S.A.
- właściwy depozyt zabezpieczający
9,6%
- wstępny depozyt zabezpieczający
13,4%
Klasa
KGHM S.A.
- właściwy depozyt zabezpieczający
13,6%
- wstępny depozyt zabezpieczający
19,0%
- zmienność
68,8%
- parametr modyfikujący zmienność dla opcji
10,0%
- współczynnik kredytowy
70,0%
Klasa
BANK PEKAO S.A.
- właściwy depozyt zabezpieczający
10,6%
- wstępny depozyt zabezpieczający
14,8%
- zmienność
45,6%
- parametr modyfikujący zmienność dla opcji
10,0%
- współczynnik kredytowy
70,0%
Klasa
BRE BANK S.A.
- właściwy depozyt zabezpieczający
7,8%
- wstępny depozyt zabezpieczający
10,9%
Klasa
PROKOM SOFTWARE S.A
- właściwy depozyt zabezpieczający
7,2%
- wstępny depozyt zabezpieczający
10,1%
- zmienność
37,5%
- parametr modyfikujący zmienność dla opcji
10,0%
- współczynnik kredytowy
70,0%
Klasa
BANK BPH S.A.
- właściwy depozyt zabezpieczający
10,0%
- wstępny depozyt zabezpieczający
14,0%
Tabela 1. Wartości depozytów wstępnych i właściwych dla kontraktów terminowych [7]
1.2.8 System codziennych rozliczeń
Funkcjonowanie depozytów na rynku terminowym jest możliwe
między innymi dzięki zastosowaniu codziennego rozliczania zobowiązań inwestorów
posiadających otwarte pozycje, noszącego nazwę tzw. wyrównywania do rynku (mark-to-
market). System ten polega na tym, że zyski i straty z posiadanych pozycji rozliczane są po
każdym dniu notowań według kursu rozliczeniowego. Wynikające stąd zmiany na
16
rachunkach inwestorów powodują zwiększenie bądź zmniejszenie stanu ich
depozytu. Dzięki bieżącemu "korygowaniu" zobowiązań w zależności od zmian cen
na rynku praktycznie do minimum ogranicza się ryzyko nie wywiązania się z umowy
którejś ze stron transakcji.
Przykład
Prześledźmy zasadę codziennych rozrachunków na podstawie transakcji na kontrakt na
indeks TechWIG zawartej po kursie 610 pkt.
Dzień transakcji
Kurs rozliczeniowy po sesji został ustalony na 625 pkt., czyli zmiana wyniosła +15 pkt.
Na rachunek kupującego zostaje więc zapisana kwota 150 zł. (15pkt.x10zł.), zaś
depozyt sprzedającego jest o tę wartość pomniejszany.
Następny dzień
Kurs rozliczeniowy zostaje podliczony na 629 pkt. W tym wypadku zmiana wyniosła +4
pkt. (629pkt.-625 pkt.). Tym razem stan rachunku kupującego jest powiększany o
40 zł. (4pkt.x10zł.), co daje łącznie 190 zł.=150+40. Rachunek posiadacza krótkiej
pozycji ulega obciążeniu kwotą 40 zł. , czyli razem otrzymujemy -190 zł.=-150-40.
Następny dzień
Kurs rozliczeniowy kontraktu spada do poziomu 620 pkt., czyli o 9 pkt. (629pkt.-620pkt.).
Tym razem z rachunku kupującego pobierana jest kwota 90 zł. (9pkt.x10zł.), zaś
dotychczasowe jego saldo wynosi 100 zł.=150+40-90. Rachunek sprzedającego zostaje
powiększony o kwotę 90 zł., co daje łączny wynik -100zł.=-150-40+90.
Następny dzień - zamknięcie pozycji
Obecny kurs kontraktu wynosi 627 pkt. i obaj inwestorzy decydują się zamknąć swe pozycje.
Wzrost kursu wyniósł w tym wypadku +7pkt.(627pkt.-620pkt.) Do rachunku posiadacza
długiej pozycji zostaje więc dopisane kolejne 70zł.(7pkt.x10zł.), a tym samym łączny
wynik jego inwestycji przyniósł zysk w wysokości 170 zł.(150+40-90+70). Rachunek
sprzedającego jest natomiast pomniejszany o 70 zł., a jego inwestycja zakończyła się
łączną stratą w wysokości -170 zł. (-150-40+90-70).
17
Jak pokazuje powyższy przykład zyski lub straty jednej strony są równe stratom bądź zyskom
strony przeciwnej, dlatego też inwestycje na rynku futures jest nazywane grą o sumie zerowej.
1.3 Rodzaje pozycji na rynku kontraktów terminowych
1.3.1 Pozycja długa (long)
Otwierającym i posiadaczem długiej pozycji jest nabywca kontraktu
terminowego, przez co zobowiązuje się on do przyjęcia (kupna) w przyszłości określonej
ilości instrumentu bazowego po ustalonej cenie [8]. Zajmując długą pozycję inwestor
oczekuje więc wzrostu ceny instrumentu bazowego licząc, że w momencie wygaśnięcia
kontraktu będzie ona wyższa niż zapłacona w momencie zawarcia transakcji. Jeżeli
przewidywania te okażą się słuszne inwestor nabywa (przyjmuje) instrument bazowy
po cenie ustalonej w transakcji, czyli mniejszej niż aktualna na rynku kasowym, w
postaci fizycznej bądź rozliczenia finansowego. Powstała w ten sposób różnica stanowi
zysk posiadacza długiej pozycji. Jeżeli cena na rynku kasowym w momencie rozliczenia
jest niższa niż ustalona w chwili zawarcia kontraktu, wówczas kupujący
zobowiązany jest nabyć instrument bazowy drożej niż wynosi jego rzeczywista cena
ponosząc tym samym stratę.
Przykład:
Inwestor nabywa (otwiera długą pozycję) kontrakt opiewający na 500 akcji spółki ABC
po kursie 10 zł. przez co zobowiązuje się do przyjęcia w określonym czasie 500 akcji spółki
po cenie 10 zł. Załóżmy, że w dniu wygaśnięcia kurs akcji będący podstawą
rozliczenia kontraktów wyniósł 15 zł. Tym samym kupujący realizując swe zobowiązanie
nabywa 500 akcji po ustalonej cenie, po czym sprzedaje na rynku kasowym uzyskując tym
samym zysk w wysokości 2500 zł. = (15 zł. - 10zł.) x 500 akcji. Jeżeli natomiast rzeczywisty
kurs instrumentu w momencie rozliczenia spadnie np. do poziomu 7 zł. posiadacz
długiej pozycji poniesie stratę, nabywając akcje po cenie wyższej niż aktualna na rynku. W
tym wypadku będzie to 1500 zł. = (7zł.-10zł.) x 500 akcji.
18
1.3.2 Pozycja krótka (short)
Otwierającym i posiadaczem krótkiej pozycji jest sprzedający kontrakt
terminowy, przez co zobowiązuje się on do dostarczenia (zbycia) w przyszłości
określonej ilości instrumentu bazowego po ustalonej cenie. W tym wypadku oczekiwania
inwestora są więc przeciwne do otwierającego długą pozycję i spodziewa się on, że w
momencie wygaśnięcia rzeczywista cena instrumentu bazowego będzie niższa w stosunku do
ustalonej w kontrakcie. Jeżeli założenia te sprawdzą się realizując swe zobowiązania
inwestor nabywa instrument bazowy na rynku kasowym po czym sprzedaje go (dostarcza) po
wyższej cenie wynikającej z kontraktu osiągając tym samym zysk równy iloczynowi
różnicy kursów i ilości instrumentu bazowego. Jeżeli natomiast rzeczywisty kurs w
momencie wygaśnięcia jest wyższy niż ustalony w kontrakcie sprzedający zmuszony jest
nabyć instrument bazowy i dostarczyć go po niższej cenie zgodnie z umową ponosząc tym
samym stratę równą iloczynowi tej różnicy i ilości instrumentu.
Przykład:
Inwestor sprzedaje (otwiera krótką pozycję) kontrakt dotyczący 250 akcji spółki
ABC po kursie 100 zł. przez co zobowiązuje się do dostarczenia w określonym czasie
250 akcji po cenie 100 zł. Załóżmy, że w dniu wygaśnięcia kurs akcji będący
podstawą rozliczenia kontraktów wyniósł 60 zł. Tym samym sprzedający wypełniając
zobowiązanie nabywa na rynku 250 akcji po cenie 60 zł., po czym sprzedaje je zgodnie z
warunkami kontraktu po 100
zł. uzyskując tym samym zysk w wysokości 10000 zł. = (100 zł. - 60zł.) x 250 akcji.
Jeżeli natomiast rzeczywisty kurs instrumentu w momencie rozliczenia wzrośnie np.
do poziomu 120 zł. posiadacz krótkiej pozycji poniesie stratę, nabywając akcje na rynku po
cenie wyższej i zbywając je po kursie wynikającym z kontraktu. W tym wypadku będzie
to 5000 zł. = (100zł.-120zł.) x 250 akcji.
1.3.3 Pozycja skorelowana
Pozycja skorelowana polega na zajęciu przeciwnych pozycji (czyli długiej i
krótkiej) na kontraktach tej samej klasy (np. na WIG20) lecz różnych serii. Przykładowo
19
inwestor zajmuje krótką pozycję na kontraktach wygasających we wrześniu (seria
wrześniowa), zaś długą na kontraktach wygasających w grudniu (seria grudniowa).
Pozycja skorelowana pozwala wykorzystać różną zmienność kursów kontraktów
poszczególnych serii, a dzięki temu, że w pewnym stopniu równoważy zobowiązania
inwestora zarówno wstępny jak i właściwy depozyt zabezpieczający w porównaniu z
pojedynczą pozycją ulega w tym wypadku pomniejszeniu i ogólnie biorąc zazwyczaj jest
ustalany w oparciu o różnicę kursów rozliczeniowych obu serii.
1.3.4 Zamknięcie pozycji
Jest jedną z form realizacji zobowiązań wynikających z transakcji terminowej
polegającą na ich zrównoważeniu poprzez zajęcie pozycji odwrotnej do pierwotnie
posiadanej. Posiadacz długiej pozycji zobligowany do nabycia instrumentu bazowego
zawierając transakcję przeciwną, czyli zajmując pozycję krótką przyjmuje na siebie
obowiązek sprzedaży tego samego instrumentu. Dzięki temu pierwotne zobowiązanie
zostaje zrównoważone, a wynik inwestycji (zysk lub stratę) stanowi różnica pomiędzy
cenami obu transakcji. Analogicznie inwestor utrzymujący krótką pozycję, czyli
zobowiązany do dostarczenia w określonym czasie w przyszłości instrumentu bazowego
może poprzez zajęcie pozycji przeciwstawnej (długiej) zrównoważyć swe zobowiązanie
osiągając zysk lub ponosząc stratę w zależności od różnicy cen obu transakcji.
Przykład:
Inwestor otwiera długą pozycję nabywając kontrakt terminowy na indeks WIG20 po
kursie 1050 pkt. z terminem wygaśnięcia w grudniu 2001r. Tym samym jego zobowiązanie
obejmuje kupno instrumentu bazowego, o wartości 10500 zł. (1050pkt.x10zł.). Po
pewnym czasie decyduje się on zamknąć swą pozycję na rynku i w tym celu
dokonuje transakcji przeciwstawnej sprzedając kontrakt grudniowy po kursie 1020 pkt.,
czyli zajmując pozycję krótką. W tym wypadku inwestor zobowiązany jest więc do
dostarczenia instrumentu bazowego o wartości 10200 zł. (1020pkt.x10zł.). Dzięki
zamknięciu pozycji inwestor zrównoważył zdecydowaną większość swych zobowiązań
ponosząc
jedynie stratę wynikającą z różnicy cen obu transakcji (w tej sytuacji -
spadku), która wyniosła 300zł.=(1050-1020)x10zł.
20
Dzięki możliwości zamknięcia pozycji w dowolnej chwili inwestor nie musi więc
oczekiwać na wygaśnięcie kontraktu, co ma szczególne znaczenie dla
krótkoterminowych inwestycji o charakterze spekulacyjnym, a w przypadku
niewłaściwej oceny kierunku zmian cen instrumentu bazowego pozwala uniknąć
znacznych często strat bądź w miarę "płynnie" zrealizować zyski. W takim wypadku
nie ma też konieczności nabywania lub sprzedawania instrumentu bazowego na rynku
kasowym, gdyż rozliczenie następuje w postaci pieniężnej. Dlatego też większość
kontraktów terminowych, a szczególnie opiewających na instrumenty finansowe
(financial futures) jest rozliczana poprzez zamknięcie pozycji. W przypadku
zamykania pozycji inwestor nie wnosi depozytu zabezpieczającego.
1.4 Dźwignia finansowa
System depozytów pozwala na wykorzystanie tzw. dźwigni finansowej. Biorąc pod
uwagę, że depozyt stanowi jedynie ułamkową część wielkości zobowiązania, zmiana wartości
kontraktu w stosunku do zainwestowanych środków powoduje zwielokrotnienie zysków
lub strat. Działanie dźwigni najlepiej przedstawić na przykładzie.
Przykład 1:
Inwestor sprzedaje kontrakt na indeks WIG20 po 1120 pkt. Wartość kontraktu wynosi
więc11200 zł. (1120x10zł.), zaś wnoszony depozyt wstępny 873.6 zł. (11200zł.x7.8%).
Załóżmy, że po kilku sesjach kurs kontraktu spadł na 1060 pkt. i inwestor zamyka
otwartą pozycję kupując kontrakt. Wartość kontraktu zmniejszyła się o 600 zł. (60 pkt.x10
zł.) i wynosi 10600pkt. W ujęciu procentowym daje to zmianę o 5.4%. Spadek ten stanowi
zysk sprzedającego, który inwestując 873.6 zł. zarobił 600 zł., czyli 68.7%.
Przykład 2:
Inwestor sprzedaje kontrakt na indeks WIG20 po kursie 1120 pkt., którego wartość i
depozyt wynoszą podobnie jak wyżej odpowiednio 11200 zł. i 873.6 zł. Po pewnym
okresie kurs kontraktu zwyżkuje do poziomu 1150 pkt., a inwestor decyduje się zamknąć
dotychczasową pozycję poprzez zakup kontraktu. Wartość kontraktu w tym momencie
wyniesie więc 11500 pkt. (1150pkt.x10zł.), czyli zwiększy się o 300 zł.(30pkt.x10zł.), co
daje wzrost o ok. 2.7%. Dla posiadacza krótkiej pozycji jest to strata, która zmniejsza
21
wielkość zainwestowanego kapitału do 573.6 zł., czyli o ok. 34.3%.
Jak pokazują powyższe przypadki należy jasno zdawać sobie sprawę, że dźwignia
finansowa działa w obie strony. Jeżeli ocena kierunku ruchu cen okaże się trafna
dzięki dźwigni następuje wprawdzie zwielokrotnienie zysków, ale w przypadku, gdy
trend na rynku zmienia się niezgodnie w oczekiwaniami kupującego lub sprzedającego
może ona być przyczyną dotkliwych strat. (przy kursie 1450) na WIG20 (FW20).
Dzienna rozpiętość cen na FW20 waha się od 20 do nawet 100 pkt (kurs maksymalny -
kurs minimalny). Średnio jest to około 40 pkt. Wystarczy złapać ruch o 10 pkt. by na 5
kontraktach zarobić 5 * 10 pkt. * 10 zł = 500 zł. Dziennie 500 zł czyli 5 procent. W
miesiącu będzie to 100 procent, w roku... Albo -100%.
22
ROZDZIAŁ II
2.1 Transmisja danych giełdowych do systemu informatycznego
Aby podejmować decyzje na rynku kapitałowym potrzebujemy danych o aktualnej
sytuacji rynkowej. Do gry ręcznej wystarczą dane dostarczane w formie apletów Javy. W
sposób czytelny wyświetlają one informacje na temat aktualnego kursu, wolumenu oraz
rysują odpowiednie wykresy oparte na tzw. tickach to jest poszczególnych transakcjach.
Pobieranie danych do zastosowania we własnych systemach z wyżej wymienionych źródeł
jest jeśli nie problematyczne, to co najmniej nielegalne (konieczność dekompilacji apletu –
łamanie ustawy o ochronie praw autorskich). Jeśli chodzi o rynek polski najbardziej
rozsądna jest oferta firmy Statica [9], która dostarcza dane w postaci, którą możemy
dowolnie przetwarzać. Poprzez sztandarowy produkt jakim jest program Notowania2.
„Program Notowania, to wszechstronna, a jednocześnie prosta w obsłudze aplikacja,
przeznaczona dla osób inwestujących na rynkach finansowych, pragnących zapewnić sobie
stałe, wysokiej jakości źródło danych. Program działa w połączeniu z serwisem notowań w
czasie rzeczywistym.” [10].
„Notowania potrafią generować pliki tekstowe z notowaniami, aktualizowane po każdej
transakcji. Dzięki uniwersalnemu interfejsowi DDE, można prowadzić zaawansowaną analizę
swojego portfela w programie MS Excel. W prosty sposób można osadzić w nim notowania
wybranych instrumentów, które będą aktualizowane na bieżąco. DDE może być także
źródłem dla wielu programów do analizy technicznej. Użytkownicy takich popularnych
programów analitycznych jak Amibroker czy MetaStock Professional, mogą je zasilać
notowaniami w sposób ciągły za pośrednictwem interfejsu eSignal [11]. Ci użytkownicy,
którzy potrzebują dostępu do fizycznych plików binarnych MetaStocka, również się nie
zawiodą. Program Notowania, na ich życzenie może generować takie pliki w dowolnych
interwałach i aktualizować je po każdej transakcji. Aplikacja Notowania jest więc otwartym
źródłem danych dla profesjonalnych inwestorów, korzystających z całego spektrum
dostępnych na rynku rozwiązań.” [12]. Przykłady pracy programu Notowania2 zostały
zaprezentowane na Rys.1 oraz Rys. 2.
23
Rys1. Przykład działania programu Notowania2 firmy Statica (tabele z notowaniami)
Rys2. Przykład działania programu Notowania2 firmy Statica (wykres tickowy kontraktu FW20M6)
Transakcje giełdowe są centralnie rozliczane w systemie WARSET [13], który
funkcjonuje na Giełdzie Papierów Wartościowych w Warszawie. Dane o przeprowadzonych
operacjach są transmitowane do poddostawców tylko i wyłącznie przez dwukierunkowe łącze
24
satelitarne. Koszt takiego rozwiązania jest zbyt wysoki dla przeciętnego użytkownika.
Dlatego firmy takie jak Statica rozbijają te koszta na dużą liczbę swoich użytkowników. Po
dostarczeniu danych do klienta mogą one zostać wykorzystane przez jeden z wielu kanałów,
które zostały przedstawione powyżej. Dla naszych potrzeb wystarczający będzie interface
DDE lub eSignal. Powyższy schemat został przedstawiony w formie graficznej na Rys3.
Rys3. Droga danych giełdowych z Giełdy do klienta (opracowanie własne)
2.2 Opis systemu WealthLab 3.0
Wealth-Lab Developer 3.0 [14] jest kompletną platformą do rozwijania oraz
wstecznego testowania strategii inwestycyjnych. Zaprojektowany został do stosowania na
rynku akcji oraz kontraktów terminowych. Sprawdzone strategie mogą być następnie
zastosowane w czasie rzeczywistym używając automatycznego systemu handlowego, który
jest jedną z części funkcjonalnych systemu [15].
Język tworzenia systemów jest oparty na ObjectPascal. Jest w pełni obiektowym
językiem, z wbudowaną ogromną biblioteką funkcji odwzorowujących wskaźniki finansowe.
Jego możliwości są porównywalne z możliwościami języka C++. Dzięki takiemu połączeniu
możemy tworzyć bardzo skomplikowane systemy przy jednoczesnym zachowaniu
bezpieczeństwa kodu. Jest to szczególnie krytyczne jeśli chodzi o aplikacje działające na
rynku kapitałowym (gdzie chwilowy przestój przy otwartych pozycjach na rynku może
kosztować użytkownika fortunę). Przykład działania systemu WealthLab 3.0 przedstawia
Rys.4.
25
Rys.4. Okno główne programu WealthLab3.0 z otwartymi edytorami systemów
Tworzenie kodu jest bardzo proste. Dla przykładu kod obliczający bardzo popularną wśród
traderów wstęgę Bollingera oraz wyświetlający ją na ekranie:
PlotSeries( BBandLowerSeries( #Close, 20, 2 ), 0, 205, #Thick );
PlotSeries( BBandUpperSeries( #Close, 20, 2 ), 0, 205, #Thick );
Bardzo ważnym procesem w tworzeniu systemów handlowych jest ich optymalizacja.
Proces optymalizacji systemów wymaga testowania go dla zakresu różnych wartości dla
jednego bądź więcej parametrów. W WealthLab3.0 można optymalizować 10 różnych
parametrów w tym samym czasie za pomocą dwóch różnych metod [16]:
a) optymalizacja za pomocą metody Monte-carlo (system losowo dobiera parametry,
zawężając ich zakres w miarę polepszania się wyników symulacji – nie wymaga dużej
ilości czasu, lecz jego wadą jest możliwość utknięcia systemu na jednym z ekstremów
lokalnych, które w istocie nie jest ekstremum globalnym),
b) optymalizacja Exchautive (skanowanie całego zakresu wartości, bardzo czasochłonna
metoda, lecz jednocześnie najdokładniejsza).
26
ROZDZIAŁ III
Opracowanie systemu transakcyjnego opartego na logice rozmytej
3.1 Wybór kryteriów lokalnych i strategii w podjęciu decyzji traderskich
W codziennym życiu trader często staje przed problemem wyboru różnego rodzaju
decyzji dotyczących transakcji na rynku papierów wartościowych lub kontraktów. Nie zawsze
jest w stanie sam dokonać właściwej decyzji. Często następuje to z powodu słabej orientacji
w znaczeniu parametrów wskaźników analizy technicznej. Czasami występuje również
problem ze zbyt dużą ilością wskaźników zastosowanych do analizy (tzw. efekt
przeładowanych chartów). Dlatego dzisiaj dla wspomagania podejmowania decyzji na tego
rodzaju rynku coraz częściej używane są tzw. mechaniczne systemy traderskie, pozwalające
za pomocą metod matematycznych i informatycznych dostarczyć traderowi agregowane
informacje pomocne przy podejmowaniu decyzji. W ramach proponowanego podejścia
sugerujemy następujące kroki w opracowaniu systemu mechanicznego:
•
wybór kryteriów lokalnych;
•
formalizacja kryteriów lokalne za pomocą funkcji użyteczności (przynależności) ;
•
wyznaczenie współczynników względnej ważności kryteriów;
•
obliczenie kryteriów globalnych (agregowanie kryteriów lokalnych);
•
wybór strategii postępowania na podstawie obliczonych kryteriów globalnych;
•
optymalizacja strategii (wybór optymalizowanych wartości parametrów adaptacyjnych) na
podstawie wybranej funkcji celu kryterium globalnego (zazwyczaj maksymalizacja
dochodu).
3.2 Wybór kryteriów lokalnych
Aby wybrać odpowiednie kryteria lokalne należy zastanowić się które z parametrów
charakteryzujących wskaźniki analizy technicznej są najistotniejsze. Wybór ten jest
oczywiście subiektywny np. analizując daną sytuację rynkową wybrany wskaźnik prognozuje
“mocny wzrost” a inny sugeruje “lekki spadek”, kolejne sugeruje pozycję “neutralną” lub
“umiarkowany wzrost” etc. Istotnym jest, że rynek kształtują ludzie. Dlatego najważniejszym
jest wybór tych wskaźników analizy technicznej, które są najbardziej popularne w środowisku
traderów. Oczywistym jest, że wskaźników tych nie powinno być zbyt wiele, gdyż podjęcie
27
decyzji na podstawie ponad 800 wskaźników opisanych w literaturze [17] jest niemożliwe ze
względów ogólnometodologicznych. Rzecz w tym, że sprzeczność sygnałów generowanych
przez taką ilość wskaźników z reguły nie pozwala na podjęcie żadnej decyzji. Oprócz tego
istnieje zazwyczaj mocna korelacja statystyczna pomiędzy tymi wskaźnikami.
Wstępna analiza polskiego rynku kontraktów terminowych pozwala wnioskować, że
najbardziej istotnymi parametrami są:
1. Ceny zamknięcia kolejnych barów.
2. Zmiana cen na kolejnych barach w ujęciu przedziałowym tzn. z uwzględnieniem
całych zakresów wahań cen w ciągu poszczególnych barów.
3. Wielkość obrotu (wolumenu) na kolejnych barach.
Na podstawie tych parametrów wyliczane są wskaźniki analizy technicznej. Najczęściej
używanymi i z tej przyczyny najistotniejszymi do analizy są następujące:
1. Wartości średniej ruchomej
)
(N
SMA
(średnia wartość cen zamknięcia N kolejnych barów)
2. Szerokość wstęgi Bollingera dBol (zazwyczaj jest to podwójne odchylenie standardowe
cen zamknięcia N kolejnych barów)
3. Zmiana wielkości obrotu (wolumenu) na kolejnych barach dV
Oprócz standardowych wskaźników analizy technicznej wprowadzimy dodatkowy
wskaźniki uwzględniające zmianę cen w ujęciu barowym tzn. uwzględniając wachlarz cen na
wybranym horyzoncie czasowym za pomocą analizy przedziałowej. Przy tym formułujemy
dodatkowo trzy kryteria lokalne charakteryzujące zmiany cen w ujęciu barowym, zmiany cen
zamknięcia oraz zmiany wielkości obrotu na poszczególnych barach.
3.3 Formalizacja kryteriów lokalnych za pomocą funkcji użyteczności
W ramach proponowanego podejścia funkcja użyteczności opisujące kryteria lokalne
w sensie matematycznym jest ekwiwalentna funkcji przynależności – podstawowemu
elementowi teorii zbiorów rozmytych [18]. To znaczy, że wartości tej funkcji zmieniają się od
0, w zakresach niedopuszczalnych wartości parametrów jakości do 1, w zakresach
najlepszych wartości tych parametrów. W naszym przypadku parametrami jakości są
wymienione powyżej zmiany cen zamknięcia, zmiany cen na poszczególnych barach w ujęciu
przedziałowym oraz zmiany obrotu na poszczególnych barach. Opiszemy dokładniej te
parametry jakości
28
3.3.1 Zmiany cen zamknięcia poszczególnych barów
Zmianę cen zamknięcia definiujemy następująco dC = C
0
– C
1 ,
gdzie C
o
jest ceną
zamknięcia bieżącej sesji, C
1
ceną zamknięcia sesji poprzedniej (w giełdowych systemach
informatycznych numeracja sesji zaczyna się od sesji bieżącej wstecz). Formalizacja
kryterium lokalnego opartego na różnicy cen zamknięcia utrudnione jest z powodu dużego
zróżnicowania wartości parametru dC w zależności od zdarzeń na rynku . Na przykład dla
sytuacji beztrendowego rynku wartość dC = 5 pkt. może być potraktowana przez tradera jako
duża, jednak w warunkach mocnego trendu nawet wartość dC = 10 pkt. może być
potraktowane jako dosyć mała. Dlatego zamiast ocen sztywnych liczbowo w zgodności z
metodologią logiki rozmytej [18]
wprowadzimy lingwistyczne oceny występujących zmian.
Na przykład jeżeli
1
0
C
C
dC
−
=
i
0
>
dC
używamy 3 terminy lingwistyczne (Low
c
,Middle
c
,Big
c
) żeby zdefiniować wartość C
0
>C
1
z funkcjami przynależności przedstawionymi na
Rys. 5.
1
Medium
c
Big
c
0
dC
s
max
dC
µ
dC
Low
c
dC
s
med
Rys. 5. Funkcja przynależności dla “dC
s
is Big
c
” itd.
Warto podkreślić, że zdefiniowane i przedstawione powyżej kryterium lokalne µ
dC
zawiera
parametry adaptacyjne dC
s
max – maksymalna wartość różnicy cen zamknięcia dla okresu
dC
N
, którego wartość podlega optymalizacji , oraz dC
s
med. - wartość mediany wartości
różnicy cen zamknięcia z okresu
dC
N
. Analogicznie wygląda wykres funkcji przynależności
w przypadku kiedy
0
<
dC
.
29
3.3.2 Definicja kryterium opartym o zmianę cen w ujęciu przedziałowym
Istotnym jest to, że trader posiada informacje nie tylko o cenach otwarcia i zamknięcia ale też
o maksymalnych i minimalnych cenach, które zostały zanotowane w każdej z poszczególnych
sesji. W terminologii finansowej nazywane jest to barem, który w ujęciu arytmetyki
przedziałowej można przedstawić jako B
o
= [ L
0
, H
o
] , gdzie L
0
jest ceną minimalną bieżącej
sesji , H
o
ceną maksymalną bieżącej sesji. Jeżeli mamy informację o barach bieżącej i
poprzedzającej sesji,
[
]
0
0
, H
L
B
o
=
,
[
]
1
1
1
, H
L
B =
, to przedziałowo różnice cen w zgodnością z
podstawami
arytmetyki
przedziałowej
[19]
można
przedstawić
następująco
[ ] [
]
1
0
1
0
,
L
H
H
L
dB
−
−
=
. Przy tym lewa granica przedziału dB, (L
0
- H
1
),
jest maksymalną
możliwą stratą w przypadku najbardziej nieudanej gry. Natomiast prawa granica dB,
(H
0
- L
1
), jest maksymalnym możliwym zyskiem. Jednak bezpośrednie używanie wartości
przedziałowej [dB] jako parametru jakości, zwłaszcza jako argumentu funkcji użyteczności
charakteryzującej kryterium lokalne jest utrudnione. Dlatego używaliśmy parametru
pochodnego,
który
można
interpretować
jako
miarę
nierówności
przedziałów
charakteryzujących poszczególne bary.
Przypuśćmy, że mamy sytuację H
0
> H
1
, i L
0
> L
1
. W zgodności z definicjami
podstawowymi [20] oznacza to, że przedział B
o
w sensie przediałowym jest większy od
przedziału B
1
(B
o
> B
1
)
.
Nietrudno zauważyć, że przy tym wartość parametru
)
H
-
L
(
)
L
-
H
(
)
H
-
L
(
1
0
1
0
1
0
+
=
ε
zmienia się od
0 gdy L
0
= L
1
i
H
0
= H
1
( przedziały są równe ) do 1 gdy H
1
= L
0
. Jeżeli H
1
> L
0
, wtedy ε > 1.
Tak zdefiniowany parametr ε ilościowo reprezentuje stopień nierówności przedziałów.
Oczywiście nietrudno wprowadzić ε także dla innych sytuacji lokalizacji poszczególnych
barów np. L
1
< L
0
, H
1
< H
0
itd. Istnieją także bardziej skomplikowane sposoby oceny stopnia
nierówności przedziałów np. podejście probabilistyczne[21] pozwalające oprócz relacji
nierówności ocenić stopień równości.
Oprócz tego w danej sytuacji porównywania przedziałów charakteryzujących ceny
na instrumenty finansowe proponowane uproszczone podejście ma nawet zaletę ze względu
na możliwość uwzględnienia luki jaka często zachodzi między notowaniami w ciągu przerwy
w notowaniach ( dla przykładu rynek polski pracuje od godziny 9.00 do godziny 16.30 )
W naszym przypadku zachodzi to wtedy gdy L
1
< L
0
i H
1
- L
0
> 0.
30
W podejściu probabilistycznym w rezultacie porównania takich przedziałów niezmiennie
otrzymamy wartość 1. Z względu na to iż wartość dB może przyjmować zarówno wartości
dodatnie jak i ujemne konieczne jest wprowadzenie następującego skalowania:
Załóżmy że
))
(
)
((
1
0
1
L
H
H
L
dB
o
−
+
−
=
.
Jeżeli
0
>
dB
wtedy
)
(
)
(
1
1
1
0
L
H
H
L
o
−
−
+
=
ε
, jest stopniem wypełnienia nierówności, w danym
wypadku wyższości
0
B nad
1
B
.
Nietrudno zauważyć, że jeśli dB < 0 wtedy
)
(
)
(
1
1
1
0
H
L
L
H
o
−
−
+
=
ε
.
Dla oceny stopnia nierówności barów będziemy używali tylko trzech termów lingwistycznych
(Low
b
,Middle
b
,Big
b
). Ich funkcji przynależności są przedstawione na Rys.6.
1
Medium
b
Big
b
0
1
ε
µ
dB
Low
b
Rys. 6. Funkcji przynależności stopnia nierówności przedziału.
Wykres funkcji przynależności dla tego przypadku jest analogiczny do wykresu
przedstawionego na Rys. 6.
3.3.3 Zmiana wielkości obrotu (wolumenu) na kolejnych barach
Wolumen jest miarą zaangażowania traderów w danym okresie oceniane przez ilość
zawartych transakcji. Jeśli zmiany cen odzwierciedlają charakter nastrojów dominujących na
rynku, to wolumen pokazuje ich natężenie. Dlatego też analiza wolumenu w połączeniu z
ruchem cen jest niezbędna dla pełniejszego zrozumienia procesów zachodzących w strukturze
popytu i podaży. Zachowanie wolumenu może bowiem być sygnałem potwierdzającym
kierunek trendu, bądź też stanowić ostrzeżenie przed możliwością jego zmiany. Ogólnie
biorąc sprowadza się to do zasady, że zachowanie wolumenu powinno być zgodne z
kierunkiem aktualnej tendencji cenowej. W trendzie wzrostowym wolumen powinien
31
zwiększać się przy zwyżce cen i zmniejszać podczas spadkowych korekt. W trendzie
zniżkowym wolumen powinien rosnąć wraz ze spadkami oraz zmniejszać się w miarę
wzrostów. W takich przypadkach wolumen potwierdza zwiększone zaangażowanie
dominującej na rynku strony (popytu lub podaży), a tym samym kierunek trendu. W
przeciwnym razie zmiany wolumenu mogą być jednym z sygnałów ostrzegawczych przed
wyczerpywaniem się potencjału dotychczasowego ruchu i możliwą zmianą trendu. Dlatego
jako przedmiot analizy wybrano różnicę kolejnych wolumenów tj. dV = V
0
– V
1 ,
gdzie V
o
jest
wolumenem bieżącego bara, V
1
wolumenem bara poprzedniego. Wtedy funkcja użyteczności
gdy dV > 0 dla różnicy wolumenów może przybrać postać jak na Rys. 7.
µ
vol
Rys7. Funkcja użyteczności kryterium lokalnego opartego na różnicy wolumenów
.
Wartości dV min i dV max są ustalane dla
dV
N
kolejnych barów (parametr ten podlega
optymalizacji). W naszym przypadku głębokość analizy różnicy wolumenów
dV
N
jest taka
sama jak głębokość analizy dla cen zamknięcia. Przypadek gdy
0
≤
dV
jest analogiczny do
przypadku
0
>
dV
. Ma to na celu oddanie znaczenia wolumenów jako czynnika
wzmacniającego lub osłabiającego znaczenia aktualnej sytuacji na rynku.
3. 4 Agregowanie kryteriów lokalnych
Istnieje wiele sposobów agregowania kryteriów lokalnych z uwzględnieniem
współczynników ich względnej ważności. Najbardziej popularnymi są addytywne,
multiplikatywne oraz min-agregacja. Jednak w trakcie podejmowania decyzji trader
najczęściej w sposób jawny lub intuicyjny sumuje argumenty za i sprzeciw konkretnej
dV
dV max
dV min
1
32
transakcji dlatego, ze względów merytorycznych, został użyty addytywny sposobu agregacji
kryteriów lokanych.
∑
=
⋅
=
N
i
i
i
i
x
N
DD
1
),
(
1
µ
α
gdzie
)
(
),...,
(
),
(
2
2
1
1
n
n
x
x
x
µ
µ
µ
...... - to funkcje przynależności charakteryzujące poszczególne
kryteria, {x
i
} i=1, 2,…,N – jakościowe i ilościowe parametry jakości; α
1
, α
2
,...,α
N
– to
współczynniki względnej ważności kryteriów.
W naszym przypadku wzór ten przybiera postać:
c
dV
b
dB
a
dC
DD
α
µ
α
µ
α
µ
⋅
+
⋅
+
⋅
=
,
1
=
+
+
c
b
a
α
α
α
.
Z powyższej definicji wynika, że wartości kryterium agregowanego DD zawsze znajdują się
w przedziale [0,1]. Faktycznie DD jest kryterium charakteryzującym moc występującego
sygnału dla kupna BUY, sprzedaży SELL lub wstrzymania się od decyzji HOLD.
Dlatego pierwszym krokiem w ocenie słuszności sprzedaży, kupna lub wstrzymania się od
decyzji jest ustalenie ogólnej możliwości tych czynności i tylko potem ocena mocy tych
sygnałów. Istotnym jest ustalenie za pomocą rozwiązania optymalizacyjnego krytycznej mocy
kr
DD , przy której w rzeczywistości powinniśmy skorzystać z sygnału. Ustalenie ogólnej
możliwości wystąpienia sygnałów w ramach proponowanego systemu dokonuje się na
podstawie następujących reguł logiki rozmytej; opartych na protokole działalności tradera:
if ( dC > 0 ) then begin
if ( dC is BIG ) then begin
if ( dB > 0 ) then begin
if ( dB is BIG ) then BUY
if (dB is MID ) then BUY
if (dB is LOW ) then HOLD
end
else begin
if ( dB is BIG ) then HOLD
if ( dB is MID ) then BUY
if ( dB is LOW ) then SELL
end;
33
end;
if (dC is MID ) then begin
if ( dB > 0 ) then begin
if ( dB is BIG ) then BUY
if (dB is MID ) then BUY
if (dB is LOW ) then HOLD
end
else begin
if ( dB is BIG ) then BUY
if ( dB is MID ) then HOLD
if ( dB is LOW ) then HOLD
end;
end;
if (dC is LOW ) then begin
if ( dB > 0 ) then begin
if ( dB is BIG ) then BUY
if (dB is MID ) then HOLD
if (dB is LOW ) then HOLD
end
else begin
if ( dB is BIG ) then SELL
if ( dB is MID ) then HOLD
if ( dB is LOW ) then HOLD
end;
end;
end
else begin
if (dC is BIG) then begin
if ( dB > 0 ) then begin
if ( dB is BIG ) then HOLD
if (dB is MID ) then HOLD
if (dB is LOW ) then SELL
end
else begin
34
if ( dB is BIG ) then SELL
if ( dB is MID ) then SELL
if ( dB is LOW ) then HOLD
end;
end;
if (dC is MID ) then begin
if ( dB > 0 ) then begin
if ( dB is BIG ) then HOLD
if (dB is MID ) then HOLD
if (dB is LOW ) then SELL
end
else begin
if ( dB is BIG ) then SELL
if ( dB is MID ) then SELL
if ( dB is LOW ) then HOLD
end;
end;
if (dC is LOW) then begin
if ( dB > 0 ) then begin
if ( dB is BIG ) then HOLD
if (dB is MID ) then SELL
if (dB is LOW ) then SELL
end
else begin
if ( dB is BIG ) then SELL
if ( dB is MID ) then SELL
if ( dB is LOW ) then HOLD
end;
end;
end;
end;
Jak widać w ustalenie możliwości sygnałów używamy wyłącznie rozmytych kryteriów
opartych na różnicy cen zamknięcia i przedziałowej różnicy barów. Lokalne kryterium oparte
35
na różnicy wolumenów używane jest jako uzupełniające wyliczenie mocy sygnału (kryterium
agregowane DD) .
W ramach proponowanego podejścia używamy następującej metody oceny podjęcia decyzji
na podstawie sformułowanych reguł logiki rozmytej i kryterium DD . Najpierw za pomocą
logiki rozmytej wyznaczamy najbardziej prawdopodobny sygnał (sygnał o największej mocy)
z
BUY
DD
,
SELL
DD
oraz
HOLD
DD
. Dalej wyliczamy moc tego sygnału jako wartość kryterium
DD . Jeżeli DD okazuje się większe od optymalizacyjnej wartości krytycznej
kr
DD i są przy
tym spełnione inne warunki w ramach ogólnej strategii wtedy podejmujemy wyznaczoną
decyzję.
Według naszych doświadczeń w skutek stochastyczności rynku, w praktyce takie podejście
generuje zbyt dużo sygnałów transakcyjnych, często nieistotnych, tzn. nie charakteryzujących
długoterminowe trendy co zmniejsza efektywność całego systemu. Dlatego zastosowaliśmy
dodatkowo wygładzenie (uśrednienie) wygenerowanych sygnałów na pewnej ilości ostatnich
barów (
DD
N
).
)
(
)
(
)
(
)
(
)
(
0
0
0
0
i
DD
i
DD
i
DD
i
DD
HOLD
N
i
SELL
N
i
BUY
N
i
BUY
N
i
W
DD
DD
DD
DD
BUY
DD
∑
∑
∑
∑
=
=
=
=
+
+
=
,
)
(
)
(
)
(
)
(
)
(
0
0
0
0
i
DD
i
DD
i
DD
i
DD
HOLD
N
i
SELL
N
i
BUY
N
i
SELL
N
i
W
DD
DD
DD
DD
SELL
DD
∑
∑
∑
∑
=
=
=
=
+
+
=
,
)
(
)
(
)
(
)
(
)
(
0
0
0
0
i
DD
i
DD
i
DD
i
DD
HOLD
N
i
SELL
N
i
BUY
N
i
HOLD
N
i
W
DD
DD
DD
DD
HOLD
DD
∑
∑
∑
∑
=
=
=
=
+
+
=
.
W rezultacie zamiast wartości DD wyliczonej na poszczególnym barze używaliśmy
wygładzonej wartości
W
DD przy czym głębokość wygładzenia
DD
N
była parametrem
optymalizowanym.
36
3.5 Strategia działania systemu
Proponowany system mechaniczny oparty jest na strategii łączącej sygnały
tradycyjnych, najczęściej używanych w praktyce traderskiej wskaźników analizy technicznej
oraz proponowanych agregowanych kryteriów w syntezie z logiką rozmytą.
Podstawowym sygnałem dla rozpoczęcia analizy jest przekroczenie szerokości wstęgi
Bollingera dBol niektórych wartości krytycznych
k
dBol . Jest to uzasadnione tym, że
szerokość wstęgi Bollingera charakteryzuje ogólną aktywność rynku. Teoria i praktyka
analizy technicznej[22]
wskazuje na to, że wzrost dBol jest dosyć niezawodnym sygnałem
przejścia rynku z trendu bocznego (Flat) do rzeczywistego trendu (Uptrend bądź Downtrend).
W razie spełnienia warunku dBol >
k
dBol następnym krokiem analizy jest wyznaczenie
słusznego sygnału za pomocą opisanych w podrozdziale 3.4 reguł logiki rozmytej oraz
wielokryterialnej oceny mocy sygnału. Jeżeli okazuje się, że za pomocą analizy średnich
ruchomych i analizy na podstawie logiki rozmytej otrzymujemy jednakowe sygnały to
podejmujemy decyzję BUY albo SELL lub wstrzymujemy się od handlu.
Zamykanie pozycji w ramach proponowanego systemu dokonuje się po wyczerpaniu się
trendu. Sygnałem do tego jest przecięcie sygnałów wskaźnika wielokryterialnego (tj. kiedy
jest więcej przesłanek za zajęciem przeciwnej pozycji). Niezbędnym elementem każdego
systemu transakcyjnego jest ograniczenie ryzyka za pomocą zleceń STOP. Przy tym
obowiązkowe jest wprowadzenie sygnałów STOP BUY oraz STOP SELL dla redukcji strat w
przypadku niewłaściwie zajętej pozycji. Na razie nie wprowadziliśmy optymalizacji
głębokości sygnałów STOP lecz
założyliśmy następujące procedury zleceń sygnałów stop:
Dla pozycji długiej (BUY):
)
30
(
1
pkt
L
stop
−
=
,
Dla pozycji krótkiej (SELL):
)
30
(
1
pkt
H
stop
+
=
.
Gdzie punkt jest jednostką notowania kontraktów w naszym przypadku 1pkt = 10zł).
3.6 Optymalizacja systemu transakcyjnego
Opisany powyżej system transakcyjny zawiera następujące parametry podlegające
optymalizacji:
• period ( ilość uwzględnionych barów) wstęgi Bollingera -
bol
N
,
37
• krytyczna szerokość wstęgi Bollingera, przy której podejmujemy decyzje
inwestycyjne -
k
dBol ,
• głębokości analizy
dC
N
dla dC oraz
dV
N
dla dV (ilości uwzględnionych barów)
gdzie
dV
dC
N
N
=
,
• stopień wygładzenia sygnału generowanego przez wskaźnik wielokryterialny -
(ilości uwzględnionych w wygładzeniu sygnałów) -
DD
N
,
• parametry względnej ważności kryteriów lokalnych
c
b
a
α
α
α
,
,
.
Jako kryterium optymalizacji używamy osiągnięty dochód D osiągnięty w okresie uczącym.
W rezultacie zagadnienie optymalizacji było sformułowane jako:
(
)
(
)
.
,
,
,
,
,
,
max
arg
,
,
,
,
,
,
c
b
a
DD
dC
k
bol
opt
c
b
a
DD
dC
k
bol
N
N
dBol
N
D
N
N
dBol
N
α
α
α
α
α
α
=
Optymalizacja systemu polegała na jak najlepszym doborze wartości omówionych
powyżej parametrów adaptacyjnych systemu dla okresu uczącego tj. okresie od 30.09.2005 do
01.01.2006r. W rezultacie optymalizacji systemu otrzymaliśmy następujące wyniki dla okresu
uczącego:
Long + Short
Long Only
Short Only
Buy & Hold
Net Profit
318,00
121,00
197,00
188,00
Profit per Bar
1,64
1,12
2,29
0,38
Number of Trades
29
17
12
1
Winning %
55,17%
64,71%
41,67%
100,00%
Max Drawdown
-71,00
-53,00
-82,00
-314,00
Profit Factor
2,75
2,11
3,70
INF
Payoff Ratio
2,02
0,94
5,10
INF
Przedstawiony powyżej zysk mierzony był w punktach jakie zarabiałby dla nas pojedynczy
kontrakt. 1 pkt ma wartość 10 pln. Nie uwzględniono reinwestowania zarobionego kapitału.
Zalecanym horyzontem według przeprowadzonych badań dla inwestora indywidualnego jest
horyzont godzinowy. Oferuje on wartość współczynnika Winning wynosząca 55,17% oraz
Profit Factor na poziomie 2,75. Dzięki wysokiej wartości obu współczynników połączonej z
odpowiednim zarządzaniem kapitałem (które to zagadnienie samo w sobie jest rozległą i
bardzo skomplikowaną dziedziną) możemy osiągnąć stabilny dochód 318,00pkt * 10zł =
3180 zł (z uwzględnieniem kosztów transakcyjnych w wysokości 9zł za zawarcie 1
38
transakcji), wartość depozytu koniecznego do zawarcia transakcji kupna kontaktu to około
2000zł. Kapitał wyjściowy to 3180zł + 2000zł = 5180 zł. Sumaryczny zysk wynosi więc
około 160%.
3.7 Testowanie optymalizowanego systemu
Jak przedstawiono w poprzednim podrozdziale system był optymalizowany na
podstawie danych od 30.09.2005r. do 01.01.2006r. (okres uczący). Ze względu na fakt iż
logika rozmyta modeluje zachowania ludzi konieczne stało się zastosowanie danych z
krótszego okresu czasu niż jest to normalnie przyjęte w testowaniu systemów transakcyjnych.
W ciągu czterech miesięcy rynek zmienia się gwałtownie, nowi ludzie zaczynają handel,
zmieniają się zarządzający funduszami. Zmiany te mają istotny wpływ na zachowanie
przedstawionego systemu.
Otrzymane optymalizowane parametry z okresu uczącego zostały użyte dla testowania
systemu na danych z następującego okresu od 01.01.2006r. do 13.03.2006r. Na Rys. 8
przedstawiono przykładowy przebieg notowań wraz z wykresem wskazań opracowanego
systemu po dokonaniu optymalizacji parametrów. Wskaźnik górny przedstawia wskaźnik
wielokryterialny, wskaźnik środkowy przedstawia wskaźnik szerokości wstęgi Bollingera.
39
Rys. 8. Przykładowy przebieg notowań z wykorzystaniem systemu.
Dla okresu testowego od 01.01.2006r. do 12.03.2006r. otrzymaliśmy następujące wyniki:
Long + Short Long Only
Short Only
Buy & Hold
Net Profit
161,00
38,00
123,00
115,00
Profit per Bar
1,04
0,61
1,32
0,28
Number of Trades
30
13
17
1
Winning %
50,00%
46,15%
52,94%
100,00%
Max Drawdown
-199,00
-209,00
-81,00
-268,00
Profit Factor
1,49
1,19
1,95
INF
Payoff Ratio
1,28
1,40
1,26
INF
Wynik liczony był w punktach jakie zarabia dla nas 1 kontrakt terminowy na indeks WIG20.
1 punkt jest wart 10zł tak więc system zarobił dla nas w okresie testowym 1610 zł (z
uwzględnieniem kosztów transakcyjnych w wysokości 9zł za każdą transakcję). Wartość
depozytu wynosi około 2000zł. Całkowity kapitał po okresie testowym wynosi więc 3610 zł.
Sumaryczny dochód wynosi około 80%. Krzywa wzrostu kapitału całego okresu
(uczący+testowy) przestawiona jest na Rys. 9. Jak widać jest ona dosyć stabilna.
40
Rys. 9. Zmiana kapitału w czasie od 30.09.2005r do 12.03.2006r
3.8 Podsumowanie
Opracowany system transakcyjny oparty na syntezie tradycyjnych wskaźników
analizy technicznej oraz wprowadzonych kryteriów lokalnych włącznie z używanymi
metodami wielokryterialnymi i logiki rozmytej pozwalają na osiągnięcie wysokich zysków na
rynku kontraktów terminowych na indeksie WIG20.
Okres uczący - 3180 zł
Okres testowy – 1610 zł
Zysk z całego okresu działalności systemu (okres uczący i testowy) – 4790 zł
Kapitał wyjściowy 6790zł w okresie 6 miesięcy.
Sumaryczny zysk wynosi około 240%.
Główną zaletą proponowanej metody jest możliwość wielokryterialnej optymalizacji strategii
podjęcia decyzji traderskich. System dał dobre wyniki zarówno na zbiorze uczącym jak i na
zbiorze testowym.
41
ROZDZIAŁ IV
System transakcyjny oparty na podejściu ściśle wielokryterialnym
Przedstawiony w rozdziale III system ma wiele zalet (Rozdział III podpunkt 3.9), lecz
niewątpliwie posiada też wady. Do podstawowych możemy zaliczyć:
a) system reguł logiki rozmytej powstał on na podstawie protokołu działalności tradera, i
nie może podlegać procesowi optymalizacji; reguły mogą być źle dobrane i
powodować obniżenie efektywności systemu,
b) mimo, iż system dobrze radzi sobie podczas trendu bocznego (konsolidacja), unikając
błędnych transakcji dzięki regule HOLD (wstrzymaj się od handlu), wykazuje
niepokojącą skłonność do głębokiej penetracji portfela przy osunięciach kapitału,
transakcje takie przy występowaniu dźwigni finansowej mogą doprowadzić system do
bankructwa już w początkowej fazie inwestowania – mimo późniejszego,
hipotetycznego sukcesu.
Aby wyeliminować powyższe wady oraz poprawić parametry funkcjonalne systemu
proponuje się wprowadzenie nowego, gdzie w miejsce reguł logiki rozmytej wprowadzi się
nowe kryteria lokalne, które będą elastyczniej reagować na zachowania uczestników rynku.
Dla potrzeb nowego systemu konieczny jest również nowy sposób agregacji kryteriów
lokalnych, gdyż wpływa on bardzo znacząco na końcowe wyniki pracy sytemu [23].
4.1 Wybór kryteriów lokalnych i strategii w podjęciu decyzji traderskich
4.1.1 Wybór kryteriów lokalnych
Aby wybrać odpowiednie kryteria lokalne należy zastanowić się, które z parametrów
charakteryzujących wskaźniki analizy technicznej są najistotniejsze. Wybór ten jest
oczywiście subiektywny np. analizując daną sytuację rynkową wybrany wskaźnik prognozuje
“mocny wzrost” a inny z kolei sugeruje “lekki spadek”, kolejne sugerują pozycję “neutralną”
lub “umiarkowany wzrost” etc. Wstępna analiza rynku pozwala wnioskować, że najbardziej
istotnymi parametrami dla analiz są:
1.Ceny zamknięcia kolejnych barów.
2. Zmiana cen na kolejnych barach w ujęciu przedziałowym tzn. z uwzględnieniem całych
zakresów wahań cen w ciągu poszczególnych barów.
42
3.Wielkość obrotu (wolumenu) na kolejnych barach.
Na podstawie tych parametrów wyliczane są wskaźniki analizy technicznej. Najczęściej
używanym i z tej przyczyny najistotniejszymi do naszej analizy jest szerokość wstęgi
Bollingera dBol (zazwyczaj jest to podwójne odchylenie standardowe cen zamknięcia N
kolejnych barów) określający dynamikę rynku.
4.2 Formalizacja kryteriów lokalnych za pomocą funkcji użyteczności
W ramach naszego podejścia funkcja kryterialna opisująca kryterium lokalne w sensie
matematycznym jest ekwiwalentna funkcji przynależności – podstawowemu elementowi
teorii zbiorów rozmytych. To znaczy, że wartości tej funkcji zmieniają się od 0 do 1 w
zakresach niedopuszczalnych wartości parametrów jakości do 1 w zakresach najlepszych
wartości tych parametrów. W naszym przypadku parametrami jakości są wymienione
powyżej zmiany cen zamknięcia, zmiany cen na poszczególnych barach w ujęciu
przedziałowym oraz zmiany obrotu na poszczególnych barach. Opiszemy dokładniej te
parametry jakości.
4.2.1 Zmiany cen zamknięcia poszczególnych barów
Zmiana cen zamknięcia definiujemy następująco dC = C
0
– C
1
,
gdzie C
o
jest ceną zamknięcia
bieżącej sesji, C
1
ceną zamknięcia sesji poprzedniej.
Funkcje kryterialne
CBUY
µ
,
CSELL
µ
odpowiadające sygnałom kupna i sprzedaży zostały
sformalizowane w sposób pokazany na Rys.10.
43
CBUY
µ
CSELL
µ
Rys.10. Funkcje kryterialne
CBUY
µ
,
CSELL
µ
.
Wprowadzone funkcje charakteryzują wzrost mocy sygnału BUY ze wzrostem przyrostu dC
oraz wzrost sygnału SELL przy spadku dC. Wartość funkcji 0.5 dla zerowych dC
charakteryzuje sytuację (brak zmiany cen zamknięcia), w których mamy 50%
prawdopodobieństwa trendów uptrend i downtrend.
Warto podkreślić, że zdefiniowane powyżej kryteria lokalne
CBUY
µ
,
CSELL
µ
oparte są na
parametrach dC
s
max – maksymalna wartość różnicy cen zamknięcia oraz dC
s
min. - wartość
minimalna różnicy cen zamknięcia dla wybranego okresu
dC
N
(ilość ostatnich barów).
dC
N
jest parametrem adaptacyjnym poszukiwanym w trakcie rozwiązania problemu
optymalizacyjnego.
4.2.2 Definicja kryterium opartego o zmianę cen w ujęciu przedziałowym
Model matematyczny powyższego kryterium jest identyczny z modelem zastosowanym w
systemie przedstawionym w podrozdziale 3.3.2. W tym przypadku zrezygnowaliśmy z użycia
termów lingwistycznych do oceny stopnia nierówności przedziałów. Używać będziemy
jedynie czystej wartości funkcji kryterialnych
BBUY
µ
,
BSELL
µ
charakteryzujących moc sygnału
kupna lub sprzedaży w zależności od zmian cen w ujęciu przedziałowym (Rys.11)
CBUY
µ
0.5
1
0
min
dC
max
dC
CSELL
µ
0
1
min
dC
max
dC
0.5
44
Rys.11. Funkcje kryterialne
BBUY
µ
,
BSELL
µ
.
4.2.3 Kryterium oparte na zmianach wielkości obrotu (wolumenu) na
kolejnych barach
Wolumen jest miarą zaangażowania traderów w danym okresie oceniana przez ilość
zawartych transakcji. Jeśli zmiany cen odzwierciedlają charakter nastrojów dominujących na
rynku, to wolumen pokazuje ich natężenie. Dlatego też analiza wolumenu w połączeniu z
analizą zmian cen jest niezbędna dla pełniejszego zrozumienia procesów zachodzących w
strukturze popytu i podaży. Zachowanie wolumenu może bowiem być sygnałem
potwierdzającym kierunek trendu, bądź też stanowić ostrzeżenie przed możliwością jego
zmiany. Ogólnie biorąc, sprowadza się to do zasady, że zachowanie wolumenu powinno być
zgodne z kierunkiem aktualnej tendencji cenowej. W trendzie wzrostowym wolumen
powinien zwiększać się przy wzroście cen i zmniejszać podczas spadkowych korekt. W
trendzie zniżkowym wolumen powinien rosnąć wraz ze spadkami oraz zmniejszać się w
miarę wzrostów. W takich przypadkach wolumen potwierdza zwiększone zaangażowanie
dominującej na rynku strony (popytu lub podaży), a tym samym kierunek trendu. W
przeciwnym razie zmiany wolumenu mogą być jednym z sygnałów ostrzegawczych przed
wyczerpywaniem się potencjału dotychczasowego ruchu i możliwą zmianą trendu. Dlatego
jako parametr analizy wybrano różnicę kolejnych wolumenów tj.
1
0
dV
dV
dV
−
=
,
gdzie V
o
jest wolumenem bierzącego bara, V
1
wolumenem bara poprzedniego. Funkcja kryterialna
V
µ
oparta na parametrze dV została zdefiniowana jak na Rys.12.
BBUY
µ
,
BSELL
µ
1
ε
1
0
45
Rys.12. Funkcja kryterialna
V
µ
.
Oczywiście kształt tej funkcji jest taki sam przy wystąpieniu sygnałów BUY i SELL
dostarczanych przez inne wskaźniki.
Warto podkreślić, że zdefiniowane powyżej kryterium lokalne
V
µ , oparte jest na parametrach
dV max – maksymalna wartość różnicy wolumenów oraz dV min. - wartość minimalna
różnicy wolumenów dla wybranego okresu
dV
N
(ilość ostatnich barów).
dV
N
jest
parametrem
adaptacyjnym
poszukiwanym
w
trakcie
rozwiązania
problemu
optymalizacyjnego.
4. 3 Agregowanie kryteriów lokalnych
Istnieje wiele sposobów agregowania kryteriów lokalnych z uwzględnieniem
współczynników ich względnej ważności. Najbardziej popularnymi są addytywne,
multiplikatywne oraz min-agregacja. Ze względu na różnorodność rynków zmienia się
charakter agregacji jaki intuicyjnie akceptuje trader działający na tym rynku. Dlatego, że w
naszej sytuacji mamy dwie grupy kryteriów charakteryzujących moc sygnału BUY i moc
sygnału SELL powinniśmy wprowadzić dwie różne grupy agregatorów
BUY
DD
oraz
SELL
DD
,
które formalnie można przedstawić jako funkcje:
)
,
,
,
,
,
(
V
B
C
V
BBUY
CBUY
BUY
f
DD
α
α
α
µ
µ
µ
=
,
)
,
,
,
,
,
(
V
B
C
V
BSELL
CSELL
SELL
f
DD
α
α
α
µ
µ
µ
=
,
V
µ
0.5
1
0
min
dV
max
dV
46
gdzie
V
B
C
α
α
α
,
,
współczynniki względnej ważności (rangi) odpowiednich kryteriów
lokalnych. Współczynniki te są parametrami adaptacyjnymi modelu, lecz powinny być
dobrane tak by spełnić standardowy w zagadnieniach wielokryterialnych warunek
1
=
+
+
V
B
C
α
α
α
.
W trakcie badań wyodrębnione zostały cztery następujące sposoby agregacji, które co
najmniej gwarantowały dodatnie zyski:
V
V
BBUY
B
CBUY
C
BUY
DD
µ
α
µ
α
µ
α
⋅
+
⋅
+
⋅
=
1
,
V
V
BSELL
B
CSELL
C
SELL
DD
µ
α
µ
α
µ
α
⋅
+
⋅
+
⋅
=
1
,
V
B
C
V
BBUY
CBUY
BUY
DD
α
α
α
µ
µ
µ
⋅
⋅
=
2
,
V
B
C
V
BSELL
CSELL
SELL
DD
α
α
α
µ
µ
µ
⋅
⋅
=
2
,
)
,
,
min(
3
C
B
a
V
BBUY
CBUY
BUY
DD
α
α
α
µ
µ
µ
=
,
)
,
,
min(
3
C
B
a
V
BSELL
CSELL
SELL
DD
α
α
α
µ
µ
µ
=
,
V
V
V
BBUY
B
CBUY
C
BUY
DD
α
α
µ
µ
α
µ
α
⋅
⋅
+
⋅
=
−
1
4
)
(
,
V
V
V
BSELL
B
CSELL
C
SELL
DD
α
α
µ
µ
α
µ
α
⋅
⋅
+
⋅
=
−
1
4
)
(
.
Z powyższej definicji wynika, że wartości kryteriów agregowanych DD zawsze znajdują się
w przedziale [0,1]. Dalej wyliczamy moc sygnałów BUY i SELL jako wartość kryteriów DD.
Można używać wartości
BUY
DD
i
SELL
DD
jako sygnałów kupna i sprzedaży. Jednak według
naszych doświadczeń w praktyce takie podejście generuje zbyt dużo sygnałów
transakcyjnych, często nieistotnych, tzn. nie charakteryzujących długoterminowe trendy, co
zmniejsza efektywność całego systemu. Dlatego zastosowaliśmy dodatkowo wygładzenie
(uśrednienie) wygenerowanych sygnałów na pewnej ilości ostatnich barów (
DD
N
).
∑
=
=
n
i
BUY
DD
BUY
DD
N
DD
0
1
,
∑
=
=
n
i
SELL
DD
SELL
DD
N
DD
0
1
,
gdzie
DD
N
jest parametrem adaptacyjnym poszukiwanym w trakcie rozwiązania problemu
optymalizacyjnego. W rezultacie zamiast wartości
BUY
DD
,
SELL
DD
wyliczonej na
poszczególnym barze używaliśmy wygładzonej wartości
BUY
DD
,
SELL
DD
.
47
4.4 Strategia
Proponowany system mechaniczny oparty jest na strategii używającej opisanych powyżej
kryteriów agregowanych oraz innych sygnałów rynkowych opartych na standardowych
wskaźnikach.
Podstawowym sygnałem dla rozpoczęcia analizy jest, tak jak i dla poprzedniego systemu
przekroczenie szerokości wstęgi Bollingera dBol niektórych wartości krytycznych
k
dBol .
W razie spełnienia warunku dBol >
k
dBol następnym krokiem analizy jest wyznaczenie
słusznego sygnału kupna lub sprzedaży za pomocą wielokryterialnej oceny mocy sygnału.
Zamykanie pozycji w ramach proponowanego systemu dokonuje się po wyczerpaniu się
trendu. Sygnałem do tego jest przecięcie wygładzonych linii wskaźników wielokryterialnych
BUY
DD
,
SELL
DD
. Niezbędnym elementem każdego systemu transakcyjnego jest ograniczenie
ryzyka za pomocą zleceń STOP. Przy tym obowiązkowe jest wprowadzenie sygnałów STOP
BUY oraz STOP SELL dla redukcji strat w przypadku niewłaściwie zajętej pozycji. Zgodnie
z naszymi doświadczeniami
założyliśmy następujące procedury zleceń sygnałów stop:
Dla pozycji długiej (BUY):
)
30
(
1
pkt
C
stop
−
=
,
Dla pozycji krótkiej (SELL):
)
30
(
1
pkt
C
stop
+
=
.
Gdzie punkt jest krokiem notowań kontraktu terminowego FW20 na indeks WIG20.
4.5 Optymalizacja systemu transakcyjnego
Opisany powyżej system transakcyjny zawiera następujące parametry podlegające
optymalizacji:
• Period ( ilość uwzględnionych barów) wstęgi Bollingera
bol
N
.
• Krytyczna szerokość wstęgi Bollingera, przy której podejmujemy decyzje
inwestycyjne -
k
dBol
• Głębokości analizy
dC
N
oraz
dV
N
(ilości uwzględnionych barów)
• Stopień wygładzenia sygnału generowanego przez wskaźnik wielokryterialny -
DD
N
(ilości uwzględnionych w wygładzeniu sygnałów)
• Parametry względnej ważności kryteriów lokalnych
V
B
C
α
α
α
,
,
48
Jako kryterium optymalizacji używamy zysk D osiągnięty w okresie uczącym. W rezultacie
zagadnienie optymalizacji było sformułowane jako:
(
)
(
)
.
1
.
,
,
,
,
,
,
,
,
max
arg
,
,
,
,
,
,
,
=
+
+
=
V
B
C
V
B
C
DD
dV
dC
k
bol
opt
V
B
C
DD
dV
dC
k
bol
st
N
N
N
dBol
N
D
N
N
N
dBol
N
α
α
α
α
α
α
α
α
α
Optymalizacja systemu polegała na jak najlepszym doborze wartości omówionych
powyżej parametrów adaptacyjnych systemu dla okresu uczącego tj. okresie od 30.09.2005r.
do 01.01.2006r. Proces optymalizacji parametrów został opracowany w środowisku
WealthLab. Rozważany był horyzont czasowy 1 godzina..
4.6 Testowanie optymalizowanego systemu
Podczas badań sprawdzone zostały wszystkie wymienione powyżej metody agregacji.
Rezultaty najlepszej zostały następnie zweryfikowane w okresie testowym. W rezultacie
optymalizacji systemu na danych historycznych najszybciej wygasających serii kontraktów
terminowych na indeks WIG20 otrzymaliśmy następujące wyniki dla okresu uczącego (od
30.09.2005r. do 01.01.2006r.):
Agregacja addytywna
1
DD
( na Rys.13 przedstawiono krzywą dochodu):
Long + Short
Long Only
Short Only
Buy & Hold
Net Profit
499,00
251,00
248,00
188,00
Profit per Bar
1,78
1,42
2,38
0,38
Number of Trades
35
19
16
1
Winning %
42,86%
47,37%
37,50%
100,00%
Max Drawdown
-104,00
-88,00
-87,00
-314,00
Profit Factor
2,89
2,60
3,32
INF
Recovery Factor
4,80
2,85
2,85
0,60
Payoff Ratio
3,68
2,64
5,51
INF
49
Rys 13. Krzywa dochodu dla agregacji addytywnej
1
DD
dla okresu
uczącego (30.09.2005-01.01.2006r.)
Agregacja multiplikatywna
2
DD
( na Rys. 14 przedstawiono krzywą dochodu):
Long + Short
Long Only
Short Only
Buy & Hold
Net Profit
468,00
235,00
233,00
188,00
Profit per Bar
1,81
1,48
2,33
0,38
Number of Trades
39
21
18
1
Winning %
43,59%
52,38%
33,33%
100,00%
Max Drawdown
-114,00
-82,00
-115,00
-314,00
Profit Factor
2,60
2,52
2,69
INF
Recovery Factor
4,11
2,87
2,03
0,60
Payoff Ratio
3,21
2,30
4,92
INF
Rys 14. Krzywa dochodu dla agregacji multiplikatywnej
2
DD
dla okresu
uczącego (30.09.2005-01.01.2006r.)
Min-agregacja
3
DD ( na Rys.15 przedstawiono krzywą dochodu):
Long + Short
Long Only
Short Only
Buy & Hold
Net Profit
553,00
285,00
268,00
188,00
Profit per Bar
1,94 $
1,56
2,63
0,38
Number of Trades
35
19
16
1
Winning %
57,14%
57,89%
56,25%
100,00%
50
Max Drawdown
-98,00
-81,00
-90,00
-314,00
Profit Factor
3,09
2,72
3,73
INF
Recovery Factor
5,64
3,52
2,98
0,60
Payoff Ratio
2,35
2,02
2,94
INF
Rys 15. Krzywa dochodu dla agregacji multiplikatywnej
3
DD
dla okresu
uczącego (30.09.2005-01.01.2006r.)
Agregacja typu mieszanego
4
DD
( na Rys.16 przedstawiono krzywą dochodu):
Long + Short
Long Only
Short Only
Buy & Hold
Net Profit
615,00
311,00
304,00
188,00
Profit per Bar
2,33
1,84
3,20 $
0,38 $
Number of Trades
33
20
13
1
Winning %
63,64%
55,00%
76,92%
100,00%
Max Drawdown
-111,00
-111,00
-63,00
-314,00
Profit Factor
4,19
3,06
8,24
INF
Recovery Factor
5,54
2,80
4,83
0,60
Payoff Ratio
2,36
2,49
2,44
INF
Rys 16. Krzywa dochodu dla agregacji multiplikatywnej
4
DD
dla okresu
uczącego (30.09.2005-01.01.2006r.)
51
Hadel odbywał się za pomocą 1 kontraktu bez reinwestowania z uwzględnieniem kosztów
transakcyjnych na poziomie 9 zł za transakcję. Najbardziej korzystna okazała się agregacja
typu mieszanego. Bardzo dobry jest współczynnik winning, którego wartość to 63,64%.
System z tym rodzajem agregacji zarobił także najwięcej pieniędzy. 615 punktów to
ekwiwalent 6150 zł przy wartości depozytu za kontrakt około 2000zł. Zysk w okresie
uczącym wyniósł więc ponad 200%. Jak widać rezultaty pracy systemu ściśle zależą od
rodzaju wybranej agregacji.
Jako okres testowy ustaliliśmy dane od 01.01.2006r. do 13.03.2006r. Rezultaty handlu w
okresie testowym przedstawiono poniżej:
Long + Short
Long Only
Short Only
Buy & Hold
Net Profit
246,00
150,00
96,00
115,00
Profit per Bar
1,05
1,36
0,77
0,28
Number of Trades
29
13
16
1
Winning %
55,17%
61,54%
50,00%
100,00%
Max Drawdown
-170,00
-127,00
-145,00
-268,00
Profit Factor
1,77
2,85
1,40
INF
Recovery Factor
1,45
1,18
0,66
0,43
Payoff Ratio
1,20
1,10
1,36
INF
Wyniki za cały okres pracy systemu czyli od 30.09.2005r. do 13.03.2006r przedstawiono
poniżej:
Long + Short
Long Only
Short Only
Buy & Hold
Net Profit
972,00
598,00
374,00
293,00
Profit per Bar
1,91
2,12
1,65
0,33
Number of Trades
61
30
31
1
Winning %
63,93%
66,67%
61,29%
100,00%
Max Drawdown
-217,00
-161,00
-145,00
-314,00
Profit Factor
3,01
3,69
2,43
INF
Recovery Factor
4,48
3,71
2,58
0,93
Payoff Ratio
1,59
1,71
1,43
INF
Krzywa wzrostu kapitału całego okresu (uczący+testowy) przestawiona jest na Rys. 16.
52
Rys. 17 Krzywa kapitału dla systemu dla danych od 30.09.2005r. do dnia 13.03.2006r.
4.7 Podsumowanie
W podsumowaniu chciałbym przedstawić porównanie pracy sytemu jaki został opracowany
powyżej z systemem z rozdziału III. Systemy porównywane będą w całym okresie, w którym
pracowały. Dane przedstawione są bez reinwestowania zarobionego kapitału. Handel odbywał
się za pomocą 1 kontraktu na indeks WIG20 najszybciej wygasającej serii FW20. Koszty
transakcji ustalono na poziomie 9 zł za jedną transakcję. Założono, że koszt depozytu na
kontrakt tej serii wyniósł około 2000zł.
System oparty na logice rozmytej:
Zysk z całego okresu działalności systemu (okres uczący i testowy) – 4790 zł
Kapitał wyjściowy 6790zł w okresie 6 miesięcy.
Sumaryczny zysk wynosi około 240%.
System całkowicie wielokryterialny:
Zysk z całego okresu działalności systemu (okres uczący i testowy) – 9720 zł
Kapitał wyjściowy 11720zł w okresie 6 miesięcy.
Sumaryczny zysk wynosi około 490%
Jak widać system całkowicie wielokryterialny przyniósł ponad dwukrotnie większy dochód
od systemu opartego na logice rozmytej. Przedstawiony system wykazał się znacznie większą
53
efektywnością od systemu przedstawionego w rozdziale III. Elastyczność kryteriów lokalnych
połączona z odpowiednim sposobem ich agregacji dały doskonały efekt synergii. Dodatkową
zaletą jest możliwość optymalizacji każdego z parametrów systemu (system z rozdziału III
był pozbawiony tej możliwości ze względu na zastosowanie w nim reguł logiki rozmytej).
Zakończenie
Przedstawione powyżej systemy oparte na logice rozmytej oraz na wielokryterialnym
agregowaniu kryteriów lokalnych stanowić mogą doskonałą bazę do budowy w pełni
zautomatyzowanych systemów do gry na rynkach finansowych. W powyższej pracy zostały
opisane dwa systemy. Należą one do tak zwanej rodziny trend-following, czyli ich zadaniem
jest gra na rynkach, które aktualnie znajdują się w trendzie, oraz unikanie dotkliwych strat
kiedy rynki wchodzą w obszar konsolidacji. Oba systemy wykazały się z powierzonych im
zadań nie doprowadzając do bankructwa. Lepszy okazał się system oparty na syntezie
wielokryterialnej. Ze względu na specyfikę polskiego rynku kapitałowego niemożliwe jest
natychmiastowe wdrożenie w pełni automatycznego handlu (brak API) na Giełdzie Papierów
Wartościowych w Warszawie, możliwa jest jedynie funkcja doradcza systemu. Jednak
przykład takich rynków jak FOREX czy NASDAQ oraz RTS pokazuje, że pojawienie się
odpowiedniego zaplecza informatycznego jest jedynie kwestią czasu i dojrzałości rynku. W
przyszłości wskazane jest również stworzenie odpowiedniego portfolio zarówno rynków jak i
systemów tak aby maksymalnie wygładzić krzywą dochodu.
54
Literatura
[1] http://www.futures.pl/?did=69
[2] http://www.bm.bph.pl/index.php?p=news&kid=16&pkid=103
[3] http://bossa.pl/edukacja/kontrakty/na_indeksy.html
[4] http://bossa.pl/edukacja/kontrakty/na_indeksy.html
[5] http://www.gpw.com.pl/gpw.asp?cel=edukacja&k=83&i=/papiery_wart/kontrakty_indeksy
[6] http://www.kdpw.pl/irip/pliki/informacja.pdf
[7] http://www.kdpw.pl/irip/pliki/km.xls
[8] http://bossa.pl/edukacja/kontrakty/
[9] http://www.statica.pl
[10] http://www.statica.pl/index-2.html
[11] http://www.esignal.com/esignal/features/featureslist/futures_data.asp#other
[12] http://www.statica.pl/notow2.html
[13] http://www.gpw.com.pl/gpw.asp?cel=ogieldzie&k=9&i=/warset/warset
[14] http://www.wealth-lab.com/
[15] Instrukcja wprowadzająca do systemu WealthLab 3.0 (help zawarty w programie)
[16] http://www.wealth-lab.com/cgi-bin/WealthLab.DLL/getpage?page=WLD3.htm
[17]
P. Sevastianov, B. Wietrak, Wielokryterialna optymalizacja systemu traderskiego na rynku kontraktów
terminowych, Informatyka teoretyczna i stosowana/Computer Science, Politechnika Częstochowska, Rocznik 5,
(8), 2005, str. 215-226.
[18] L.A. Zadeh, Fuzzy Sets, Information and Control 8 (1965) 338 – 353
[19] Moore, R.E., (1966). Interval analysis, Englewood Cliffs. N.J., Prentice-Hall.
[20] Moore, R.E., (1966). Interval analysis, Englewood Cliffs. N.J., Prentice-Hall.
[21] Sevastianov P., Rog. P. A probabilistic approach to fuzzy and interval ordering. Task Quarterly. Special
Issue Artificial and Computational Intelligence 2002; 7: 147-156.
[22] S.B. Achelis, Technical Analysis from A to Z: Covers Every Trading Tool-From the Absolute Breadth
Index to the Zig Zag, Probus Publisher, Chicago, 1995.
[23] P. Figat, P. Sewastianow, B. Wietrak, “Metody logiki rozmytej oraz wielokryterialnego podejmowania
decyzji w systemach traderskich na rynku kontraktów terminowych”, materiały na konferencję Rynek
Kapitałowy Skuteczne Inwestowanie, Kołobrzeg 05-07 kwietnia 2006r.
[24] Moore, R.E., (1966). Interval analysis, Englewood Cliffs. N.J., Prentice-Hall.
[25]
Sevastianov P., Rog. P. A probabilistic approach to fuzzy and interval ordering. Task Quarterly. Special Issue Artificial
and Computational Intelligence 2002; 7: 147-156.
55
Spis tabel
Tab. 1: Wartości depozytów wstępnych i właściwych dla kontraktów terminowych…14-15
Spis rysunków
Rys.1. Przykład działania programu Notowania2 firmy Statica (tabele z notowaniami) 23
Rys.2. Przykład działania programu Notowania2 firmy Statica (wykres tickowy kontraktu FW20M6) 23
Rys.3. Droga danych giełdowych z Giełdy do klienta (opracowanie własne) 24
Rys.4. Okno główne programu WealthLab3.0 z otwartymi edytorami systemów 25
Rys.5. Funkcja przynależności dla “dCs is Bigc” itd.28
Rys.6. Funkcji przynależności stopnia nierówności przedziału. 30
Rys.7. Funkcja użyteczności kryterium lokalnego opartego na różnicy wolumenów. 31
Rys.8. Przykładowy przebieg notowań z wykorzystaniem systemu 39
Rys.9. Zmiana kapitału w czasie od 30.09.2005r do 12.03.2006r 40
Rys.10. Funkcje kryterialne
CBUY
µ
,
CSELL
µ
. 43
Rys.11. Funkcje kryterialne
BBUY
µ
,
BSELL
µ
. 44
Rys.12. Funkcja kryterialna
V
µ
. 45
Rys 13. Krzywa dochodu dla agregacji addytywnej dla okresu uczącego (30.09.2005-01.01.2006r.) 49
Rys 14. Krzywa dochodu dla agregacji multiplikatywnej dla okresu uczącego (30.09.2005-01.01.2006r.) 49
Rys 15. Krzywa dochodu dla agregacji multiplikatywnej dla okresu uczącego (30.09.2005-01.01.2006r.) 50
Rys 16. Krzywa dochodu dla agregacji multiplikatywnej dla okresu uczącego (30.09.2005-01.01.2006r.) 50
Rys.17 Krzywa kapitału dla systemu dla danych od 30.09.2005r. do dnia 13.03.2006r. 52
56
Kod źródłowy systemu z Rozdziału III
{#OptVar1 18;5;20;1}
{#OptVar2 9;1;9;1}
{#OptVar3 7;1;9;1}
{#OptVar4 5;1;9;1}
{#OptVar5 28;20;30;1}
{#OptVar6 127;100;150;5}
{#OptVar7 15;14;15;2}
{#OptVar8 10;1;10;1}
{#OptVar9 3;1;10;1}
{#OptVar10 8;1;10;1}
var Bar: integer;
var BBUp,BBDown,BBDiff, BBPeriod: integer; //wstega bollingera
var BBPane: integer; // panele z wykresami
var BBLimit: float; // wartosc graniczna roznicy wstegi bb
BBperiod := 6; // okres wstegi bollingera
BBLimit := 0;
// rysowanie wstegi bollingera
PlotSeries( BBandLowerSeries( #Close, BBPeriod, 2 ), 0, 205, #Thick );
PlotSeries( BBandUpperSeries( #Close, BBPeriod, 2 ), 0, 205, #Thick );
//obliczanie wskaznika - roznicy gornej i dolnej wstegi bollingera
BBUp := BBandUpperSeries( #Close, BBPeriod, 2 );
BBDown := BBandLowerSeries( #Close, BBPeriod, 2 );
BBDiff := SubtractSeries(BBUp,BBDown);
BBPane := CreatePane( 30, true, true ); // wyswietalnie na panelu
PlotSeries( BBDiff, BBPane, 012, #Thick );
DrawHorzLine( BBLimit, BBPane, #Green, #Thin );
DrawHorzLine( 51, BBPane, #Green, #Dotted );
// srednie ruchome szybka i wolna
var hSlow, hFast, SlowPer, FastPer: integer;
SlowPer := 6; // okres sredniej ruchomej
FastPer := 3;
hSlow := SMASeries( #Close, SlowPer );
hFast := SMASeries( #Close, FastPer );
PlotSeries( hSlow, 0, 000, #Thick );
PlotSeries( hFast, 0, 502, #Thick );
var hVSlow: integer; //Kuzniecow
hVSlow := SMASeries(#Close, 24 );
PlotSeries( hVSlow,0,009,#Dotted);
type fuzzy = RECORD
value: float;
name: float;
END;
function mi( Y: float; a: float; b: float; c: float): fuzzy;
var
miLow, miMid, miBig: float;
wynik: fuzzy;
57
begin
miLow := 0.0;
miMid := 0.0;
miBig := 0.0;
if ( Y < a ) then miLow := 1.0;
if (a < Y) and (Y < b) then begin
miLow := (b - Y) / (b - a);
miMid := (Y - a) / (b - a);
end;
if ( b < Y ) and ( Y < c ) then begin
miMid := (c - Y) / (c - b);
miBig := (Y - b) / (c - b);
end;
if ( Y > c ) then miBig := 1.0;
if ( miLow > miMid ) then begin
wynik.value := miLow;
wynik.name := 1;
end
else if ( miBig > miMid ) then begin
wynik.value := miBig;
wynik.name := 3;
end
else begin
wynik.value := miMid;
wynik.name := 2;
end;
Result := wynik;
end;
function miBB( a: float; b: float; c:float; value: float ): float;
var
wynik: float;
begin
if ( value < c ) then begin
if ( value <= a ) then begin
wynik := 0;
end
else begin
wynik := abs((abs(a)-abs(value)))/(2*abs(a)); // nie trzeba modulu bo
- * - = + :-)
end;
end;
if ( value > c ) then begin
if ( value >= b ) then begin
wynik := 1;
end
else begin
wynik := (b+value)/(2*b);
end;
end;
58
if value = c then wynik := 0.5;
Result := wynik;
end;
function miUp( a: float; b: float; value: float ): float;
var
wynik: float;
begin
if ( value < 0 ) then begin
if ( value <= a ) then begin
wynik := 0;
end
else begin
wynik := abs((abs(a)-abs(value)))/(2*abs(a)); // nie trzeba modulu bo
- * - = + :-)
end;
end;
if ( value > 0 ) then begin
if ( value >= b ) then begin
wynik := 1;
end
else begin
wynik := (b+value)/(2*b);
end;
end;
if value = 0 then wynik := 0.5;
Result := wynik;
end;
{ obliczanie roznicy przedzialowej barow dBar
oraz roznicy cen zamkniecia dC }
var C0,C1,l0,l1,h0,h1,e,a,b,V1,V0: float;
var N,K,dBar,barL,dC,dCAbs,bbMi,dcMiV,barMiV,dcMiN,barMiN,volMi,dVol:
integer;
dBar := CreateSeries; // znormalizowane roznice barow
dC := CreateSeries; // roznice cen zamkniecia
barL := CreateSeries;// wskaznik barowy :-)
dCAbs := CreateSeries; // wartosc absolutna roznicy cen zamkniecia
dVol := CreateSeries; // volumen
for N:=1 to BarCount -1 do
begin
l0 := GetSeriesValue(N,#Low);
l1 := GetSeriesValue(N-1,#Low);
h0 := GetSeriesValue(N,#High);;
h1 := GetSeriesValue(N-1,#High);
C1 := GetSeriesValue(N-1,#Close);
C0 := GetSeriesValue(N,#Close);
V1 := GetSeriesValue(N-1,#Volume);
V0 := GetSeriesValue(N,#Volume);
59
e := 0.0;
a := ( l0 - h1 );
b := ( h0 - l1 );
if (a+b) > 0 then begin
e := 1 + a/b;
end
else begin
if a=0 then begin e:=1; end
else
e := 1 + b/a;
end;
//SetSeriesValue( N, barL, (a+b)*GetSeriesValue(N,#Volume) );
SetSeriesValue( N, barL, (a+b) );
SetSeriesValue( N, dBar, e );
SetSeriesValue( N, dC, C0-C1 );
SetSeriesValue( N, dCAbs, abs(C0-C1) );
end;
// towrzymy wskaznik wielokryterialny
dcMiV:= CreateSeries; // wartosci dC po zastosowaniu f. mi
dcMiN:= CreateSeries; // dc big? mid? low?
barMiN:= CreateSeries;// --- ' ' -----
barMiV:= CreateSeries;
volMi := CreateSeries;// rozmyta wartosc volumenow
bbMi := CreateSeries;
var t: fuzzy; // zmienna tymczasowa do przechowywania wartosci rozmytej
var n_,v_: float; // zmienne do przepisywania warosci z mi
var dCMed,dCMedPeriod: integer; // mediana z wartosci dc
var maxdC, mindC, minVol, maxVol,avgVol, ParDC,MiVol: float;
var volPeriod: integer; // rozmywanie wartosci volumenow
dCMedPeriod := #OptVar1;
ParDC := 1.50;
volPeriod := dCMedPeriod;
maxdC := 0;
mindC := 1000000000;
maxVol:= 0;
minVol:= 1000000000;
dCMed := MedianSeries( dCAbs, dCMedPeriod );
volMi := CreateSeries;
for Bar := 30 to BarCount - 1 do
begin
t := mi(GetSeriesValue(Bar,dBar),0,0.5,1);
n_ := t.name;
v_ := t.value;
SetSeriesValue (Bar, barMiN, n_ );
SetSeriesValue (Bar, barMiV, v_ );
//-------------------- dc
for N:=0 to dCMedPeriod do begin
60
if ( GetSeriesValue(Bar-N, dC) > maxdC ) then maxdC :=
GetSeriesValue(Bar-N, dC);
if ( GetSeriesValue(Bar-N, dC) < mindC ) then mindC :=
GetSeriesValue(Bar-N, dC);
if ( abs( @dVol[Bar-N] ) > maxVol ) then maxVol := abs( @dVol[Bar-N]
);
if ( abs( @dVol[Bar-N] ) < minVol ) then minVol := abs( @dVol[Bar-N]
);
end;
t := mi( abs(GetSeriesValue(Bar,dC)) , 0, @dCMed[Bar], maxdC * ParDC
);
n_ := t.name;
v_ := t.value;
SetSeriesValue (Bar, dCMiN, n_ );
SetSeriesValue (Bar, dCMiV, v_ );
SetSeriesValue(Bar,volMi, miUp(minVol,maxVol,@dVol[Bar]) );
end;
var buy, sell, hold: integer;
var alfaA, alfaB,alfaC: float;
alfaA := #OptVar2/10;
alfaB := #OptVar3/10;
function Maximum(a: float; b:float; c:float; d:float): float;
begin
Result :=(power(( a*alfaA + b*(1-alfaA)),alfaB)*power(c,(1-alfaB)));
end;
buy := CreateSeries;
sell := CreateSeries;
hold := CreateSeries;
var max_: float;
for Bar := 1 to BarCount - 1 do
begin
max_ := Maximum ( @dcMiV[Bar], @barMiV[Bar], @volMi[Bar],@bbMi[Bar] );
if ( @dC[Bar] > 0 ) then begin
if ( @dCMiN[Bar] = 3 ) then begin
if ( @barL[Bar] > 0 ) then begin
if ( @barMiN[Bar] = 3 ) then SetSeriesValue(Bar, buy, max_ );
if ( @barMiN[Bar] = 2 ) then SetSeriesValue(Bar, buy, max_ );
if ( @barMiN[Bar] = 1 ) then SetSeriesValue(Bar, hold, max_ );
end
else begin
if ( @barMiN[Bar] = 3 ) then SetSeriesValue(Bar, hold, max_ );
if ( @barMiN[Bar] = 2 ) then SetSeriesValue(Bar, hold, max_ );
if ( @barMiN[Bar] = 1 ) then SetSeriesValue(Bar, buy, max_ );
end;
end;
61
if ( @dCMiN[Bar] = 2 ) then begin
if ( @barL[Bar] > 0 ) then begin
if ( @barMiN[Bar] = 3 ) then SetSeriesValue(Bar, buy, max_ );
if ( @barMiN[Bar] = 2 ) then SetSeriesValue(Bar, buy, max_ );
if ( @barMiN[Bar] = 1 ) then SetSeriesValue(Bar, hold, max_ );
end
else begin
if ( @barMiN[Bar] = 3 ) then SetSeriesValue(Bar, buy, max_ );
if ( @barMiN[Bar] = 2 ) then SetSeriesValue(Bar, hold, max_ );
if ( @barMiN[Bar] = 1 ) then SetSeriesValue(Bar, hold, max_ );
end;
end;
if ( @dCMiN[Bar] = 1 ) then begin
if ( @barL[Bar] > 0 ) then begin
if ( @barMiN[Bar] = 3 ) then SetSeriesValue(Bar, buy, max_ );
if ( @barMiN[Bar] = 2 ) then SetSeriesValue(Bar, hold, max_ );
if ( @barMiN[Bar] = 1 ) then SetSeriesValue(Bar, hold, max_ );
end
else begin
if ( @barMiN[Bar] = 3 ) then SetSeriesValue(Bar, sell, max_ );
if ( @barMiN[Bar] = 2 ) then SetSeriesValue(Bar, hold, max_ );
if ( @barMiN[Bar] = 1 ) then SetSeriesValue(Bar, hold, max_ );
end;
end;
end
else begin
if ( @dCMiN[Bar] = 3 ) then begin
if ( @barL[Bar] > 0 ) then begin
if ( @barMiN[Bar] = 3 ) then SetSeriesValue(Bar, hold, max_ );
if ( @barMiN[Bar] = 2 ) then SetSeriesValue(Bar, hold, max_ );
if ( @barMiN[Bar] = 1 ) then SetSeriesValue(Bar, sell, max_ );
end
else begin
if ( @barMiN[Bar] = 3 ) then SetSeriesValue(Bar, sell, max_ );
if ( @barMiN[Bar] = 2 ) then SetSeriesValue(Bar, sell, max_ );
if ( @barMiN[Bar] = 1 ) then SetSeriesValue(Bar, hold, max_ );
end;
end;
if ( @dCMiN[Bar] = 2 ) then begin
if ( @barL[Bar] > 0 ) then begin
if ( @barMiN[Bar] = 3 ) then SetSeriesValue(Bar, hold, max_ );
if ( @barMiN[Bar] = 2 ) then SetSeriesValue(Bar, hold, max_ );
if ( @barMiN[Bar] = 1 ) then SetSeriesValue(Bar, sell, max_ );
end
else begin
if ( @barMiN[Bar] = 3 ) then SetSeriesValue(Bar, sell, max_ );
if ( @barMiN[Bar] = 2 ) then SetSeriesValue(Bar, sell, max_ );
if ( @barMiN[Bar] = 1 ) then SetSeriesValue(Bar, hold, max_ );
end;
end;
if ( @dCMiN[Bar] = 1 ) then begin
if ( @barL[Bar] > 0 ) then begin
if ( @barMiN[Bar] = 3 ) then SetSeriesValue(Bar, hold, max_ );
if ( @barMiN[Bar] = 2 ) then SetSeriesValue(Bar, sell, max_ );
if ( @barMiN[Bar] = 1 ) then SetSeriesValue(Bar, sell, max_ );
end
else begin
if ( @barMiN[Bar] = 3 ) then SetSeriesValue(Bar, sell, max_ );
if ( @barMiN[Bar] = 2 ) then SetSeriesValue(Bar, sell, max_ );
if ( @barMiN[Bar] = 1 ) then SetSeriesValue(Bar, hold, max_ );
end;
62
end;
end;
end;
//rozmywanie wartosci buy, sell, hold
var BSHPeriod, b2,s2,h2: integer;
var sumB,sumH,sumS: float;
BSHPeriod := #OptVar4;
b2 := CreateSeries;
s2 := CreateSeries;
h2 := CreateSeries;
for Bar:=30 to BarCount - 1 do begin
sumB := 0.0;
sumS := 0.0;
sumH := 0.0;
for N:=0 to BSHPeriod do begin
sumB := sumB + @buy[Bar-N];
sumS := sumS + @sell[Bar-N];
sumH := sumH + @hold[Bar-N];
end;
///SetSeriesValue (Bar, b2, sumB /( sumB+sumS+sumH ) );
//SetSeriesValue (Bar, s2, sumS /( sumB+sumS+sumH ) );
//SetSeriesValue (Bar, h2, sumH /( sumB+sumS+sumH ) );
SetSeriesValue (Bar, b2, sumB /BSHPeriod );
SetSeriesValue (Bar, s2, sumS /BSHPeriod );
SetSeriesValue (Bar, h2, sumH /BSHPeriod );
end;
var testPane: integer;
testPane := CreatePane( 30, true, true ); // wyswietalnie na panelu
PlotSeries( b2, testPane, 019, #Thick );
PlotSeries( s2, testPane, 910, #Thick );
PlotSeries( h2, testPane, 555, #Thick );
var BBSmoth: integer;
BBSmoth := SMASeries(BBDiff,31);
PlotSeries( BBSmoth, BBPane, 912, #Thick );
var xStop: float;
for Bar := SlowPer to BarCount - 1 do
begin
//xStop := @hSlow[Bar];
case MarketPosition of
0:
begin
if ( @BBDiff[ Bar ] >= @BBSmoth[Bar]) then begin // poziom roznicy
wstegi bb
63
if ((@b2[Bar] > @s2[Bar]) and (@b2[Bar]>@h2[Bar]) and (@b2[Bar] >
@b2[Bar-1])) then begin
xStop := GetSeriesValue(Bar,#Close)-30;
BuyAtClose( Bar , '');
end;
if ((@s2[Bar] > @b2[Bar]) and (@s2[Bar]>@h2[Bar])and (@s2[Bar] >
@s2[Bar-1])) then begin
xStop := GetSeriesValue(Bar,#Close)+30;
ShortAtClose( Bar , '');
end;
end;
end;
1:
begin
if (@s2[Bar]>@b2[Bar]) then SellAtClose( Bar , LastPosition, '' );
if (@h2[Bar]>@b2[Bar]) then SellAtClose( Bar , LastPosition, '' );
SellAtStop( Bar+1, xStop, LastPosition, 'Stop Loss' );
end;
-1:
begin
if (@b2[Bar]>@s2[Bar]) then SellAtClose( Bar , LastPosition, '' );
if (@h2[Bar]>@s2[Bar]) then SellAtClose( Bar , LastPosition, '' );
CoverAtStop( Bar+1, xStop, LastPosition, 'Stop Loss' );
end;
end;
end;
64
Kod źródłowy systemu z Rozdziału IV
{#OptVar1 10;3;20;3}
{#OptVar2 8;1;9;1}
{#OptVar3 7;1;9;1}
{#OptVar4 7;3;10;1}
{#OptVar5 8;0;10;1}
var Bar: integer;
var BBUp,BBDown,BBDiff,BBUp2,BBDown2,BBDiff2, BBPeriod,BBPeriod2: integer;
//wstega bollingera
var BBPane: integer; // panele z wykresami
var BBLimit: float; // wartosc graniczna roznicy wstegi bb
BBperiod := 6; // okres wstegi bollingera
BBPeriod2:= 11;
BBLimit := 10;
// rysowanie wstegi bollingera
PlotSeries( BBandLowerSeries( #Close, BBPeriod, 2 ), 0, 205, #Thick );
PlotSeries( BBandUpperSeries( #Close, BBPeriod, 2 ), 0, 205, #Thick );
PlotSeries( BBandLowerSeries( #Close, BBPeriod2, 2 ), 0, 900, #Thick );
PlotSeries( BBandUpperSeries( #Close, BBPeriod2, 2 ), 0, 900, #Thick );
//obliczanie wskaznika - roznicy gornej i dolnej wstegi bollingera
BBUp := BBandUpperSeries( #Close, BBPeriod, 2 );
BBDown := BBandLowerSeries( #Close, BBPeriod, 2 );
BBUp2 := BBandUpperSeries( #Close, BBPeriod2, 2 );
BBDown2 := BBandLowerSeries( #Close, BBPeriod2, 2 );
BBDiff := SubtractSeries(BBUp,BBDown);
BBDiff2 := SubtractSeries(BBUp2,BBDown2);
BBPane := CreatePane( 30, true, true ); // wyswietalnie na panelu
PlotSeries( BBDiff, BBPane, 012, #Thick );
DrawHorzLine( BBLimit, BBPane, #Green, #Thin );
DrawHorzLine( 51, BBPane, #Green, #Dotted );
DrawHorzLine( 32, BBPane, #Red, #Dotted );
// srednie ruchome szybka i wolna
var hSlow, hFast, SlowPer, FastPer: integer;
SlowPer := 3; // okres sredniej ruchomej
FastPer := 8;
hSlow := SMASeries( #Close, SlowPer );
hFast := SMASeries( #Close, FastPer );
PlotSeries( hSlow, 0, 000, #Thick );
PlotSeries( hFast, 0, 502, #Thick );
var hVSlow: integer; //Kuzniecow
hVSlow := SMASeries(#Close, 30 );
PlotSeries( hVSlow,0,009,#Dotted);
65
function miBar( value: float ): float;
var wynik: float;
begin
if ( value <= 0 ) then wynik := 0;
if ( value >= 1 ) then wynik := 1;
if (value > 0) and (value < 1) then wynik := value;
Result := wynik;
end;
function miBB2( a: float; b: float; value: float ): float;
var wynik: float;
begin
if ( value <= a ) then wynik := 0;
if ( value >= b ) then wynik := 1;
if (value > a) and (value < b) then wynik := (value - a)/(b-a);
Result := wynik;
end;
{ mi kiedy dc lub dv jest dobre }
function miUp( a: float; b: float; value: float ): float;
var
wynik: float;
begin
if ( value < 0 ) then begin
if ( value <= a ) then begin
wynik := 0;
end
else begin
wynik := abs((abs(a)-abs(value)))/(2*abs(a)); // nie trzeba modulu bo
- * - = + :-)
end;
end;
if ( value > 0 ) then begin
if ( value >= b ) then begin
wynik := 1;
end
else begin
wynik := (b+value)/(2*b);
end;
end;
if value = 0 then wynik := 0.5;
Result := wynik;
end;
function miBB( a: float; b: float; c:float; value: float ): float;
var
wynik: float;
begin
if ( value < c ) then begin
66
if ( value <= a ) then begin
wynik := 0;
end
else begin
wynik := abs((abs(a)-abs(value)))/(2*abs(a)); // nie trzeba modulu bo
- * - = + :-)
end;
end;
if ( value > c ) then begin
if ( value >= b ) then begin
wynik := 1;
end
else begin
wynik := (b+value)/(2*b);
end;
end;
if value = c then wynik := 0.5;
Result := wynik;
end;
{ funkcja przeciwna do miUp
function miDown( a: float; b: float; value: float ): float;
var
wynik: float;
begin
wynik := 1 - miUp(a,b,value);
Result := wynik;
end; }
{ mi kiedy dc lub dv jest dobre }
function miDown( a: float; b: float; value: float ): float;
var
wynik: float;
begin
if ( value < 0 ) then begin
if ( value <= a ) then begin
wynik := 1;
end
else begin
wynik := abs((abs(value)+abs(a)))/(2*abs(a)); // nie trzeba modulu bo
- * - = + :-)
end;
end;
if ( value > 0 ) then begin
if ( value >= b ) then begin
wynik := 0;
end
else begin
wynik := abs((abs(b)-abs(value)))/(2*abs(b));
end;
67
end;
if value = 0 then wynik := 0.5;
Result := wynik;
end;
//----------------------------
{ przygotowanie dC e i dV }
var C0,C1,l0,l1,h0,h1,e,a,b,V1,V0: float;
var N,K,dBar,barL,dC,dCAbs,dcMiV,barMiV,dcMiN,barMiN,volMi,dVol: integer;
dBar := CreateSeries; // znormalizowane roznice barow
dC := CreateSeries; // roznice cen zamkniecia
dVol := CreateSeries; // volumen
for N:=1 to BarCount -1 do
begin
l0 := GetSeriesValue(N,#Low);
l1 := GetSeriesValue(N-1,#Low);
h0 := GetSeriesValue(N,#High);;
h1 := GetSeriesValue(N-1,#High);
C1 := GetSeriesValue(N-1,#Close);
C0 := GetSeriesValue(N,#Close);
V1 := GetSeriesValue(N-1,#Volume);
V0 := GetSeriesValue(N,#Volume);
e := 0.0;
a := ( l0 - h1 );
b := ( h0 - l1 );
if (a+b) > 0 then begin
e := 1 + a/b;
end
else begin
if a=0 then begin e:=1; end
else
e := 1 + b/a;
end;
SetSeriesValue( N, dBar, e );
SetSeriesValue( N, dC, C0-C1 );
SetSeriesValue( N, dVol, V0-V1 );
end;
// z - glebokosc analizy
var Z: integer;
Z := #OptVar1;
var buy, sell,b2,s2,BSHPeriod: integer;
var alfaA, alfaB,alfaC,alfaD,alfaE,alfaF,sumB,sumS: float;
alfaA := #OptVar2/10;
alfaB := 1 - alfaA;
alfaC := #OptVar3/10;
alfaD := 1 - alfaC;
alfaE := #OptVar4/10;
alfaF := 1 - alfaE;
68
buy := CreateSeries;
sell := CreateSeries;
var miDB,miuBB,miDC_B,miDC_S,miDV,minDV,minDC,maxDV,maxDC,buySig,sellSig:
float;
for N:=20 to BarCount -1 do
begin
minDV := 10000000;
minDC := 10000000;
maxDC := -10000000;
maxDV := -10000000;
for K:=1 to Z do begin
minDC := Min( minDC, @dC[N-K] );
minDV := Min( minDV, @dVol[N-K] );
maxDC := Max( maxDC, @dC[N-k] );
maxDV := Max( maxDV, @dVol[N-K] );
end;
miDB := miBar( @dBar[N] );
miDC_B := miUp( minDC,maxDC,@dC[N] );
miDC_S := miDown( minDC,maxDC,@dC[N] );
miDV := miUp( minDV,maxDV,@dVol[N] );
buySig := power ((alfaA*miDC_B + alfaB*miDB ),alfaC
)*power(miDV,alfaD);
sellSig := power((alfaA*miDC_S + alfaB*miDB ),alfaC
)*power(miDV,alfaD);
//buySig := alfaA*miDC_B + alfaB*miDB;
//sellSig:= alfaA*miDC_S + alfaB*miDB;
SetSeriesValue(N,buy,buySig);
SetSeriesValue(N,sell,sellSig);
end;
b2 := CreateSeries;
s2 := CreateSeries;
BSHPeriod := #OptVar4;
for Bar:=20 to BarCount - 1 do begin
sumB := 0.0;
sumS := 0.0;
for N:=0 to BSHPeriod do begin
sumB := sumB + @buy[Bar-N];
sumS := sumS + @sell[Bar-N];
end;
SetSeriesValue (Bar, b2, sumB /BSHPeriod );
SetSeriesValue (Bar, s2, sumS /BSHPeriod );
end;
var testPane: integer;
testPane := CreatePane( 30, true, true ); // wyswietalnie na panelu
PlotSeries( b2, testPane, 019, #Thick );
69
PlotSeries( s2, testPane, 910, #Thick );
DrawHorzLine( 0.9, testPane, #Green, #Dotted );
DrawHorzLine( 0.5, testPane, #Green, #Dotted );
var xStop,limit: float;
var p, PerATR,atrValue : integer;
var VarATR, ATRFactor, StopPr, BBDiffStop: float;
var BBSmoth: integer;
BBSmoth := SMASeries(BBDiff,40);
PlotSeries( BBSmoth, BBPane, 912, #Thick );
var BBSignalBuy,BBSignalSell: integer;
BBSignalBuy := SMASeries(b2,40);
BBSignalSell := SMASeries(s2,40);
PlotSeries( BBSignalBuy, testPane, 449, #Thick );
PlotSeries( BBSignalSell, testPane, 944, #Thick );
limit := #OptVar5/10;
for Bar := SlowPer to BarCount - 1 do
begin
//xStop := @hSlow[Bar];
case MarketPosition of
0:
begin
if ( @BBDiff[ Bar ]>(@BBSmoth[Bar]) ) then begin // poziom roznicy
wstegi bb
if ((@b2[Bar] > @s2[Bar]) and (@b2[Bar]>@BBSignalBuy[Bar]) and
(@s2[Bar]<@BBSignalSell[Bar])) then begin
xStop := GetSeriesValue(Bar,#Close)-30;
BuyAtClose( Bar , '');
end;
if ((@s2[Bar] > @b2[Bar]) and (@s2[Bar]>@BBSignalSell[Bar]) and
(@b2[Bar]<@BBSignalBuy[Bar])) then begin
xStop := GetSeriesValue(Bar,#Close)+30;
ShortAtClose( Bar , '');
end;
//end;
//end;
end;
1:
begin
if (@s2[Bar] > @b2[Bar]) then SellAtClose(Bar,LastPosition,'');
SellAtStop( Bar+1, xStop, LastPosition, 'Stop Loss' );
end;
-1:
begin
if (@b2[Bar] > @s2[Bar]) then SellAtClose(Bar,LastPosition,'');
CoverAtStop( Bar+1, xStop, LastPosition, 'Stop Loss' );
end;
end;
end;