Witamy!

Ilościowe zarządzanie ryzykiem w Pythonie

Dr. Jamsheed Shorish

Computational Economist

O mnie

  • Ekonomista obliczeniowy
  • Specjalizacja:
    • wycena aktywów
    • technologie finansowe ("FinTech")
    • zastosowania informatyki w ekonomii i finansach
  • Współprowadzący kurs "Economic Analysis of the Digital Economy" na ANU
  • Shorish Research (Belgia): biznesowe aplikacje obliczeniowe
Ilościowe zarządzanie ryzykiem w Pythonie

Czym jest ilościowe zarządzanie ryzykiem?

  • Ilościowe zarządzanie ryzykiem: badanie kwantyfikowalnej niepewności
  • Niepewność:
    • Przyszłe wyniki są nieznane
    • Wyniki wpływają na decyzje planistyczne
  • Zarządzanie ryzykiem: ograniczanie skutków niekorzystnych zdarzeń
  • Kwantyfikowalna niepewność: identyfikacja czynników do pomiaru ryzyka
    • Przykład: Ubezpieczenie od ognia. Co zwiększa ryzyko pożaru?
  • Ten kurs: ryzyko związane z portfelem finansowym
Ilościowe zarządzanie ryzykiem w Pythonie

Zarządzanie ryzykiem a globalny kryzys finansowy

  • Wielka Recesja (2007–2010)
    • Globalne straty wzrostu ponad 2 biliony USD
    • USA: prawie 10 bilionów USD utraconych w majątku gospodarstw domowych
    • Giełdy w USA straciły ok. 8 bilionów USD wartości
  • Globalny Kryzys Finansowy (2007–2009)
    • Duże zmiany fundamentalnych wartości aktywów
    • Ogromna niepewność co do przyszłych zwrotów
    • Wysoka zmienność zwrotów z aktywów
    • Zarządzanie ryzykiem kluczowe dla sukcesu lub porażki
Ilościowe zarządzanie ryzykiem w Pythonie

Przypomnienie: portfele finansowe

  • Portfel finansowy
    • Zbiór aktywów o niepewnych przyszłych zwrotach
    • Akcje
    • Obligacje
    • Waluty obce (forex)
    • Opcje na akcje
  • Wyzwanie: kwantyfikacja ryzyka dla zarządzania niepewnością
    • Podejmowanie optymalnych decyzji inwestycyjnych
    • Maksymalizacja zwrotu portfela przy danym apetycie na ryzyko
Ilościowe zarządzanie ryzykiem w Pythonie

Kwantyfikacja zwrotu

  • Zwrot portfela: ważona suma zwrotów poszczególnych aktywów
    • Biblioteka Pandas do analizy danych
    • DataFrame prices
    • Metoda .pct_change()
    • Metoda .dot() dla returns
prices = pandas.read_csv("portfolio.csv")

returns = prices.pct_change()
weights = (weight_1, weight_2, ...)
portfolio_returns = returns.dot(weights)
Ilościowe zarządzanie ryzykiem w Pythonie

Kwantyfikacja ryzyka

  • Zmienność zwrotu portfela = ryzyko
  • Obliczanie zmienności przez macierz kowariancji
  • Metoda .cov() DataFrame returns, annualizacja

 

 

covariance = returns.cov()*252

print(covariance)

Przykładowa macierz kowariancji dla 4 aktywów

Ilościowe zarządzanie ryzykiem w Pythonie

Kwantyfikacja ryzyka

  • Zmienność zwrotu portfela = ryzyko
  • Obliczanie zmienności przez macierz kowariancji
  • Metoda .cov() DataFrame returns, annualizacja
  • Przekątna covariance to wariancje poszczególnych aktywów  

   

covariance = returns.cov()*252

print(covariance)

Macierz kowariancji z zaznaczonymi wariancjami na przekątnej

Ilościowe zarządzanie ryzykiem w Pythonie

Kwantyfikacja ryzyka

  • Zmienność zwrotu portfela = ryzyko
  • Obliczanie zmienności przez macierz kowariancji
  • Metoda .cov() DataFrame returns, annualizacja
  • Przekątna covariance to wariancje poszczególnych aktywów
  • Elementy pozaprzekątniowe covariance to kowariancje między aktywami
covariance = returns.cov()*252

print(covariance)

Macierz kowariancji z zaznaczonymi kowariancjami poza przekątną

Ilościowe zarządzanie ryzykiem w Pythonie

Ryzyko portfela

  • Zależy od weights aktywów w portfelu
  • Wariancja portfela $\sigma_p^2$ wynosi $$ \sigma_p^2 := w^T \cdot \textnormal{Cov}_p \cdot w $$
  • Mnożenie macierzy za pomocą operatora @ w Pythonie
  • Zazwyczaj stosuje się odchylenie standardowe zamiast wariancji
weights = [0.25, 0.25, 0.25, 0.25] # Assumes four assets in portfolio

portfolio_variance = np.transpose(weights) @ covariance @ weights
portfolio_volatility = np.sqrt(portfolio_variance)
Ilościowe zarządzanie ryzykiem w Pythonie

Szereg czasowy zmienności

  • Możliwość obliczania zmienności portfela w czasie
  • Okno czasowe do obliczania zmienności w stałym okresie (np. tydzień, 30-dniowy „miesiąc")
  • Series.rolling() tworzy okno
  • Obserwacja trendu zmienności i możliwych zdarzeń ekstremalnych
windowed = portfolio_returns.rolling(30)

volatility = windowed.std()*np.sqrt(252) volatility.plot() .set_ylabel("Standard Deviation...")

30-dniowy wykres kroczący annualizowanej zmienności zwrotów

Ilościowe zarządzanie ryzykiem w Pythonie

Czas na ćwiczenia!

Ilościowe zarządzanie ryzykiem w Pythonie

Preparing Video For Download...