background image

 

 

 

 

 

PRACA DYPLOMOWA 

„SYSTEM INFORMATYCZNY WSPOMAGAJĄCY DECYZJE 

TRADERA” 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

background image

 

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

 

 

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

 

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

 

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

 

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

 

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

 

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

–  C

1    ,     

gdzie  C

jest  ceną 

zamknięcia  bieżącej  sesji,  C

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. 

 
 
 
 
 
 
 

 
 

 

Medium

Big

   0 

dC

max 

 

dC

µ

dC 

Low

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

, H

]  , gdzie L

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

> 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

i

 

H

0

 = H

( przedziały są równe ) do 1 gdy H

= L

0

. Jeżeli H

> L

, 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

< L

,  H

< 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

<  L

0

    i    H

-  L

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

 
 
 
 
 
 
 

 
 

 

Medium

Big

   0 

     1

 

ε 

µ

dB 

Low

 

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

– V

1  ,  

gdzie V

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) 

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 

 

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 

 

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

– 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 

 

min

dC

 

 

max

dC

 

CSELL

µ

 

  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 

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 

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 

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

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 

 

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 

 

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 

 

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 

 

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 

 

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 

 

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;