Welcome!

Quantitative Risk Management in Python

Dr. Jamsheed Shorish

Computational Economist

About Me

  • Computational Economist
  • Specializing in:
    • asset pricing
    • financial technologies ("FinTech")
    • computer applications to economics and finance
  • Co-instructor, "Economic Analysis of the Digital Economy" at the ANU
  • Shorish Research (Belgium): computational business applications
Quantitative Risk Management in Python

What is Quantitative Risk Management?

  • Quantitative Risk Management: Study of quantifiable uncertainty
  • Uncertainty:
    • Future outcomes are unknown
    • Outcomes impact planning decisions
  • Risk management: mitigate (reduce effects of) adverse outcomes
  • Quantifiable uncertainty: identify factors to measure risk
    • Example: Fire insurance. What factors make fire more likely?
  • This course: focus upon risk associated with a financial portfolio
Quantitative Risk Management in Python

Risk management and the Global Financial Crisis

  • Great Recession (2007 - 2010)
    • Global growth loss more than $2 trillion
    • United States: nearly $10 trillion lost in household wealth
    • U.S. stock markets lost c. $8 trillion in value
  • Global Financial Crisis (2007-2009)
    • Large-scale changes in fundamental asset values
    • Massive uncertainty about future returns
    • High asset returns volatility
    • Risk management critical to success or failure
Quantitative Risk Management in Python

Quick recap: financial portfolios

  • Financial portfolio
    • Collection of assets with uncertain future returns
    • Stocks
    • Bonds
    • Foreign exchange holdings ('forex')
    • Stock options
  • Challenge: quantify risk to manage uncertainty
    • Make optimal investment decisions
    • Maximize portfolio return, conditional on risk appetite
Quantitative Risk Management in Python

Quantifying return

  • Portfolio return: weighted sum of individual asset returns
    • Pandas data analysis library
    • DataFrame prices
    • .pct_change() method
    • .dot() method of returns
prices = pandas.read_csv("portfolio.csv")

returns = prices.pct_change()
weights = (weight_1, weight_2, ...)
portfolio_returns = returns.dot(weights)
Quantitative Risk Management in Python

Quantifying risk

  • Portfolio return volatility = risk
  • Calculate volatility via covariance matrix
  • Use .cov() DataFrame method of returns and annualize

 

 

covariance = returns.cov()*252

print(covariance)

Example covariance matrix between 4 assets

Quantitative Risk Management in Python

Quantifying risk

  • Portfolio return volatility = risk
  • Calculate volatility via covariance matrix
  • Use .cov() DataFrame method of returns and annualize
  • Diagonal of covariance is individual asset variances  

   

covariance = returns.cov()*252

print(covariance)

Example covariance matrix with variance highlighted on the diagonal

Quantitative Risk Management in Python

Quantifying risk

  • Portfolio return volatility = risk
  • Calculate volatility via covariance matrix
  • Use .cov() DataFrame method of returns and annualize
  • Diagonal of covariance is individual asset variances
  • Off-diagonals of covariance are covariances between assets
covariance = returns.cov()*252

print(covariance)

Example covariance matrix with covariances highlighted on the off-diagonals

Quantitative Risk Management in Python

Portfolio risk

  • Depends upon asset weights in portfolio
  • Portfolio variance $\sigma_p^2$ is $$ \sigma_p^2 := w^T \cdot \textnormal{Cov}_p \cdot w $$
  • Matrix multiplication can be computed using @ operator in Python
  • Standard deviation is usually used instead of variance
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)
Quantitative Risk Management in Python

Volatility time series

  • Can also calculate portfolio volatility over time
  • Use a 'window' to compute volatility over a fixed time period (e.g. week, 30-day 'month')
  • Series.rolling() creates a window
  • Observe volatility trend and possible extreme events
windowed = portfolio_returns.rolling(30)

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

30-day rolling window plot of annualized return volatility

Quantitative Risk Management in Python

Let's practice!

Quantitative Risk Management in Python

Preparing Video For Download...