Metody Sztucznej Inteligencji 2 Projekt Prognozowanie kierunku ruchu indeksów giełdowych na podstawie danych historycznych. Autorzy: Robert Wojciechowski Michał Denkiewicz Mateusz Gągol
Wstęp Celem projektu jest umożliwienie przewidywania trendu światowych indeksów giełdowych na podstawie informacji historycznych. Niektórzy uczeni twierdzą, że ruchy cen akcji przypominają nieliniowy deterministyczny proces (chaos), a tylko trudność jego matematycznego zapisu sprawia, że z pozoru wydają się losowe. W programie zostanie wykorzystana sieć neuronowa, ponieważ posiada właściwości umożliwiające uczenie się nieliniowych zależności między danymi wejściowymi. Sieć typu Backpropagation Sieć składa się z z jednostek wejściowych oraz przetwarzających zwanych neuronami. Neurony połączone z wszystkimi neuronami w kolejnej warstwie z uwzględnieniem wag, które magazynują wiedzę wytrenowanej sieci. W warstwach ukrytej oraz wejściowej może znajdować się jednostka bias zwracająca na wyjściu zawsze 1. Ilość warstw ukrytych oraz neuronów zależy od rozmiaru oraz natury zadania.
Sieci typu Backpropagation są jednokierunkowe oraz korzystają z mechanizmów uczenia. Przepływ informacji następuje od warstwy wejściowej do wyjściowej. Proces uczenia natomiast polega na porównywaniu otrzymanych wyników z poprawnymi odpowiedziami, a następnie poprawiania wag w oparciu o algorytm minimalizacji sumy kwadratów błędów. Sieci typu Backpropagation wykorzystywane są w 80% aplikacji służących do prognozowania ruchów cen na giełdach. Preprocessing danych Bazowy zestaw danych wejściowych będzie normalizowany do przedziału [-a,a], gdzie parametr a dobierany będzie eksperymentalnie z przedziału [0,1]. Oprócz bazowego zestawu danych wejściowych, będziemy badać sieci pracujące z wstępnie przetworzonymi danymi wejściowymi. Do zestawu danych zostanie dołączony wskaźnik RSI (Relative Strength Index) lub inny rodzaj ważonej średniej kroczącej. RSI jest popularnym wskaźnikiem analizy technicznej używanym najczęściej w połączeniu z innymi wskaźnikami. Określa siłę trendu porównując ruchy zwyżkujące i zniżkujące cen zamknięcia w danym okresie czasu. Twórca wskaźnika sugeruje okres 14 dniowy jako optymalny. Jednak na potrzeby programu zostaną wykorzystane wersje z 9 lub 7 dniowym przedziałem czasowym (są bardziej czułe na zmiany). Wartości wskaźnika podaje się w skali o 0 do 100. W praktyce stosuje się dwie metody interpretacji wskaźnika. Pierwsza z nich polega na obserwacji rozbieżności pomiędzy wartością wskaźnika a wartością cen akcji (wartością indeksu). Do zastosowania z siecią neuronową, lepiej nadaje się druga metoda. Określane są poziomy wykupienia i wyprzedania rynku. Przekroczenie tych poziomów przez wskaźnik oznacza odwrócenie trendu. Poziomy są dobierane na wysokości 20-30% dla wyprzedania i 70-80% dla wykupienia. Jako dane wejściowe sieci podawana będzie wartość RSI, wartości indeksu na zamknięciu sesji oraz wolumen obrotów. Wszystkie wartości przeskalowane. Inną możliwością wstępnego przetworzenia danych jest obliczenie średniej kroczącej ważonej z uwzględnieniem wolumenu obrotów. Zostanie dobrane średnia o stosunkowo szybkiej reakcji na zmiany. Razem ze średnią jako dane wejściowe podawane będą wartości indeksu na zamknięciu sesji. Dobór danych wejściowych i stosowanych parametrów związanych ze wskaźnikami powinny
być elastyczne. Wybrane zostały stosunkowo proste wskaźniki które mogą jedynie wspomagać interpretację samej wartości indeksu. Prognozowanie zmian kursu na podstawie samych wskaźników (np. MACD + RSI) nie zostanie uwzględnione. Zebranie danych wejściowych Jako zbiór uczący oraz do testów zostaną wykorzystane historyczne dzienne wartości światowych indeksów giełdowych. Są one dostępne nieodpłatnie w Internecie na stronie http://uk.finance.yahoo.com/m1.php Date Open High Low Close Volume Adj Close 2009-03-09 3530,7 3564,8 3460,7 3542,4 1,57E+09 3542,4 2009-03-06 3529,9 3590,2 3492,1 3530,7 1,59E+09 3530,7 2009-03-05 3645,9 3645,9 3526,4 3529,9 1,52E+09 3529,9 2009-03-04 3512,1 3649,5 3512,1 3645,9 1,28E+09 3645,9 2009-03-03 3625,8 3676,9 3497,3 3512,1 1,55E+09 3512,1 2009-03-02 3830,1 3830,1 3625,8 3625,8 1,49E+09 3625,8 Zbiory do trenowania oraz testowania Jest sprawą oczywistą, że zbiór do trenowania sieci neuronowej będzie największy, zawierając około 80% wszystkich rekordów wejściowych. Aby uogólnić proces uczenia rekordy będą przekazywane w sposób losowy do wejścia. Zbiór do testowania posłuży do sprawdzenia czy sieć została poprawnie wyuczona. Architektura sieci Głównym elementem aplikacji jest sieć neuronowa typu perceptron. Wybranie algorytmu backpropagation zapewnia duże możliwości uogólniania oraz stosunkową prostą implementację. Niestety problematyczne może być wykrycie odpowiedniej konfiguracji oraz parametrów sieci. Jeżeli zostania ona jednak znaleziona, a następnie poprawnie wytrenowana można spodziewać się dobrych wyników wydajności jej działania.
Sieć składać się będzie z trzech warstw: 1. warstwa wejściowa: n*m+1 elementów 1 bias zawsze na wejściu m - równe 3 lub 2 w zależności od wyboru rodzaju informacji wejściowych spośród wartość RSI, wartości indeksu na zamknięciu sesji oraz wolumen obrotów n - ilość dni w oknie czasowym (próbce czasowej) 2. warstwa ukryta : zostanie ona tak zaprojektowana aby umożliwić zmianę liczby neuronów z poziomu programu, w procesie testowania zostanie podjęta próba określenia najlepszej ilości neuronów w tej warstwie. dodatkowo 1 bias - zawsze na wejściu 3. warstwa wyjściowa: 1 neuron o wartości w przedziale <-1,+1>. Wartość <-1,0) oznaczać będzie zachętę do sprzedaży (przewidywana wartość spółki będzie niższa), natomiast wartość <0,1> sugerować kupno (przewidywana wartość spółki będzie wyższa) Każdy element wejściowy połączony jest z każdym neuronem warstwy ukrytej. Każdy neuron warstwy ukrytej połączony jest z neuronem wyjściowym Ilość ukrytych warstw Dzięki ukrytym warstwom sieć posiada możliwość uogólniania. Zgodnie z teorią sieć z jedną warstwą ukrytą jest zdolna do przybliżania funkcji ciągłych. Zbyt duża ilość warstw ukrytych może doprowadzić naddopasowania sieci (overfitting), charakteryzującego się zwiększonymi czasami obliczeń i pogorszeniem zdolności wykrywania ogólnych wzorców. Ilość ukrytych neuronów Nie istnieje wzór umożliwiający dokładne obliczenie optymalnej liczby neuronów w warstwie ukrytej. Możliwe jest jednie podawanie zakresów w jakich się ona znajduje,a następnie testowanie kolejnych wartości w nich się znajdujących. Punktem wyjścia uczynimy wynik otrzymany poprzez zastosowania zasady geometrycznej piramidy sqrt(n x m). Gdzie n oznacza ilość neuronów wejściowych, natomiast m wyjściowych.
Funkcja przejścia Funkcja przejścia używana jest do zdefiniowania wartości wyjścia w neuronach. W programie zostanie wykorzystana sigmoidalna funkcja. Zgodnie z literaturą jest ona najlepsza do trenowania sieci mającej symulować zjawiska charakteryzujące się niewielkimi odchyleniami. W przeciwnych wypadkach stosuje się hiperboliczny tangens. W każdym przypadku celem zastosowania funkcji przejścia jest uniemożliwienie otrzymania na wyjściu bardzo dużych wartości,które by paraliżowały sieć oraz uniemożliwiały jej wytrenowanie. Algorytm Backpropagation Algorytm propagacji wstecznej jest podstawowym algorytmem uczenia ( nadzorowanego czy z nauczycielem ) dla wielowarstwowych jednokierunkowych sieci neuronowych. Jest to zasada zmian wag Tij dowolnych połączeń elementów przetwarzających rozmieszczonych w warstwach sieci. Algorytm oparty jest o zasadę minimalizacji sumy kwadratów błędów uczenia z wykorzystaniem optymalizacyjnej metody największego spadku. 1. Aby określić stan j-tego neuronu w warstwie n obliczamy ważoną sumę jego M wejść M E n j = T n n 1 j,i U i i=1 E j n ważona suma wejściowa j-tego neuronu w warstwie n n T j,i waga połączenia i-tego neuronu w warstwie n-1 i j-tego neuronu w warstwie n U i n 1 wyjście i tego neuronu w warstwie n-1 2. Sygnał wyjściowy j-tego neuronu w warstwie n jest równy U i n 1 = f E j n gdzie f jest funkcją przejścia (przenoszenia) neuronu 3. Obliczany jest globalny sygnał błędu, który jest różniczkowalną funkcją wag sieci
M D=1/2 U. j U wy j 2 i=1. U j wzorcowe wyjście j-tego neuronu w warstwie wyjściowej n T j,i aktualne wyjście j-tego neuronu w warstwie wyjściowej 4. Na tym etapie algorytmu wstecznej propagacji za cel można uznać minimalizację błędu globalnego D, przez modyfikację wag sieci. Można do tego wykorzystać metodę gradientu. T n n j,i = N D/ T j,i N współczynnik uczenia Zmieniamy każdą wagę zgodnie z wielkością i kierunkiem ujemnego gradientu na hiperpowierzchni D(T). 5. Dla elementów położonych w warstwie wyjściowej T wy j,i = N d wy wy 1 j U i Natomiast funkcja błędu użyta do zmodyfikowania wag pomiędzy neuronami warstwy wyjściowej a elementami warstwy poprzedzającej ostatniej pośredniej to: T n j,i t =T n n j,i t 1 N T j,i T n j,i t = T n j, i t 1 1 d n j f E n 1 i Iteracyjne obliczenia pozwalają na poprawianie wag wstecz, aż do warstwy wejściowej.
Ilość iteracji W tworzonej aplikacji zastosowane zostaną dwa podejścia do wyboru odpowiedniej liczby iteracji. Pierwszy sposób opiera się na trenowaniu sieci za pomocą zbioru uczącego oraz co pewną stałą liczbę generacji H sprawdzanie przy użyciu zbioru walidacyjnego stopnia nauczenia sieci. Jeżeli będzie on większy niż zadana stała N(N% przewidywań poprawnych) wówczas następuje zakończenie procesu nauki sieci. Będzie istniała możliwość przerwania omawianego procesu przez użytkownika. Drugi sposób trenowania sieci polega na przekazaniu z poziomu interfejsu zadanej liczby iteracji. Współczynnik uczenia Współczynnik uczenia jest stałą określającą siłę z jaką wyznaczony błąd między otrzymanymi a poprawnymi wagami będzie propagowany wzdłuż sieci. Zmiana wagi neuronu zależy także od wpływu wagi na powstały błąd. Analogię tego procesu można porównać do próby umieszczenia piłki z dołka A w dołku C. Zbyt duża użyta siła może sprawić że znajdzie się ona w punkcie B. Natomiast zbyt mała sprawi,że piłka pozostanie w A. Podczas trenowania sieci zbyt wysoki współczynnik uczenia objawia się dużymi zmianami wartości funkcji błędu nie prowadzącymi do stałej poprawy. Za mały współczynnik prowadzi do niezauważalnej poprawy wartości funkcji błędu oraz wydłużenia czasu treningu. W praktyce na początku ustawia się współczynnik uczenia na poziomie powyżej 0.7, a następnie obniża w procesie treningu.
Funkcjonalność interfejsu aplikacji (technologia.net) : 1. Zarządzanie danymi wejściowymi dla sieci neuronowej: a) Wybór jednego ze światowych indeksów giełdowych b) Pobieranie danych z internetu (użytkownik podaje okres danych do pobrania) c) Przechowywanie d) Wizualizacja w postaci wykresu 2. Tworzenie i trenowanie sieci przy użyciu uprzednio pozyskanych danych. Użytkownik może sterować: a) Liczbami wykorzystywane do normalizacji danych wejściowych b) Współczynnikiem uczenia sieci c) Ilością generacji d) Wielkością warstwy ukrytej e) Wielkością okna (przedziałem czasowym danych na wejściu sieci) 3. Przechowywanie wytrenowanych sieci wraz z informacją o parametrach trenowania. 4. Generowanie prognozy na kolejny dzień przez wytrenowaną sieć. 5. Testowanie możliwości wytrenowanych sieci przy użyciu wybranych danych. 6. Jednoczesne uruchamianie trenowania kilku sieci o różnych parametrach na tych samych danych, zakończone testowaniem na innym podanym zestawie danych. Analiza efektywności sieci Istnieją cztery możliwe rezultaty porównania prognozy wygenerowanej przez sieć na konkretny dzień: poprawne przewidzenie wzrostu wartości indeksu poprawne przewidzenie spadku wartości indeksu zasygnalizowanie wzrostu, gdy ten nie nastąpił zasygnalizowanie spadku, gdy ten nie nastąpił Analiza efektywności sieci polegać będzie na obliczeniu proporcji występowania każdej z tych sytuacji podczas okresu testowania. Obliczany też będzie procent poprawnych rozpoznań trendu.