forked from redbzi/NM-Heston
/
solver.py
executable file
·132 lines (108 loc) · 5.43 KB
/
solver.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
from scipy.sparse.linalg import inv
from datetime import datetime
from scipy.sparse import csc_matrix
import numpy as np
from math import exp
def F(n, omega, A, b, r_f, delta_t):
return A * omega + b * exp(r_f * delta_t * n)
def F_0(n, omega, A_0, b_0, r_f, delta_t):
return A_0 * omega + b_0 * exp(r_f * delta_t * n)
def F_1(n, omega, A_1, b_1, r_f, delta_t):
return A_1 * omega + b_1 * exp(r_f * delta_t * n)
def F_2(n, omega, A_2, b_2, r_f, delta_t):
return A_2 * omega + b_2 * exp(r_f * delta_t * n)
def CN_scheme(m, N, U_0, delta_t, A, b, r_f):
start = datetime.now()
U = U_0
I = np.identity(m)
lhs = csc_matrix(I - 0.5 * delta_t * A)
inv_lhs = inv(lhs)
for n in range(1, N + 1):
U = inv_lhs * (U + 0.5 * delta_t * (F(n - 1, U, A, b, r_f, delta_t) + b * exp(r_f * delta_t * n)))
end = datetime.now()
time = (end - start).total_seconds()
return U, time
def DO_scheme(m, N, U_0, delta_t, theta, A, A_0, A_1, A_2, b, b_0, b_1, b_2, r_f):
start = datetime.now()
U = U_0
I = np.identity(m)
lhs_1 = csc_matrix(I - theta * delta_t * A_1)
inv_lhs_1 = inv(lhs_1)
lhs_2 = csc_matrix(I - theta * delta_t * A_2)
inv_lhs_2 = inv(lhs_2)
for n in range(1, N + 1):
Y_0 = U + delta_t * F(n - 1, U, A, b, r_f, delta_t)
rhs_1 = Y_0 + theta * delta_t * (b_1 * exp(r_f * delta_t * n) - F_1(n - 1, U, A_1, b_1, r_f, delta_t)) #we update b_1
Y_1 = inv_lhs_1 * rhs_1
rhs_2 = Y_1 + theta * delta_t * (b_2 * exp(r_f * delta_t * n) - F_2(n - 1, U, A_2, b_2, r_f, delta_t)) #we update b_2
U = inv_lhs_2 * rhs_2
end = datetime.now()
time = (end - start).total_seconds()
return U, time
def CS_scheme(m, N, U_0, delta_t, theta, A, A_0, A_1, A_2, b, b_0, b_1, b_2, r_f):
start = datetime.now()
U = U_0
I = np.identity(m)
lhs_1 = csc_matrix(I - theta * delta_t * A_1)
inv_lhs_1 = inv(lhs_1)
lhs_2 = csc_matrix(I - theta * delta_t * A_2)
inv_lhs_2 = inv(lhs_2)
for n in range(0, N):
Y_0 = U + delta_t * F(n - 1, U, A, b, r_f, delta_t)
rhs_1 = Y_0 + theta * delta_t * (b_1 * exp(r_f * delta_t * n) - F_1(n - 1, U, A_1, b_1, r_f, delta_t)) #we update b_1
Y_1 = inv_lhs_1 * rhs_1
rhs_2 = Y_1 + theta * delta_t * (b_2 * exp(r_f * delta_t * n) - F_2(n - 1, U, A_2, b_2, r_f, delta_t)) #we update b_2
Y_2 = inv_lhs_2 * rhs_2
Y_0_tilde = Y_0 + 0.5 * delta_t * (F_0(n, Y_2, A_0, b_0, r_f, delta_t) - F_0(n - 1, U, A_0, b_0, r_f, delta_t))
rhs_1 = Y_0_tilde + theta * delta_t * (b_1 * exp(r_f * delta_t * n) - F_1(n - 1, U, A_1, b_1, r_f, delta_t)) #we update b_1
Y_1_tilde = inv_lhs_1 * rhs_1
rhs_2 = Y_1_tilde + theta * delta_t * (b_2 * exp(r_f * delta_t * n) - F_2(n - 1, U, A_2, b_2, r_f, delta_t)) #we update b_2
U = inv_lhs_2 * rhs_2
end = datetime.now()
time = (end - start).total_seconds()
return U, time
def MCS_scheme(m, N, U_0, delta_t, theta, A, A_0, A_1, A_2, b, b_0, b_1, b_2, r_f):
start = datetime.now()
U = U_0
I = np.identity(m)
lhs_1 = csc_matrix(I - theta * delta_t * A_1)
inv_lhs_1 = inv(lhs_1)
lhs_2 = csc_matrix(I - theta * delta_t * A_2)
inv_lhs_2 = inv(lhs_2)
for n in range(0, N):
Y_0 = U + delta_t * F(n - 1, U, A, b, r_f, delta_t)
rhs_1 = Y_0 + theta * delta_t * (b_1 * exp(r_f * delta_t * n) - F_1(n - 1, U, A_1, b_1, r_f, delta_t)) #we update b_1
Y_1 = inv_lhs_1 * rhs_1
rhs_2 = Y_1 + theta * delta_t * (b_2 * exp(r_f * delta_t * n) - F_2(n - 1, U, A_2, b_2, r_f, delta_t)) #we update b_2
Y_2 = inv_lhs_2 * rhs_2
Y_0_hat = Y_0 + theta * delta_t * (F_0(n, Y_2, A_0, b_0, r_f, delta_t) - F_0(n - 1, U, A_0, b_0, r_f, delta_t))
Y_0_tilde = Y_0_hat + (0.5 - theta) * delta_t * (F(n, Y_2, A, b, r_f, delta_t) - F(n - 1, U, A, b, r_f, delta_t))
rhs_1 = Y_0_tilde + theta * delta_t * (b_1 * exp(r_f * delta_t * n) - F_1(n - 1, U, A_1, b_1, r_f, delta_t)) #we update b_1
Y_1_tilde = inv_lhs_1 * rhs_1
rhs_2 = Y_1_tilde + theta * delta_t * (b_2 * exp(r_f * delta_t * n) - F_2(n - 1, U, A_2, b_2, r_f, delta_t)) #we update b_2
U = inv_lhs_2 * rhs_2
end = datetime.now()
time = (end - start).total_seconds()
return U, time
def HV_scheme(m, N, U_0, delta_t, theta, A, A_0, A_1, A_2, b, b_0, b_1, b_2, r_f):
start = datetime.now()
U = U_0
I = np.identity(m)
lhs_1 = csc_matrix(I - theta * delta_t * A_1)
inv_lhs_1 = inv(lhs_1)
lhs_2 = csc_matrix(I - theta * delta_t * A_2)
inv_lhs_2 = inv(lhs_2)
for n in range(0, N):
Y_0 = U + delta_t * F(n - 1, U, A, b, r_f, delta_t)
rhs_1 = Y_0 + theta * delta_t * (b_1 * exp(r_f * delta_t * n) - F_1(n - 1, U, A_1, b_1, r_f, delta_t)) #we update b_1
Y_1 = inv_lhs_1 * rhs_1
rhs_2 = Y_1 + theta * delta_t * (b_2 * exp(r_f * delta_t * n) - F_2(n - 1, U, A_2, b_2, r_f, delta_t)) #we update b_2
Y_2 = inv_lhs_2 * rhs_2
Y_0_tilde = Y_0 + 0.5 * delta_t * (F(n, Y_2, A, b, r_f, delta_t) - F(n - 1, U, A, b, r_f, delta_t))
rhs_1 = Y_0_tilde + theta * delta_t * (b_1 * exp(r_f * delta_t * n) - F_1(n, Y_2, A_1, b_1, r_f, delta_t)) #we update b_1
Y_1_tilde = inv_lhs_1 * rhs_1
rhs_2 = Y_1_tilde + theta * delta_t * (b_2 * exp(r_f * delta_t * n) - F_2(n, Y_2, A_2, b_2, r_f, delta_t)) #we update b_2
U = inv_lhs_2 * rhs_2
end = datetime.now()
time = (end - start).total_seconds()
return U, time