Skip to content

Commit b46c58e

Browse files
authored
Merge pull request #155 from PyFE/garch
Refactoring model names
2 parents e61d8bd + ae2f8b5 commit b46c58e

File tree

6 files changed

+25
-29
lines changed

6 files changed

+25
-29
lines changed

pyfeng/__init__.py

+15-15
Original file line numberDiff line numberDiff line change
@@ -1,27 +1,27 @@
1-
from .norm import (
2-
Norm,
3-
) # the order is sensitive because of `price_barrier` method. Put it before .bsm
1+
# the order is sensitive because of `price_barrier` method. Put it before .bsm
2+
from .norm import Norm
3+
44
from .bsm import Bsm, BsmDisp
55
from .cev import Cev, CevMc
66
from .gamma import InvGam, InvGauss
7+
8+
# FFT related models
79
from .sv_fft import HestonFft, BsmFft, OusvFft, VarGammaFft, ExpNigFft, Sv32Fft
8-
from .sabr import (
9-
SabrHagan2002,
10-
SabrNormVolApprox,
11-
SabrLorig2017,
12-
SabrChoiWu2021H,
13-
SabrChoiWu2021P,
14-
)
15-
from .garch import GarchMcTimeStep, GarchUncorrBaroneAdesi2004
10+
11+
# SABR/NSVh related models
12+
from .sabr import SabrHagan2002, SabrNormVolApprox, SabrLorig2017, SabrChoiWu2021H, SabrChoiWu2021P
13+
from .sabr_int import SabrUncorrChoiWu2021
14+
from .sabr_mc import SabrMcTimeDisc
15+
from .nsvh import Nsvh1, NsvhMc, NsvhGaussQuad
16+
17+
# Other SV models
18+
from .garch import GarchMcTimeDisc, GarchUncorrBaroneAdesi2004
1619
from .heston import HestonUncorrBallRoma1994
1720
from .heston_mc import (
1821
HestonMcAndersen2008, HestonMcGlassermanKim2011, HestonMcTseWan2013,
1922
HestonMcChoiKwok2023PoisGe, HestonMcChoiKwok2023PoisTd
2023
)
21-
from .ousv import OusvUncorrBallRoma1994
22-
from .sabr_int import SabrUncorrChoiWu2021
23-
from .sabr_mc import SabrMcTimeDisc
24-
from .nsvh import Nsvh1, NsvhMc, NsvhGaussQuad
24+
from .ousv import OusvUncorrBallRoma1994, OusvMcTimeDisc, OusvMcChoi2023KL
2525
from .svi import Svi
2626

