System informatyczny wspomagający decyzji tradera

background image

2

PRACA DYPLOMOWA

„SYSTEM INFORMATYCZNY WSPOMAGAJĄCY DECYZJE

TRADERA”

background image

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

background image

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

background image

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

background image

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.

background image

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.

background image

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.

background image

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ń

background image

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

background image

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ż

background image

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.

background image

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ł

background image

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.

background image

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

background image

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).

background image

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.

background image

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

background image

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ł.

background image

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

background image

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%.

background image

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.

background image

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

background image

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.

background image

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).

background image

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

background image

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

background image

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

.

background image

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.

background image

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

background image

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

background image

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;

background image

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

background image

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

background image

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.

background image

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

,

background image

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

background image

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.

background image

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.

background image

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.

background image

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.

background image

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.

background image

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

background image

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

background image

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

background image

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

.

background image

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

α

α

α

,

,

background image

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

background image

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%

background image

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.)

background image

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.

background image

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ą

background image

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.

background image

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.

background image

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


background image

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;

background image

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;

background image

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);

background image

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

background image

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;

background image

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;

background image

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

background image

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;

background image

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);

background image

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

background image

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;

background image

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;

background image

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 );

background image

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;


Wyszukiwarka

Podobne podstrony:
System informatyczny wspomagający podejmowanie decyzji na rynku walutowym
IWZ 7 Informatyczne wspomaganie decyzji
SYSTEMY INFORMOWANIA KIEROWNICTWA,decyzji,biura
Systemy informatyczne wspomagajace zarzadzanie Sobiesinski&Slupski
Systemy informatyczne wspomagajace zarzadzanie Sobiesinski&Slupski
System informatyczny wspomagający obsługę firmy prowadzącej gry losowe
IWZ 7 Informatyczne wspomaganie decyzji
zymonik,METODY BADANIA Systemów Informacyjnych Zarządzania,DECYZJE
Zintegrowane systemy informatyczne wspomagające zarządzanie przedsiębiorstwami
pytanie4, wisisz, wydzial informatyki, studia zaoczne inzynierskie, statystyczne metody wspomagania
pytania swd z odpowiedziami mini, wisisz, wydzial informatyki, studia zaoczne inzynierskie, statysty
laboratorium 5, wisisz, wydzial informatyki, studia zaoczne inzynierskie, statystyczne metody wspoma
laboratorium 7, wisisz, wydzial informatyki, studia zaoczne inzynierskie, statystyczne metody wspoma
pytania swd, wisisz, wydzial informatyki, studia zaoczne inzynierskie, statystyczne metody wspomagan
uzu0.4, wisisz, wydzial informatyki, studia zaoczne inzynierskie, statystyczne metody wspomagania de
laboratorium 6, wisisz, wydzial informatyki, studia zaoczne inzynierskie, statystyczne metody wspoma
SWD3, wisisz, wydzial informatyki, studia zaoczne inzynierskie, statystyczne metody wspomagania decy

więcej podobnych podstron