forked from domokane/FinancePy
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathtest_FinCDSBasket.py
144 lines (113 loc) · 4.67 KB
/
test_FinCDSBasket.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
###############################################################################
# Copyright (C) 2018, 2019, 2020 Dominic O'Kane
###############################################################################
from helpers import build_Ibor_Curve, loadHeterogeneousSpreadCurves
from financepy.utils.date import Date
from financepy.utils.math import corr_matrix_generator
from financepy.products.credit.cds_basket import CDSBasket
from financepy.products.credit.cds_index_portfolio import CDSIndexPortfolio
import numpy as np
from os.path import dirname, join
tradeDate = Date(1, 3, 2007)
step_in_dt = tradeDate.add_days(1)
value_dt = tradeDate.add_days(1)
libor_curve = build_Ibor_Curve(tradeDate)
basketMaturity = Date(20, 12, 2011)
cdsIndex = CDSIndexPortfolio()
num_credits = 5
issuer_curves = loadHeterogeneousSpreadCurves(
value_dt, libor_curve)
issuer_curves = issuer_curves[0:num_credits]
seed = 1967
basket = CDSBasket(value_dt,
basketMaturity)
def test_inhomogeneous_curve():
intrinsicSpd = cdsIndex.intrinsic_spread(value_dt,
step_in_dt,
basketMaturity,
issuer_curves) * 10000.0
assert round(intrinsicSpd, 4) == 32.0971
totalSpd = cdsIndex.total_spread(value_dt,
step_in_dt,
basketMaturity,
issuer_curves) * 10000.0
assert round(totalSpd, 4) == 161.3169
minSpd = cdsIndex.min_spread(value_dt,
step_in_dt,
basketMaturity,
issuer_curves) * 10000.0
assert round(minSpd, 4) == 10.6722
maxSpd = cdsIndex.max_spread(value_dt,
step_in_dt,
basketMaturity,
issuer_curves) * 10000.0
assert round(maxSpd, 4) == 81.1466
def test_gaussian_copula():
num_trials = 1000
ntd = 1
beta = 0.0
rho = beta * beta
beta_vector = np.ones(num_credits) * beta
corr_matrix = corr_matrix_generator(rho, num_credits)
v1 = basket.value_gaussian_mc(value_dt,
ntd,
issuer_curves,
corr_matrix,
libor_curve,
num_trials,
seed)
v2 = basket.value_1f_gaussian_homo(value_dt,
ntd,
issuer_curves,
beta_vector,
libor_curve)
assert round(v1[2] * 10000, 4) == 151.7163
assert round(v2[3] * 10000, 4) == 160.0121
ntd = 2
beta = 0.5
rho = beta * beta
beta_vector = np.ones(num_credits) * beta
corr_matrix = corr_matrix_generator(rho, num_credits)
v1 = basket.value_gaussian_mc(value_dt,
ntd,
issuer_curves,
corr_matrix,
libor_curve,
num_trials,
seed)
v2 = basket.value_1f_gaussian_homo(value_dt,
ntd,
issuer_curves,
beta_vector,
libor_curve)
assert round(v1[2] * 10000, 4) == 15.6402
assert round(v2[3] * 10000, 4) == 16.6395
def test_student_t():
num_trials = 1000
doF = 5
ntd = 1
beta = 0.0
rho = beta * beta
corr_matrix = corr_matrix_generator(rho, num_credits)
v = basket.value_student_t_mc(value_dt,
ntd,
issuer_curves,
corr_matrix,
doF,
libor_curve,
num_trials,
seed)
assert round(v[2] * 10000, 4) == 133.6284
ntd = 2
beta = 0.5
rho = beta * beta
corr_matrix = corr_matrix_generator(rho, num_credits)
v = basket.value_student_t_mc(value_dt,
ntd,
issuer_curves,
corr_matrix,
doF,
libor_curve,
num_trials,
seed)
assert round(v[2] * 10000, 4) == 26.5991