Coding towards CFA (34) – The Parametric Method of VaR Estimation

Coding towards CFA (34) – The Parametric Method of VaR Estimation

*More articles can be found from my blog site - https://dataninjago.com

In the previous blog post, we explored the?Historical Method of VaR Estimation. The historical method is simple and intuitive; however, it relies on the assumption that financial markets will repeat historical patterns, disregarding structural changes in market conditions. This limitation makes the historical method less practical in real-world scenarios. In this blog post, I will discuss the?Parametric Method, which is more widely used in practice.

The?Parametric Method?is also intuitive to understand. It assumes that portfolio returns follow a specific distribution, typically the?normal distribution. Based on this assumption, the VaR value at a given confidence level can be determined using the critical value corresponding to that confidence level.

Therefore, as long as we can determine the?mean?and?standard deviation?of the portfolio returns distribution, we can easily calculate the VaR for a given confidence level, as represented by the following formula:

The symbol?μ?represents the mean of the expected portfolio returns, while?σ?denotes the standard deviation, which measures the volatility of the portfolio returns.??is the z-score corresponding to the given confidence level. For example:

  • 84% confidence level => Za = 1
  • 95% confidence level => Za = 1.645
  • 99% confidence level => Za = 2.326

With these three parameters and using the formula above, we can calculate the VaR value. For example, the?5% VaR?can be determined by identifying the point on the distribution that lies?1.65 standard deviations?to the left of the mean.

Here is the Python code I created for based on the formula above.

Here is the code for defining the sample portfolio and generating the sample returns data.

Since??is given, the main task is to calculate the?mean?and?volatility?of the expected portfolio returns. The mean of the portfolio returns is straightforward to compute: we can calculate the portfolio returns by multiplying the return of each asset by its weight in the portfolio and then applying the mean function.

The calculation of portfolio volatility must take into account the?correlation between assets?within the portfolio. In the CFA curriculum, the calculation of volatility is typically limited to portfolios containing only?two assets?to simplify calculations for exam purposes.

However, in practice, a portfolio typically contains?many more assets. Therefore, we want our code to support the calculation of portfolios with?any number of assets. To achieve this, we can use the?covariance matrix, which is derived from the portfolio returns, to calculate the portfolio volatility using the following formula:

here is the code implementation.

Now, that’s all the code needed for estimating VaR using the?parametric method. We can further visualize the?portfolio return distribution?and?VaR value?using?pyplot.

Full Code – Python

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from scipy.stats import norm
 
# calculate portfolio reutrns and volilatily for each historical days
def calculate_portfolio_returns_vols(positions, returns):
 
    # Extract position weights and symbols 
    symbols = [p['symbol'] for p in positions]
    weights = np.array([p['weight'] for p in positions])
 
    # Calculate the covariance matrix of asset returns
    cov_matrix = returns[symbols].cov()
 
    # Calculate portfolio returns
    portfolio_returns = returns[symbols].dot(weights)
 
    # Calculate portfolio volatility
    portfolio_volatility = np.sqrt(weights.T @ cov_matrix @ weights)
 
    return portfolio_returns, portfolio_volatility
 
 
# Calculate VaR using Parametric method
def calculate_var(positions, returns, confidence_level):
 
    # calculate portfolio reutrns and volilatily for each historical days
    portfolio_returns, portfolio_volatility = calculate_portfolio_returns_vols(positions, returns)
 
    # Calculate mean and std of portfolio returns
    mean_portfolio_return = portfolio_returns.mean()
 
    # Calculate Z-score for the confidence level
    z_score = norm.ppf(1 - confidence_level)
 
    # Calculate VaR using the parametric formula
    var = mean_portfolio_return + z_score * portfolio_volatility
 
    return var, portfolio_returns, portfolio_volatility
 
 
# Define the sample portfolio
positions = [
    {'symbol': 'MSFT', 'weight': 0.5},
    {'symbol': 'TSLA', 'weight': 0.25},
    {'symbol': 'BABA', 'weight': 0.25}
]
 
# Generate sample data for each asset
returns = pd.DataFrame({
    'MSFT': np.random.normal(0.005, 0.02, 100),
    'TSLA': np.random.normal(0.01, 0.005, 100),
    'BABA': np.random.normal(0.015, 0.02, 100)
})
 
var, portfolio_returns, portfolio_vol = calculate_var(positions, returns,
                                                       confidence_level=0.95)
 
plt.figure(figsize=(10, 8))
plt.hist(portfolio_returns, bins=50, density=True, alpha=0.5, color='blue', label='Returns')
x = np.linspace(portfolio_returns.min(), portfolio_returns.max(), 1000)
plt.plot(x, norm.pdf(x, portfolio_returns.mean(), portfolio_returns.std()), 
                                                'r-', label='Normal Distribution')
plt.axvline(x=var, color='darkred', linewidth=4, linestyle='--', 
                                                label=f'VaR at {0.95*100}% Confidence')
plt.axvline(x=portfolio_returns.mean(), color='orange', 
                                                linewidth=4, linestyle='--', label=f'Mean')
plt.title('VaR Estimation with Parametric Method')
plt.xlabel('Returns')
plt.ylabel('Density')
plt.legend()
plt.grid(False)
plt.show()        

要查看或添加评论,请登录

Linxiao Ma的更多文章

社区洞察

其他会员也浏览了