2727
from .multiasset import (

pyfeng/ex.py

-1
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@
88
# SABR / OUSV models for research
99
from .sabr_int import SabrMixture
1010
from .sabr_mc import SabrMcCai2017Exact
11-
from .ousv import OusvSchobelZhu1998, OusvMcTimeStep, OusvMcChoi2023KL
1211

1312
# Basket-Asian from ASP 2021
1413
from .multiasset_Ju2002 import BsmBasketAsianJu2002, BsmContinuousAsianJu2002

pyfeng/garch.py

+4-5
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77

88
class GarchUncorrBaroneAdesi2004(sv.SvABC):
99
"""
10-
Barone-Adesi et al (2004)'s approximation pricing formula for European options under uncorrelated (rho=0) GARCH diffusion model.
10+
Barone-Adesi et al. (2004)'s approximation pricing formula for European options under uncorrelated (rho=0) GARCH diffusion model.
1111
Up to 2nd order is implemented.
1212
1313
References:
@@ -26,8 +26,8 @@ def avgvar_mv(self, texp, var0):
2626
Eqs. (12)-(13) in Barone-Adesi et al. (2005)
2727
2828
Args:
29-
var0: initial variance
3029
texp: time step
30+
var0: initial variance
3131
3232
Returns:
3333
mean, variance
@@ -53,8 +53,7 @@ def avgvar_mv(self, texp, var0):
5353
M2c_3 = -vov2*(theta2*(4*mr*(3 - mr_t) + (2*mr_t - 5)*vov2) + term2*var0*(2*theta + var0))
5454

5555
M2c_4 = 2*e_mr*vov2
56-
M2c_4 *= 2*theta2*(mr_t*mr - (1 + mr_t)*vov2) \
57-
+ var0*(2*mr*theta*(1 + texp*term1) + term1*var0)
56+
M2c_4 *= 2*theta2*(mr_t*mr - (1 + mr_t)*vov2) + var0*(2*mr*theta*(1 + texp*term1) + term1*var0)
5857

5958
M2c = M2c_1/mr2 + M2c_2/(term1*term2)**2 + M2c_3/mr2/term2**2 + M2c_4/mr2/term1**2
6059
M2c /= texp**2
@@ -79,7 +78,7 @@ def price(self, strike, spot, texp, cp=1):
7978
return price
8079

8180

82-
class GarchMcTimeStep(sv.SvABC, sv.CondMcBsmABC):
81+
class GarchMcTimeDisc(sv.SvABC, sv.CondMcBsmABC):
8382
"""
8483
Garch model with conditional Monte-Carlo simulation
8584
The SDE of SV is: dv_t = mr * (theta - v_t) dt + vov * v_t dB_T

pyfeng/ousv.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -438,7 +438,7 @@ def return_var_realized(self, texp, cond=False):
438438
return var_r / texp # annualized
439439

440440

441-
class OusvMcTimeStep(OusvMcABC):
441+
class OusvMcTimeDisc(OusvMcABC):
442442
"""
443443
OUSV model with conditional Monte-Carlo simulation
444444
The SDE of SV is: d sigma_t = mr (theta - sigma_t) dt + vov dB_T

pyfeng/sv_fft.py

+2-3
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
from . import ousv
1212
from . import heston
1313

14+
1415
class FftABC(opt.OptABC, abc.ABC):
1516
n_x = 2**12 # number of grid. power of 2 for FFT
1617
x_lim = 200 # integratin limit
@@ -267,9 +268,7 @@ def mgf_logprice_schobelzhu1998(self, uu, texp):
267268
s2g3 = vov**2*gamma1**3
268269

269270
D = (mr - gamma1*sincos/cossin)/vov**2
270-
B = ((ktg3 + gamma3*sincos)/cossin - mr*theta*gamma1)/(
271-
vov**2*gamma1
272-
)
271+
B = ((ktg3 + gamma3*sincos)/cossin - mr*theta*gamma1)/(vov**2*gamma1)
273272
C = (
274273
-0.5*np.log(cossin)
275274
+ 0.5*mr*texp

tests/test_ousv.py

+3-4
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@
66

77
sys.path.insert(0, os.getcwd())
88
import pyfeng as pf
9-
import pyfeng.ex as pfex
109

1110

1211
class TestOusvKL(unittest.TestCase):
@@ -29,7 +28,7 @@ def test_infinite_sum(self):
2928
An2n2 = An2 / n_pi_2
3029
An6n2 = n_pi_2 * An6
3130

32-
m = pfex.OusvMcChoi2023KL(1, 1, 0, 1, theta=mrt)
31+
m = pf.OusvMcChoi2023KL(1, 1, 0, 1, theta=mrt)
3332

3433
assert np.isclose(1, sum(An2[ns:])/m._a2sum(mrt, ns=ns), atol=1e-4)
3534
assert np.isclose(1, sum(An2[ns::2])/m._a2sum(mrt, ns=ns, odd=1), atol=1e-4)
@@ -60,7 +59,7 @@ def test_integarl_sin_path(self):
6059
6160
"""
6261
sheet_no = 1
63-
m, p, rv = pfex.OusvMcChoi2023KL.init_benchmark(sheet_no)
62+
m, p, rv = pf.OusvMcChoi2023KL.init_benchmark(sheet_no)
6463
n_sin = 6
6564
n_path = 50
6665
m.set_num_params(n_path=n_path, rn_seed=123456, n_sin=4, dt=None)
@@ -83,7 +82,7 @@ def test_MomentsIntVariance(self):
8382
"""
8483
Unconditional mean/var == E(conditional)
8584
"""
86-
m = pfex.OusvMcChoi2023KL(sigma=1, vov=0.75, mr=2.5)
85+
m = pf.OusvMcChoi2023KL(sigma=1, vov=0.75, mr=2.5)
8786
zz, ww = spsp.roots_hermitenorm(31)
8887
ww /= np.sqrt(2 * np.pi)
8988

0 commit comments

Comments
 (0)