Rozklad normalny jest czesto spotykany w zastosowaniach finansowych. Charakteryzuje sie dwoma parametrami (srednia \(\mu\) i odchyleniem standardowym \(\sigma\)). Srednia w rozkladzie normalnym jest parametrem polozenia, a odchylenie standardowe jest parametrem rozproszenia rozkladu. Jesli \(\mu = 0\) oraz \(\sigma = 1\) wtedy mowimy o standardowym rozkladzie norlmanym.
Funkcja prawdpododobienstwa rozkladu normalnego przybiera wzor postaci:
\[\phi_{\mu, \sigma}(x)= {1 \over \sigma\sqrt{2\pi} }\exp \left(\frac {-(x -\mu )^2} {2\sigma^2}\right)\]
Funkcja prawdopodobienstwa rozkladu normalnego standardowego mozna uproscic do postaci:
\[\phi_{\mu = 0, \sigma = 1}(x)= {1 \over \sqrt{2\pi} }\exp \left(\frac {-x^2} {2}\right)\]
Graficznie mozna przedstawic ja w postaci:
plot(function(x) dnorm(x), -4, 4, main = "Funkcja prawdopodobienstwa N(0,1)", col = "red", ylab = "Prawdp.")
Dystrybuanta rozkladu normalnego przedstawia sie za pomoca wzoru: \[P(X \le x) = \int\limits_{-\infty}^x \frac{1} {\sigma\sqrt{2\pi} } e^{-(x-\mu)^2 \over 2\sigma^2}\]
Za jej pomoca mozemy policzyc rozne przydatne prawdopodobienstwa. Na przyklad, ze zmienna losowa o rozkladzie normalnym nie przekroczy okreslonej wartosci tzn. \(P(X \le a)\) lub bedzie sie zawierala w okreslonym przedziale, tzn. \(P( a \le X \le b)\).
Graficznie dystrybuanta dla rozkladu standardowego normalnego przedstawia sie nastepujaco:
plot(function(x) pnorm(x), -4, 4, main = "Dystrybuanta rozkladu N(0,1)", col = "red", ylab = "Prawd.")
W R mozemy wylosowac losowe proby z wielu rozkladow prawdopodobienstwa. Z rozkladu normalnego losowanie odbywa sie za pomoca procedury rnorm
.
#ustalamy wielkosc proby losowej
obs <- 1000
#losujey probe i zapisujemy ja w wektorze x
#parametry mean oraz sd sa opcjonalne
#jesli zostana pominiete, R domyslnie wylosuje probe z rozkladu N(0,1)
x <- rnorm(1000, mean = 0, sd = 1)
#pierwsze 25 obserwacji z rozkladu normalnego wyglada nastepujaco
head(x, 25)
## [1] -0.46495492 -0.46173531 0.26606456 0.21960034 0.47547547
## [6] -0.11353523 0.05920274 0.30168715 0.65043553 -0.98707504
## [11] 1.82685563 -0.10079704 0.46102116 -0.10153342 0.93008540
## [16] -0.75169089 -1.48530458 0.65012253 0.43731274 0.01698198
## [21] 1.28633949 -0.76240464 0.40770373 1.38904055 0.03678179
#wykres obserwacji
plot(x, pch = 16, col = "blue", ylab = "Wartosc obserwacji", xlab = "n", main = "Obs. z rozkladu N(0,1)")
Zalozmy teraz, ze mamy pewien wektor obserwacji i chcemy sprawdzic czy obserwacje te rzeczywiscie pochodza z rozkladu normalnego. Sprawdzimy czy:
Poniewaz w 2015 mielismy 252 dni, w ktorych akcje byly notowane na gieldzie dla zachowania spojnosci wygenerujemy tez probe losowa o tej samej liczebnosci z rozkladu normalnego.
W pierwszej kolejnosci sprawdzimy normalnosc obesrwacji dla sztucznie wygenerowanej proby losowej.
#okreslamy wielkosc proby (odpowiadajacej 252 zwrotom w roku 2015)
obs <- 252
#ustawiamy ziarno, aby nasza proba losowa byla "deterministyczna"
set.seed(123)
#losujemy probe losowa
proba.teor <- rnorm(obs, mean = 0, sd = 1)
#za pomoca tego parametru ustawiamy, ze chcemy ogladac dwa wykresy kolo siebie
par(mfrow = c(1,2))
plot(proba.teor, pch = 16, col = "blue", main = "Proba z rozkladu N(0,1), n = 252")
#roklad kwantyli teoretycznych oraz empirycznych
qqnorm(proba.teor)
qqline(proba.teor, col = "red")
Proba z rozkladu normalnego
Teraz postepujemy podobnie tylko, ze w tym przypadku zamiast teoretycznej proby losowej badamy rozklad zwrotow dla akcji Apple.
#korzystamy z pakietu Quandl
library(Quandl)
## Loading required package: xts
## Loading required package: zoo
##
## Attaching package: 'zoo'
## The following objects are masked from 'package:base':
##
## as.Date, as.Date.numeric
#zapisujemy dane Apple w postaci ramki danych
apple.data <- Quandl("WIKI/AAPL", start_date = "2015-01-01", end_date = "2016-01-01")
#patrzymy jak wygladaja dane, w ramce danych mamy date kwotowania, cene otwarcia, zakmniecia, itd.
#Do analizy wykorzystamy cene zamkniecia
head(apple.data)
## Date Open High Low Close Volume Ex-Dividend
## 1 2015-12-31 107.01 107.03 104.8200 105.26 40123438 0
## 2 2015-12-30 108.58 108.70 107.1800 107.32 24265772 0
## 3 2015-12-29 106.96 109.43 106.8600 108.74 30598887 0
## 4 2015-12-28 107.59 107.69 106.1807 106.82 26502466 0
## 5 2015-12-24 109.00 109.00 107.9500 108.03 13595745 0
## 6 2015-12-23 107.27 108.85 107.2000 108.62 32296587 0
## Split Ratio Adj. Open Adj. High Adj. Low Adj. Close Adj. Volume
## 1 1 106.4370 106.4569 104.2588 104.6964 40123438
## 2 1 107.9986 108.1180 106.6061 106.7454 24265772
## 3 1 106.3873 108.8441 106.2879 108.1578 30598887
## 4 1 107.0139 107.1134 105.6122 106.2481 26502466
## 5 1 108.4164 108.4164 107.3720 107.4516 13595745
## 6 1 106.6957 108.2672 106.6260 108.0384 32296587
#dla obliczenia logarytmow ze zwrotow, musimy odwrocic kolejnosc danych
apple.close <- rev(apple.data$Close)
apple.rets <- diff(log(apple.close), lag = 1)
par(mfrow = c(1,2))
plot(apple.rets, pch = 16, col = "blue", main = "Apple 2015 rets, n = 252")
qqnorm(apple.rets)
qqline(apple.rets, col = "red")