[R + finanse]: Jak przedstawiać zależność między zmiennymi losowymi? (3)

Marcin Pitera

Dzisiaj bardziej ogólnostatystyczny wpis, choć nie bez znaczenia dla matematyki finansowej.

Załóżmy, iż mamy dany n-wymiarowy wektor losowy X=(X_1,\ldots, X_n) i chcemy opisać (czy zobrazować) zależność między zmiennymi brzegowymi, tzn. zmiennymi losowymi X_1, \ldots, X_n. 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 n\times n 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 n\times n, 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

H(x_1,\ldots,x_n)=P[X_1\leq x_1,\ldots,X_n\leq x_n]

oraz jednowymiarowe dystrybuanty brzegowe

F(x_1)=P[X_1\leq x_1], \ldots, F(x_n)=P[X_n\leq x_n].

Ponieważ funkcje F_1, \ldots, F_n 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ść

H(x_1,\ldots,x_n)=C\left(F_1(x_1),\ldots,F_n(x_n)\right)

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 \rho-Spearmana w R liczy się bardzo prosto:

cor(returns)
cor(returns,method="spearman")

Screen Shot 2016-01-10 at 21.58.50 PM

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 \rho-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"])

Screen Shot 2016-01-10 at 22.02.09 PM

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

obrazek1

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)

obrazek2

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)

obrazek3

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:

One thought on “[R + finanse]: Jak przedstawiać zależność między zmiennymi losowymi? (3)”

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *