Marcin Pitera
Dzisiaj bardziej ogólnostatystyczny wpis, choć nie bez znaczenia dla matematyki finansowej.
Załóżmy, iż mamy dany n-wymiarowy wektor losowy i chcemy opisać (czy zobrazować) zależność między zmiennymi brzegowymi, tzn. zmiennymi losowymi
. Oczywiście w przypadku matematyki finansowej zagadnienie to jest bardzo istotne. Na przykład informacja o zależności między akcjami pozwala nam na konstruowanie zdywersyfikowanych portfeli finansowych, co często przekłada się na zmniejszony poziom ryzyka, które ponosimy (o analizie Markowitza opowiemy innym razem).
Na początku przedstawmy trochę teorii w pigułce (odnośniki dla chętnych):
Standardową miarą zależności jest macierz korelacji, która opisuje zależność (liniową) między każdą parą zmiennych brzegowych dla wektora X. O ile opisanie zależności przy pomocy macierzy jest wygodne, o tyle nie daje całej informacji. Może się zdarzyć nawet tak, iż brzegi będą liniowo niezależne (tzn. współczynnik korelacji dla dany pary będzie równy 0), a jednocześnie jedna zmienna będzie nam determinowała drugą. Wady współczynnika liniowego można znaleźć w książce Market Risk Analysis (C. Alexander, Rozdział II.3.3.2).
Aby uniknąć takich sytuacji często rozważa się inne miary zależności. Dla par zmiennych losowych najpopularniejsze to współczynniki rangowe Spearmana i Kendalla. Wartości te są niezmiennicze względem przekształceń rosnących (niekoniecznie liniowych), co eliminuje wiele wad korelacji. Z drugiej strony, wciąż chcemy opisać zależność między (parami) zmiennymi przy pomocy macierzy , więc trzeba być przy tym bardzo uważnym.
Pełny opis zależności umożliwia nam tzw. funkcja Copula (w Polsce każdy, z nieznanych mi bliżej przyczyn, używa innej nazwy – funkcja powiązań, funkcja łącząca, kopula, kopuła, itd.). Idea stojąca za tą funkcją jest bardzo prosta. Dla uproszczenia przyjmijmy, iż X jest absolutnie ciągły. Z wektorem X skojarzona jest n-wymiarowa dystrybuanta
oraz jednowymiarowe dystrybuanty brzegowe
.
Ponieważ funkcje są monotoniczne, to można pokazać (jest to tzw. Twierdzenie Sklara), iż istnieje (jedyna) funkcja C która łączy nam dystrybuantę łączną z dystrybuantami brzegowymi, tzn. zachodzi równość
W pewnym sensie rozbiliśmy dystrybuante H na funkcje opisujące brzegi oraz na funkcję opisującą zależność między nimi. Po więcej szczegółów na ten temat odsyłam do książki An Introduction to Copulas (R.B. Nelsen).
To tyle teorii. Przejdźmy teraz do R. Jako nasze dane weźmy dopasowane ceny zamknięcia w roku 2015 dla dużych spółek notowanych na NASDAQ.
require(fImport); require(quantmod) stocks<-c("AAPL","TWTR","GOOGL","FB") prices<-as.xts(yahooSeries(stocks,from="2015-01-01",to="2015-12-31")) prices<-prices[,grep("Adj.Close", colnames(prices))] names(prices)<-stocks returns<-ROC(prices,type="discrete",na.pad=F)
Dla uproszczenia zakładamy, iż mamy do czynienia z próbą i.i.d. Macierz korelacji (tzn. jej estymator), czy macierz -Spearmana w R liczy się bardzo prosto:
cor(returns) cor(returns,method="spearman")
Przy okazji widać, iż dla różnych metod wychodzą różne stopnie zależności. Odczytując macierz korelacji można by było przypuszczać, iż zależność między parą TWTR/FB jest wyższa, niż między parą TWTR/GOOGL. Dla macierzy -Spearmana jest na odwrót. Pomijając fakt, iż zależność liniowa i monotoniczna to dwie różne rzeczy, kluczową kwestię pełni tutaj błąd estymatora (na przykład korzystając z biblioteki boot, można pokazać, iż zależność liniowa między parą TWTR/FB nie jest istotnie statystycznie wyższa niż między parą TWTR/GOOGL – o tym jednak opowiemy kiedy indziej). Jeżeli chcemy sprawdzić, jak dokładny jest nasz wynik dla jednej pary, to możemy skorzystać na przykład z funkcji cor.test, która da nam przedziały ufności naszego estymatora (warto sprawdzić również funkcję rcorr z Hmisc).
cor.test(returns[,"TWTR"],returns[,"FB"])
Widać tutaj przy okazji, jak bardzo trzeba uważać, jak chodzi o interpretacje wyników – jeżeli ktoś wam podaje współczynnik korelacji bez przedziałów ufności, to zawsze należy taki wynik traktować z dużą rezerwą.
Jest dużo metod wizualizacji, macierzy korelacji: heatmapy, correlogramy, itd. (polecam np. pakiet corrplot). W finansach często pokazuje się też dopasowaną do danych funkcję (?chart.Correlation udzieli więcej informacji na ten temat):
chart.Correlation(returns,method="spearman")
Nie wchodząc w szczegóły, stwórzmy teraz empiryczną funkcję Copula i narysujmy funkcje brzegowe (tzn. dwuwymiarowe próbki funkcji copula dla par zmiennych losowych). Bardziej zaawansowane narzędzia związane z teorią funkcji Copula są dostępne np. w pakiecie copula.
a<-apply(returns,2,ecdf); b<-Vectorize(function(x){a[[x]](returns[,x])}) cop<-b(1:length(a)) colnames(cop)<-stocks pairs(cop)
Na koniec, aby lepiej zrozumieć ten wykres, przyjrzyjmy się empirycznej funkcji Copula dla pary GOOGL i FB. W tym celu narysujmy oryginalna próbkę z brzegami oraz empiryczną kopułę
ahist=function(x,y){ zones=matrix(c(2,0,1,3),ncol=2,byrow=TRUE) layout(zones,widths=c(2/3,1/3),heights=c(1/3,2/3)) xrange <- c(min(x),max(x)) yrange <- c(min(y),max(y)) xhist <- hist(x, plot=FALSE, breaks=17) yhist <- hist(y, plot=FALSE, breaks=25) top <- max(c(xhist$counts, yhist$counts)) par(mar=c(3,3,1,1)) plot(x, y, xlim=xrange, ylim=yrange, xlab="", ylab="") par(mar=c(0,3,1,1)) barplot(xhist$counts, axes=FALSE, ylim=c(0, top), space=0) par(mar=c(3,0,1,1)) barplot(yhist$counts, axes=FALSE, xlim=c(0, top), space=0, horiz=TRUE) } x1<-as.vector(returns[,"GOOGL"]); x2<-cop[,"GOOGL"] y1<-as.vector(returns[,"FB"]); y2<-cop[,"FB"] ahist(x1,y1); ahist(x2,y2)
Po lewej widzimy próbkę z dwuwymiarowego wektora losowego stóp zwrotu GOOGL i FB, natomiast po prawej odpowiadającą mu próbkę z empirycznej funkcji Copula, która przedstawia zależność między jedną i drugą spółką na kwadracie [0,1]. W pewnym sensie unormowaliśmy naszą próbkę przekształcając ją tak, aby w jednym i drugim przypadku wartości były równo rozłożone na odcinku [0,1] (innymi słowy rozważyliśmy tzw. rangi) a następnie zobaczyliśmy jak jedne obserwacje zależą od drugich.
Wybrane linki:
- Rozdział 3.2.3.3 w Przewodniku po pakiecie R
- http://www.sthda.com/english/wiki/correlation-matrix-a-quick-start-guide-to-analyze-format-and-visualize-a-correlation-matrix-using-r-software
- http://www.r-bloggers.com/using-r-correlation-heatmap-with-ggplot2/
- http://www.r-bloggers.com/copulas-made-easy/
- http://www.r-bloggers.com/modelling-dependence-with-copulas-in-r/
- http://www.r-bloggers.com/copula-functions-in-r/
zdażyć -> zdarzyć