Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
cantaro86
GitHub Repository: cantaro86/Financial-Models-Numerical-Methods
Path: blob/master/src/FMNM/CF.py
1700 views
1
#!/usr/bin/env python3
2
# -*- coding: utf-8 -*-
3
"""
4
Created on Mon Oct 7 17:57:19 2019
5
6
@author: cantaro86
7
"""
8
9
import numpy as np
10
11
12
def cf_normal(u, mu=1, sig=2):
13
"""
14
Characteristic function of a Normal random variable
15
"""
16
return np.exp(1j * u * mu - 0.5 * u**2 * sig**2)
17
18
19
def cf_gamma(u, a=1, b=2):
20
"""
21
Characteristic function of a Gamma random variable
22
- shape: a
23
- scale: b
24
"""
25
return (1 - b * u * 1j) ** (-a)
26
27
28
def cf_poisson(u, lam=1):
29
"""
30
Characteristic function of a Poisson random variable
31
- rate: lam
32
"""
33
return np.exp(lam * (np.exp(1j * u) - 1))
34
35
36
def cf_mert(u, t=1, mu=1, sig=2, lam=0.8, muJ=0, sigJ=0.5):
37
"""
38
Characteristic function of a Merton random variable at time t
39
mu: drift
40
sig: diffusion coefficient
41
lam: jump activity
42
muJ: jump mean size
43
sigJ: jump size standard deviation
44
"""
45
return np.exp(
46
t * (1j * u * mu - 0.5 * u**2 * sig**2 + lam * (np.exp(1j * u * muJ - 0.5 * u**2 * sigJ**2) - 1))
47
)
48
49
50
def cf_VG(u, t=1, mu=0, theta=-0.1, sigma=0.2, kappa=0.1):
51
"""
52
Characteristic function of a Variance Gamma random variable at time t
53
mu: additional drift
54
theta: Brownian motion drift
55
sigma: Brownian motion diffusion
56
kappa: Gamma process variance
57
"""
58
return np.exp(t * (1j * mu * u - np.log(1 - 1j * theta * kappa * u + 0.5 * kappa * sigma**2 * u**2) / kappa))
59
60
61
def cf_NIG(u, t=1, mu=0, theta=-0.1, sigma=0.2, kappa=0.1):
62
"""
63
Characteristic function of a Normal Inverse Gaussian random variable at time t
64
mu: additional drift
65
theta: Brownian motion drift
66
sigma: Brownian motion diffusion
67
kappa: Inverse Gaussian process variance
68
"""
69
return np.exp(
70
t * (1j * mu * u + 1 / kappa - np.sqrt(1 - 2j * theta * kappa * u + kappa * sigma**2 * u**2) / kappa)
71
)
72
73
74
def cf_Heston(u, t, v0, mu, kappa, theta, sigma, rho):
75
"""
76
Heston characteristic function as proposed in the original paper of Heston (1993)
77
"""
78
xi = kappa - sigma * rho * u * 1j
79
d = np.sqrt(xi**2 + sigma**2 * (u**2 + 1j * u))
80
g1 = (xi + d) / (xi - d)
81
cf = np.exp(
82
1j * u * mu * t
83
+ (kappa * theta) / (sigma**2) * ((xi + d) * t - 2 * np.log((1 - g1 * np.exp(d * t)) / (1 - g1)))
84
+ (v0 / sigma**2) * (xi + d) * (1 - np.exp(d * t)) / (1 - g1 * np.exp(d * t))
85
)
86
return cf
87
88
89
def cf_Heston_good(u, t, v0, mu, kappa, theta, sigma, rho):
90
"""
91
Heston characteristic function as proposed by Schoutens (2004)
92
"""
93
xi = kappa - sigma * rho * u * 1j
94
d = np.sqrt(xi**2 + sigma**2 * (u**2 + 1j * u))
95
g1 = (xi + d) / (xi - d)
96
g2 = 1 / g1
97
cf = np.exp(
98
1j * u * mu * t
99
+ (kappa * theta) / (sigma**2) * ((xi - d) * t - 2 * np.log((1 - g2 * np.exp(-d * t)) / (1 - g2)))
100
+ (v0 / sigma**2) * (xi - d) * (1 - np.exp(-d * t)) / (1 - g2 * np.exp(-d * t))
101
)
102
return cf
103
104