Market Risk Measurement

An in-depth guide on various market risk measurement metrics including VaR, CVaR, Beta, and Drawdowns.

TL; DR

  • Value-at-Risk (VaR) and Conditional VaR (CVaR) are metrics used to estimate potential losses in financial portfolios.

  • VaR can be calculated using parametric (assuming normal distribution) or historical methods, while CVaR uses historical data to assess the average loss beyond the VaR threshold.

  • Beta measures a portfolio's sensitivity to market movements and is calculated using covariance and variance over a rolling period.

  • Drawdown metrics such as LDD, LTuW, and MDD provide insights into the depth and duration of losses, which can inform risk management and model evaluation strategies.


Tail Risk

Value-at-Risk (VaR)

QUANTIT VaR (1-day 95%)

  • Interpretation: There is an expectation that a daily loss of this magnitude could occur 2-3 times per year.

  • This approach combines 50% Parametric VaR and 50% Historical VaR to correct for the Fat Tail issue inherent in Normal Distribution, using a mixture of Norm idea.

QUANTIT CVaR (1-day 95%)

  • Interpretation: There is an expectation that a daily loss greater than this value could occur 2-3 times per year.

  • The Conditional VaR is calculated using 100% Historical CVaR.

Parametric VaR

  • Assumption: Normal distribution.

  • Return Length: Rolling 252 Trading Days.

  • Calculation: Parametric VaR = 1-day stddev * Z-score.

Python Code for Parametric VaR
from scipy.stats import norm
Value_at_Risk = pd.Series(index=Returns.index, name='ParVaR')
for i in range(0, len(Returns) - Period_Interval):
    if i == 0:
        Data = Returns[-(Period_Interval):]
    else:
        Data = Returns[-(Period_Interval + i):-i]
    stdev = np.std(Data)
    Value_at_Risk[-i - 1] = stdev * norm.ppf(Confidence_Interval)

Historical VaR

  • Assumption: Estimation from historical data. Non-Parametric.

  • Return Length: Rolling 252 Trading Days.

  • Calculation: Historical VaR = 95% Percentile of PnL Series.

Python Code for Historical VaR
Value_at_Risk = pd.Series(index=Returns.index, name='HSVaR')
for i in range(0, len(Returns) - Period_Interval):
    if i == 0:
        Data = Returns[-(Period_Interval):]
    else:
        Data = Returns[-(Period_Interval + i):-i]
    Value_at_Risk[-i - 1] = -np.percentile(Data, 1 - Confidence_Interval)

Conditional VaR (CVaR)

  • Assumption: Estimation from Historical Data.

  • Return Length: Rolling 252 Trading Days.

  • Calculation: CVaR = Average of values that are above 95% of left tail of PnL series.

Other VaR Measures
  • Volatility-adjusted VaR (Morgan Stanley Market Risk Management): Adjusts VaR based on current market volatility, using a rolling 60-day EWMA with a factor of 0.95.

  • Stressed VaR (Morgan Stanley Market Risk Management): Evaluates how severe VaR can get over time, using a rolling 252 trading days starting from a stressed period.

Sensitivity

Beta

  • Beta (ACWI): Calculated as the Covariance between 6 Month Returns of Account and Returns of ACWI divided by the Variance of 6 Month Return of ACWI.

  • Beta (K200): Similar to Beta (ACWI) but with Returns of K200.

  • These values are rolled over a 120 Trading Day period.

Loss

Local Drawdown (LDD)

  • Calculation: LDD = min(0, current day's Drawdown).

  • Interpretation: By looking at the average data and distribution of Time under Water (TuW), it is possible to estimate how long one might have to wait to return to profitability after a drawdown occurs.

Local Time under Water (LTuW)

  • Calculation: LTuW = min(0, count of days since the most recent drawdown began).

Maximum Drawdown (MDD)

  • Calculation: MDD = min(drawdown path).

  • Interpretation: If the MDD increases over time, it may indicate a regime change or that the model is fitting to noise, suggesting a need to consider upgrading the model or halting operations.

Last updated