Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
cantaro86
GitHub Repository: cantaro86/Financial-Models-Numerical-Methods
Path: blob/master/src/FMNM/probabilities.py
1700 views
1
#!/usr/bin/env python3
2
# -*- coding: utf-8 -*-
3
"""
4
Created on Mon Oct 7 18:33:39 2019
5
6
@author: cantaro86
7
"""
8
9
import numpy as np
10
from scipy.integrate import quad
11
from functools import partial
12
from FMNM.CF import cf_Heston_good
13
import scipy.special as scps
14
from math import factorial
15
16
17
def Q1(k, cf, right_lim):
18
"""
19
P(X<k) - Probability to be in the money under the stock numeraire.
20
cf: characteristic function
21
right_lim: right limit of integration
22
"""
23
24
def integrand(u):
25
return np.real((np.exp(-u * k * 1j) / (u * 1j)) * cf(u - 1j) / cf(-1.0000000000001j))
26
27
return 1 / 2 + 1 / np.pi * quad(integrand, 1e-15, right_lim, limit=2000)[0]
28
29
30
def Q2(k, cf, right_lim):
31
"""
32
P(X<k) - Probability to be in the money under the money market numeraire
33
cf: characteristic function
34
right_lim: right limit of integration
35
"""
36
37
def integrand(u):
38
return np.real(np.exp(-u * k * 1j) / (u * 1j) * cf(u))
39
40
return 1 / 2 + 1 / np.pi * quad(integrand, 1e-15, right_lim, limit=2000)[0]
41
42
43
def Gil_Pelaez_pdf(x, cf, right_lim):
44
"""
45
Gil Pelaez formula for the inversion of the characteristic function
46
INPUT
47
- x: is a number
48
- right_lim: is the right extreme of integration
49
- cf: is the characteristic function
50
OUTPUT
51
- the value of the density at x.
52
"""
53
54
def integrand(u):
55
return np.real(np.exp(-u * x * 1j) * cf(u))
56
57
return 1 / np.pi * quad(integrand, 1e-15, right_lim)[0]
58
59
60
def Heston_pdf(i, t, v0, mu, theta, sigma, kappa, rho):
61
"""
62
Heston density by Fourier inversion.
63
"""
64
cf_H_b_good = partial(
65
cf_Heston_good,
66
t=t,
67
v0=v0,
68
mu=mu,
69
theta=theta,
70
sigma=sigma,
71
kappa=kappa,
72
rho=rho,
73
)
74
return Gil_Pelaez_pdf(i, cf_H_b_good, np.inf)
75
76
77
def VG_pdf(x, T, c, theta, sigma, kappa):
78
"""
79
Variance Gamma density function
80
"""
81
return (
82
2
83
* np.exp(theta * (x - c) / sigma**2)
84
/ (kappa ** (T / kappa) * np.sqrt(2 * np.pi) * sigma * scps.gamma(T / kappa))
85
* ((x - c) ** 2 / (2 * sigma**2 / kappa + theta**2)) ** (T / (2 * kappa) - 1 / 4)
86
* scps.kv(
87
T / kappa - 1 / 2,
88
sigma ** (-2) * np.sqrt((x - c) ** 2 * (2 * sigma**2 / kappa + theta**2)),
89
)
90
)
91
92
93
def Merton_pdf(x, T, mu, sig, lam, muJ, sigJ):
94
"""
95
Merton density function
96
"""
97
tot = 0
98
for k in range(20):
99
tot += (
100
(lam * T) ** k
101
* np.exp(-((x - mu * T - k * muJ) ** 2) / (2 * (T * sig**2 + k * sigJ**2)))
102
/ (factorial(k) * np.sqrt(2 * np.pi * (sig**2 * T + k * sigJ**2)))
103
)
104
return np.exp(-lam * T) * tot
105
106
107
def NIG_pdf(x, T, c, theta, sigma, kappa):
108
"""
109
Merton density function
110
"""
111
A = theta / (sigma**2)
112
B = np.sqrt(theta**2 + sigma**2 / kappa) / sigma**2
113
C = T / np.pi * np.exp(T / kappa) * np.sqrt(theta**2 / (kappa * sigma**2) + 1 / kappa**2)
114
return (
115
C
116
* np.exp(A * (x - c * T))
117
* scps.kv(1, B * np.sqrt((x - c * T) ** 2 + T**2 * sigma**2 / kappa))
118
/ np.sqrt((x - c * T) ** 2 + T**2 * sigma**2 / kappa)
119
)
120
121