Modelowanie rynków finansowych z wykorzystaniem pakietu R Metody numeryczne i symulacje stochastyczne Mateusz Topolewski woland@mat.umk.pl Wydział Matematyki i Informatyki UMK
Plan działania 1 Całkowanie w R 2 Optymalizacja symulacji 3 Rozwiązywanie równań w R
Całka Riemanna Niech f : [a, b] R będzie funkcją ciągłą. Wówczas całkę Riemanna z funkcji f możemy przybliżać tzw. sumami Riemanna. Twierdzenie b a 1 n 1 f (t)dt lim f n n k=0 (a + kn (b a) ). Źródło: http://commons.wikimedia.org/wiki/file:riemann_sum6.jpg
Metoda Monte Carlo Mocne Prawo Wielkich Liczb Niech {X n } n N będzie ciągiem niezależnych zmiennych losowych o tym samym rozkładzie. Jeżeli E [ X 1 ] <, to 1 n n k=1 X k p.n. n E [X 1]. Niech f : [a, b] R będzie ciągłą funkcją niujemną oraz M sup t [a,b] f (t). Rozważmy funkcję X : [a, b] [0, M] {0, 1} zadaną wzorem { 1, y f (x) X(x, y) = 0, y > f (x). Wówczas X ma rozkład Bernoullego z jedną próbą i prawdopodobieństwem sukcesu b f (t)dt a M(b a).
Metoda Monte Carlo cd. Niech zmienne X 1, X 2,... będą niezależne i mają rozkład L(X). Wówczas b a 1 f (t)dt = M(b a) lim n n n X k. k=1
Wartość oczekiwana Bezpośrednio z mocnego prawa wielkich liczb możemy obliczać również wartości oczekiwane złożonych zmiennych losowych. Niech X 1,..., X d będą niezależnymi zmiennymi losowymi oraz {X 1 n },..., {X d n } ich niezależnymi kopiami. Wówczas dla dowolnej funkcji mierzalnej f : R d R jeśli E [ f (X 1,..., X d ) ] <, to E [ f (X 1,..., X d ) ] 1 = lim n n n f (Xk 1,..., Xk d ). k=1 Przykład Niech U U(0, 1). Wartość oczekiwaną E [ Φ 1 (U) ] możemy przybliżać w R poleceniami postaci > mean(qnorm(runif(n))), gdzie n jest ustaloną liczbą.
Wektoryzacja obliczeń Jedną z metod przyśpieszania obliczeń R-a jest tzw. wektoryzacja obliczeń. Zamiast powtarzać działanie funkcji w pętli, działamy funkcją na cały wektor (macierz) argumentów. Służą do tego polecenia z rodziny apply. Funkcje jednego argumentu Polecenie: sapply(x, fun, pozostale_argumenty) zwróci wektor tej samej długości co x zawierający wartości funcji fun ze zmieniającym się pierwszym argumentem i ustalonymi pozostałymi. Przykład Całkę Riemanna b a f (t)dt możemy obliczyć poleceniem: > mean(sapply(seq(a,b,1/n),f)).
Wektoryzacja obliczeń cd. Funkcje wielu argumentów Polecenie apply wykonuje podobną operację, z tym że x jest teraz macierzą której wiersze (lub kolumny) są kolejnymi wektorami argumentów. Składnia polecenia wygląda następująco > apply(x, margin, fun, pozostale_argumenty), gdzie zmienna margin mówi czy waktory wartości wpisane są w wierszach (wartość 1), czy kolumnach (wartość 2). W dokumentacji można znaleźć inne działające na podobnej zasadzie funkcje wykonujące operacje na macierzach, listach, wyrażeniach, etc.
Inne metody Uwaga Niektóre funkcje (np. sin(), cos(), exp(), sqrt()) po podaniu jako argumentu wektora argumentów zwracają wektor wartości. Podobnie będą działały funkcje użytkownika wykonujące proste operacje. Schemat ten nie zadziała jeżeli argument jest np. wymiarem macierzy tworzonej przez funkcję. Wirtualne klastry Inną metodą przyśpieszenia obliczeń jest stworzenie z kilku rdzeni procesora wirtualnego klastra obliczeniowego. Można wtedy wykonywać obliczenia równoległe na kilku rdzeniach. Procedura ta jest szczególnie przydatna w 32-bitowych wersjach R-a. Rozwiązania te są zaimplementowane w pakietach snow, parallel i innych. Więcej informacji na ten temat można znaleźć w dokumentacji.
Pierwiastki równania Każde równanie z jedną zmienną można sprowadzić do postaci (nieliniowej) f (x) = 0. W języku R takie równania można rozwiązywać m.in. za pomocą pakietu rootsolve. Dokumentacja pakietu dostępna jest na serwerze CRAN. Pakiet rootsolve Z pomocą pakietu rootsolve możemy: rozwiązywać równania nieliniowe (jedno i wielowymiarowe); rozwiązywać równania różniczkowe zwyczajne i cząstkowe; aproksymować gradienty funkcji nieliniowych;
Pierwiastki równania Każde równanie z jedną zmienną można sprowadzić do postaci (nieliniowej) f (x) = 0. W języku R takie równania można rozwiązywać m.in. za pomocą pakietu rootsolve. Dokumentacja pakietu dostępna jest na serwerze CRAN. Pakiet rootsolve Z pomocą pakietu rootsolve możemy: rozwiązywać równania nieliniowe (jedno i wielowymiarowe); rozwiązywać równania różniczkowe zwyczajne i cząstkowe; aproksymować gradienty funkcji nieliniowych;
Funkcja uniroot Do rozwiązywania równań nieliniowych służy funkcja uniroot() oparta na algorytmie Brenta zakładającym ciągłość funkcji. Jako argumenty podajemy funkcję f oraz przedział, w którym znajduje się pierwiastek (przedział podajemy w postaci c(poczatek, koniec)). Dodatkowo możemy ustawić między innymi: tol pożądaną dokładność przybliżenia maxiter maksymalną liczbę powtórzeń algorytmu (domyślnie 1000) Wynikiem działania funkcji jest lista zawierająca cztery elementy: root pierwiastek f.root wartość funkcji w wyznaczonym punkcie iter liczbę iteracji algorytmu estim.prec przybliżoną dokładność wyniku
Przykład Rozważmy równanie e x = x, lub równoważnie f (x) = e x x = 0. Rozwiążemy je w dwóch etapach 1. Implementacja funkcji f : > f <- function(x) return(exp(-x)-x) 2. Zastosowanie funkcji uniroot: > uniroot(f,c(0,1) Uwaga Funkcja uniroot na początku sprawdza czy wartości f na końcach przedziałów są różnych znaków. Czasami dla określenia przedziału dla algorytmu warto oszacować go na podstawie wykresu.