-
Notifications
You must be signed in to change notification settings - Fork 0
/
CIR_zcb_valuation_gen.py
81 lines (67 loc) · 1.86 KB
/
CIR_zcb_valuation_gen.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
#
# Valuation of Zero-Coupon Bonds
# in Cox-Ingersoll-Ross (1985) Model
# 09_gmm/CIR_zcb_valuation_gen.py
#
# (c) Dr. Yves J. Hilpisch
# Derivatives Analytics with Python
#
import numpy as np
#
# Example Parameters CIR85 Model
#
r0, kappa_r, theta_r, sigma_r, t, T = 0.04, 0.3, 0.04, 0.1, 0.5, 5.0
#
# Zero-Coupon Bond Valuation Formula
#
def gamma(kappa_r, sigma_r):
''' Help Function. '''
return np.sqrt(kappa_r ** 2 + 2 * sigma_r ** 2)
def b1(alpha):
''' Help Function. '''
r0, kappa_r, theta_r, sigma_r, t, T = alpha
g = gamma(kappa_r, sigma_r)
return (((2 * g * np.exp((kappa_r + g) * (T - t) / 2)) /
(2 * g + (kappa_r + g) * (np.exp(g * (T - t)) - 1))) **
(2 * kappa_r * theta_r / sigma_r ** 2))
def b2(alpha):
''' Help Function. '''
r0, kappa_r, theta_r, sigma_r, t, T = alpha
g = gamma(kappa_r, sigma_r)
return ((2 * (np.exp(g * (T - t)) - 1)) /
(2 * g + (kappa_r + g) * (np.exp(g * (T - t)) - 1)))
def B(alpha):
''' Function to value unit zero-coupon bonds in CIR85 Model.
Parameters
==========
r0: float
initial short rate
kappa_r: float
mean-reversion factor
theta_r: float
long-run mean of short rate
sigma_r: float
volatility of short rate
t: float
valuation date
T: float
time horizon/interval
Returns
=======
zcb_value: float
value of zero-coupon bond
'''
b_1 = b1(alpha)
b_2 = b2(alpha)
r0, kappa_r, theta_r, sigma_r, t, T = alpha
# expected value of r_t
E_rt = theta_r + np.exp(-kappa_r * t) * (r0 - theta_r)
zcb_value = b_1 * np.exp(-b_2 * E_rt)
return zcb_value
if __name__ == '__main__':
#
# Example Valuation
#
# discount factor, ZCB value for t & T
BtT = B([r0, kappa_r, theta_r, sigma_r, t, T])
print("ZCB Value %10.4f" % BtT)