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