Alternatywna optymalizacja portfela

Wprowadzenie do analizy portfela w Pythonie

Charlotte Werger

Data Scientist

Oczekiwane ryzyko i zwrot na podstawie danych historycznych

$$

  • Średnie zwroty historyczne ani historyczna wariancja portfela nie są doskonałymi estymatorami mu i Sigma
  • Wagi z optymalizacji portfela nie gwarantują dobrych wyników na przyszłych danych

$$ Żart o powtarzaniu się historii

Wprowadzenie do analizy portfela w Pythonie

Dane historyczne

Dane szeregów czasowych zmieniające się w czasie

Wprowadzenie do analizy portfela w Pythonie

Wykładniczo ważone zwroty

$$

  • Potrzebne są lepsze miary ryzyka i zwrotu
  • Wykładniczo ważone miary przypisują większe znaczenie najnowszym danym
  • Wykładnicza średnia ruchoma na wykresie: największa waga dla obserwacji t-1

Wagi w obliczaniu wykładniczo ważonych zwrotów

Wprowadzenie do analizy portfela w Pythonie

Wykładniczo ważona kowariancja

$$

  • Wykładnicza macierz kowariancji: nadaje większą wagę najnowszym danym
  • Na wykresie: wykładniczo ważona zmienność (czarna) lepiej odwzorowuje rzeczywistą zmienność niż standardowa (niebieska)

$$ Porównanie wykładniczo ważonej i zwykłej kowariancji z rzeczywistą kowariancją

1 Source: https://systematicinvestor.github.io/Exponentially-Weighted-Volatility-RCPP
Wprowadzenie do analizy portfela w Pythonie

Wykładniczo ważone zwroty

from pypfopt import expected_returns
# Exponentially weighted moving average
mu_ema = expected_returns.ema_historical_return(df, 
                         span=252, frequency=252)
print(mu_ema)
symbol
XOM     0.103030
BBY     0.394629
PFE     0.186058
Wprowadzenie do analizy portfela w Pythonie

Wykładniczo ważona kowariancja

from pypfopt import risk_models
# Exponentially weighted covariance
Sigma_ew = risk_models.exp_cov(df, span=180, frequency=252)
Wprowadzenie do analizy portfela w Pythonie

Ryzyko spadkowe w optymalizacji

$ $

  • Przypomnijmy wskaźnik Sortino: używa wariancji tylko ujemnych zwrotów
  • PyPortfolioOpt pozwala stosować semicowariancję w optymalizacji — jest to miara ryzyka spadkowego:

$ $ Obliczanie ryzyka spadkowego

Wprowadzenie do analizy portfela w Pythonie

Semicowariancja w PyPortfolioOpt

Sigma_semi = risk_models.semicovariance(df,     
                        benchmark=0, frequency=252)

print(Sigma_semi)
         XOM         BBY          MA         PFE
XOM     0.018939    0.008505    0.006568    0.004058
BBY     0.008505    0.016797    0.009133    0.004404
MA      0.006568    0.009133    0.018711    0.005373
PFE     0.004058    0.004404    0.005373    0.008349
Wprowadzenie do analizy portfela w Pythonie

Czas na ćwiczenia!

Wprowadzenie do analizy portfela w Pythonie

Preparing Video For Download...