当前位置:天才代写 > Python代写,python代做代考-价格便宜,0时差服务 > 信用风险建模代写 金融建模代写 Python代写

信用风险建模代写 金融建模代写 Python代写

2021-09-11 11:55 星期六 所属: Python代写,python代做代考-价格便宜,0时差服务 浏览:484

信用风险建模代写

MIE 1622H: Assignment 3 – Credit Risk Modeling and Simulation

信用风险建模代写 The purpose of this assignment is to model a credit-risky portfolio of corporate bonds. Consider a structural model for ···

Use Python for all MIE 1622H assignments.

You should hand in:

  • Your report (a single pdf fifile, StudentID.pdf).
  • Compress all of your Python code fifiles and your report (.pdf fifile) into a fifile StudentID.zip (which can be uncompressed by 7-zip (http://www.7-zip.org) software under Windows)

Where to hand in: Online via Quercus portal, both your code and report.


Introduction   信用风险建模代写

The purpose of this assignment is to model a credit-risky portfolio of corporate bonds. Consider a structural model for portfolio credit risk described in class. Using the data for 100 counterparties, simulate 1-year losses for each corporate bond. You will need to generate 3 sets of scenarios:

  • Monte Carlo approximation 1 : 5000 in-sample scenarios (N = 1000 · 5 = 5000 (1000 systemic scenarios and 5 idiosyncratic scenarios for each systemic), non-Normal distribution of losses);
  • Monte Carlo approximation 2 : 5000 in-sample scenarios (N = 5000 (5000 systemic scenarios and 1 idiosyncratic scenario for each systemic), non-Normal distribution of losses);
  • True distribution: 100000 out-of-sample scenarios (N = 100000 (100000 systemic scenarios and 1 idiosyncratic scenario for each systemic), non-Normal distribution of losses).

The out-of-sample scenarios represent true distribution of portfolio losses. Two in-sample non-Normal datasets are used for evaluating sampling error and performing portfolio optimization (portfolio credit-risk optimization is the subject of Assignment 4).

To evaluate model error (if we wrongly assumed that counterparty losses follow Normal distri-bution), compute mean loss and standard deviation of losses for each corporate bond from the 3 scenario sets (N=1000×5, 5000, 100000). This 3 in-sample sets are referred as in-sample Normal model.

 

信用风险建模代写
信用风险建模代写

 

Evaluate VaR and CVaR at quantile levels 99% and 99.9% for the two portfolios:

(1) one unit invested in each of 100 bonds;

(2) equal value (dollar amount) is invested in each of 100 bonds;For each portfolio, compute VaR and CVaR at quantile levels 99% and 99.9% for each of the six datasets (non-Normal with N=1000×5, 5000, 100000; and Normal with mean/standard deviation computed from N=1000×5, 5000, 100000). Compare each in-sample VaR and CVaR to out-of-sample VaR and CVaR. Explain the effffects of sampling error and model error.

To better evaluate sampling and model errors, perform the experiment 100 times in the following way: generate in-sample datasets with N=1000×5 and 5000 (non-Normal and Normal) one hundred times and compute VaR and CVaR. Keep the out-of-sample scenario set unchanged. Perform analysis of the results for the 100 trials, e.g., compute averages of the results for 100 trials, analyze standard deviation over 100 trials, etc.

 

Questions   信用风险建模代写

1.(60 %) Implement portfolio credit risk simulation model in Python:

There is a fifile credit risk simul.py on the course web-page. You are required to complete the code in the fifile.

2.(25 %) Analyze your results:

  • Produce the following output from your Python code:
Portfolio 1:
Out-of-sample: VaR 99.0% = ..., CVaR 99.0% = ...
In-sample MC1: VaR 99.0% = ..., CVaR 99.0% = ...
In-sample MC2: VaR 99.0% = ..., CVaR 99.0% = ...
In-sample No: VaR 99.0% = ..., CVaR 99.0% = ...
In-sample N1: VaR 99.0% = ..., CVaR 99.0% = ...
In-sample N2: VaR 99.0% = ..., CVaR 99.0% = ...
Out-of-sample: VaR 99.9% = ..., CVaR 99.9% = ...
...
Portfolio 2:
Out-of-sample: VaR 99.0% = ..., CVaR 99.0% = ...
...
  • Plot loss distributions in Python that illustrate both out-of-sample and in-sample results. Include plots that help illustrating your analysis in the report.
  • Analyze sampling error when comparing non-Normal approximations to the true (out-of-sample) loss distribution. Analyze model error when comparing Normal approximations to the true (out-of-sample) loss distribution.

3.(15 %) Discuss possible strategies for minimizing impacts of sampling and model errors:

  • If you report the in-sample VaR and CVaR to decision-makers in your bank, what consequences for the bank capital requirements it may have?
  • Can you suggest techniques for minimizing impacts of sampling and model errors?

 

Python Code to be Completed  信用风险建模代写

 

# Import libraries
import numpy as np
import pandas as pd
import scipy
from scipy import special
from pathlib import Path

Nout = 100000 # number of out-of-sample scenarios
Nin = 5000 # number of in-sample scenarios
Ns = 5 # number of idiosyncratic scenarios for each systemic

C = 8 # number of credit states

# Read and parse instrument data
instr_data = np.array(pd.read_csv(’instrum_data.csv’, header=None))
instr_id = instr_data[:, 0] # ID
driver = instr_data[:, 1] # credit driver
beta = instr_data[:, 2] # beta (sensitivity to credit driver)
recov_rate = instr_data[:, 3] # expected recovery rate
value = instr_data[:, 4] # value
prob = instr_data[:, 5:(5 + C)] # credit-state migration probabilities (default to AAA)
exposure = instr_data[:, 5 + C:5 + 2 * C] # credit-state migration exposures (default to AAA)
retn = instr_data[:, 5 + 2 * C] # market returns

K = instr_data.shape[0] # number of CPs

# Read matrix of correlations for credit drivers
rho = np.array(pd.read_csv(’credit_driver_corr.csv’, sep=’\t’, header=None))
# Cholesky decomp of rho (for generating correlated Normal random numbers)
sqrt_rho = np.linalg.cholesky(rho)

print(’======= Credit Risk Model with Credit-State Migrations =======’)
print(’============== Monte Carlo Scenario Generation ===============’)
print(’ ’)
print(’ ’)
print(’ Number of out-of-sample Monte Carlo scenarios = ’ + str(Nout))
print(’ Number of in-sample Monte Carlo scenarios = ’ + str(Nin))
print(’ Number of counterparties = ’ + str(K))
print(’ ’)

# Find credit-state for each counterparty
# 8 = AAA, 7 = AA, 6 = A, 5 = BBB, 4 = BB, 3 = B, 2 = CCC, 1 = default
CS = np.argmax(prob, axis=1) + 1

# Account for default recoveries
exposure[:, 0] = (1 - recov_rate) * exposure[:, 0]

# Compute credit-state boundaries
CS_Bdry = scipy.special.ndtri((np.cumsum(prob[:, 0:C - 1], 1)))

# -------- Insert your code here -------- #
if Path(filename_save_out+’.npz’).is_file():
   Losses_out = scipy.sparse.load_npz(filename_save_out + ’.npz’)
else:

 # Generating Scenarios

 # -------- Insert your code here -------- #

 for s in range(1, Nout + 1):

    # -------- Insert your code here -------- #

    # Calculated out-of-sample losses (100000 x 100)
    # Losses_out (sparse matrix)

    Losses_out = #...

# Normal approximation computed from out-of-sample scenarios
mu_l = np.mean(Losses_out, axis=0).reshape((K))
var_l = np.cov(Losses_out.toarray(), rowvar=False) # Losses_out as a sparse matrix

# Compute portfolio weights
portf_v = sum(value) # portfolio value
w0 = []
w0.append(value / portf_v) # asset weights (portfolio 1)
w0.append(np.ones((K)) / K) # asset weights (portfolio 2)
x0 = []
x0.append((portf_v / value) * w0[0]) # asset units (portfolio 1)
x0.append((portf_v / value) * w0[1]) # asset units (portfolio 2)

# Quantile levels (99%, 99.9%)
alphas = np.array([0.99, 0.999])

VaRout = np.zeros((2, alphas.size))
VaRinN = np.zeros((2, alphas.size))
CVaRout = np.zeros((2, alphas.size))
CVaRinN = np.zeros((2, alphas.size))

for portN in range(2):
    # Compute VaR and CVaR
    for q in range(alphas.size):
        alf = alphas[q]
        # -------- Insert your code here -------- #

        VaRout[portN, q] = #...
        VaRinN[portN, q] = #...
        CVaRout[portN, q] = #...
        CVaRinN[portN, q] = #...

# Perform 100 trials
N_trials = 100

VaRinMC1 = {}
VaRinMC2 = {}
VaRinN1 = {}
VaRinN2 = {}
CVaRinMC1 = {}
CVaRinMC2 = {}
CVaRinN1 = {}
CVaRinN2 = {}

for portN in range(2):
    for q in range(alphas.size):

VaRinMC1[portN, q] = np.zeros(N_trials)
VaRinMC2[portN, q] = np.zeros(N_trials)
VaRinN1[portN, q] = np.zeros(N_trials)
VaRinN2[portN, q] = np.zeros(N_trials)
CVaRinMC1[portN, q] = np.zeros(N_trials)
CVaRinMC2[portN, q] = np.zeros(N_trials)
CVaRinN1[portN, q] = np.zeros(N_trials)
CVaRinN2[portN, q] = np.zeros(N_trials)

for tr in range(1, N_trials + 1):
    # Monte Carlo approximation 1
 
    # -------- Insert your code here -------- #

    for s in range(1, np.int(np.ceil(Nin / Ns) + 1)): # systemic scenarios
        # -------- Insert your code here -------- #

        for si in range(1, Ns + 1): # idiosyncratic scenarios for each systemic
            # -------- Insert your code here -------- #

     # Calculate losses for MC1 approximation (5000 x 100)
 
     # Losses_inMC1
 
     # Monte Carlo approximation 2

     # -------- Insert your code here -------- #

for s in range(1, Nin + 1): # systemic scenarios (1 idiosyncratic scenario for each systemic)
    # -------- Insert your code here -------- #

# Calculated losses for MC2 approximation (5000 x 100)
# Losses_inMC2

# Compute VaR and CVaR

  for portN in range(2):
      for q in range(alphas.size):
      alf = alphas[q]
      # -------- Insert your code here -------- #
      # Compute portfolio loss
      portf_loss_inMC1 = #...
      portf_loss_inMC2 = #...
      mu_MC1 = np.mean(Losses_inMC1, axis=0).reshape((K))
      var_MC1 = np.cov(Losses_inMC1.toarray(), rowvar=False)
      mu_MC2 = np.mean(Losses_inMC2, axis=0).reshape((K))
      var_MC2 = np.cov(Losses_inMC2.toarray(), rowvar=False)
      # Compute portfolio mean loss mu_p_MC1 and portfolio standard        deviation of losses sigma_p_MC1
      # Compute portfolio mean loss mu_p_MC2 and portfolio standard deviation of losses sigma_p_MC2
      # Compute VaR and CVaR for the current trial
      mu_p_MC1 = #...
      sigma_p_MC1 = #...
      mu_p_MC2 = #...
      sigma_p_MC2 = #...
      VaRinMC1[portN, q][tr - 1] = #...
      VaRinMC2[portN, q][tr - 1] = #...
      VaRinN1[portN, q][tr - 1] = #...
      VaRinN2[portN, q][tr - 1] = #...
      CVaRinMC1[portN, q][tr - 1] = #...
      CVaRinMC2[portN, q][tr - 1] = #...
      CVaRinN1[portN, q][tr - 1] = #...
      CVaRinN2[portN, q][tr - 1] = #...

# Display VaR and CVaR

  for portN in range(2):
      print(’\nPortfolio {}:\n’.format(portN + 1))
      for q in range(alphas.size):
          alf = alphas[q]
          print(’Out-of-sample: VaR %4.1f%% = $%6.2f, CVaR %4.1f%% = $%6.2f’ % (
          100 * alf, VaRout[portN, q], 100 * alf, CVaRout[portN, q]))
          print(’In-sample MC1: VaR %4.1f%% = $%6.2f, CVaR %4.1f%% = $%6.2f’ % (
          100 * alf, np.mean(VaRinMC1[portN, q]), 100 * alf, np.mean(CVaRinMC1[portN, q])))
          print(’In-sample MC2: VaR %4.1f%% = $%6.2f, CVaR %4.1f%% = $%6.2f’ % (
          100 * alf, np.mean(VaRinMC2[portN, q]), 100 * alf, np.mean(CVaRinMC2[portN, q])))
          print(’In-sample No: VaR %4.1f%% = $%6.2f, CVaR %4.1f%% = $%6.2f’ % (
          100 * alf, VaRinN[portN, q], 100 * alf, CVaRinN[portN, q]))
print(’In-sample N1: VaR %4.1f%% = $%6.2f, CVaR %4.1f%% = $%6.2f’ % (
          100 * alf, np.mean(VaRinN1[portN, q]), 100 * alf, np.mean(CVaRinN1[portN, q])))
          print(’In-sample N2: VaR %4.1f%% = $%6.2f, CVaR %4.1f%% = $%6.2f\n’ % (
          100 * alf, np.mean(VaRinN2[portN, q]), 100 * alf, np.mean(CVaRinN2[portN, q])))

# Plot results
# Figure (1):
# -------- Insert your code here -------- #
# Figure (2):
# -------- Insert your code here -------- #

 

信用风险建模代写
信用风险建模代写

 

其他代写:program代写 project代写 北美作业代写 java代写 matlab代写 finance代写 assignment代写 加拿大代写 python代写 report代写 paper代写 essay作业代写 作业代写 英国代写 homework代写

合作平台:essay代写 论文代写 写手招聘 英国留学生代写

 

天才代写-代写联系方式