Skip to content

Commit 00fbc27

Browse files
authored
Merge pull request #88 from PyFE/heston_fft
Name refactoring
2 parents 1fbadb8 + 3044308 commit 00fbc27

File tree

8 files changed

+21
-21
lines changed

8 files changed

+21
-21
lines changed

pyfeng/__init__.py

+1-5
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
SabrChoiWu2021P,
1313
)
1414
from .sabr_int import SabrUncorrChoiWu2021
15-
from .sabr_mc import SabrCondMc
15+
from .sabr_mc import SabrMcCond
1616
from .nsvh import Nsvh1, NsvhMc
1717
from .multiasset import (
1818
BsmSpreadKirk,
@@ -27,10 +27,6 @@
2727
BsmBasketJsu,
2828
)
2929
from .multiasset_mc import BsmNdMc, NormNdMc
30-
from .ousv import OusvIFT, OusvCondMC
31-
32-
# SV models
33-
from .heston_mc import HestonCondMcQE
3430

3531
# Asset Allocation
3632
from .assetalloc import RiskParity

pyfeng/ex.py

+8-4
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,14 @@
1-
# SV models (CMC, AE) from ASP 2021
2-
from .heston_mc import HestonMcAe, HestonMcExactGK
31
#from .heston_fft import HestonFft
4-
from .sv32_mc import Sv32CondMcQE, Sv32McAe
5-
from .garch import GarchCondMC, GarchApproxUncor
2+
3+
# SV models (CMC, AE) from ASP 2021
4+
from .heston_mc import HestonMcAndersen2008, HestonMcAe, HestonMcExactGK
5+
from .sv32_mc import Sv32McCondQE, Sv32McAe
6+
from .garch import GarchMcCond, GarchUncorrBaroneAdesi2004
7+
8+
# SABR / OUSV models for research
69
from .sabr_int import SabrCondQuad
710
from .sabr_mc import SabrMcExactCai2017
11+
from .ousv import OusvSchobelZhu1998, OusvMcCond
812

913
# Basket-Asian from ASP 2021
1014
from .multiasset_Ju2002 import BsmBasketAsianJu2002, BsmContinuousAsianJu2002

pyfeng/garch.py

+2-2
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
from . import bsm
66

77

8-
class GarchApproxUncor(sv.SvABC):
8+
class GarchUncorrBaroneAdesi2004(sv.SvABC):
99
"""
1010
The implementation of Barone-Adesi et al (2004)'s approximation pricing formula for European
1111
options under uncorrelated (rho=0) GARCH diffusion model.
@@ -71,7 +71,7 @@ def price(self, strike, spot, texp, cp=1):
7171
return c_ga_2
7272

7373

74-
class GarchCondMC(sv.SvABC, sv.CondMcBsmABC):
74+
class GarchMcCond(sv.SvABC, sv.CondMcBsmABC):
7575
"""
7676
Garch model with conditional Monte-Carlo simulation
7777
The SDE of SV is: dv_t = mr * (theta - v_t) dt + vov * v_t dB_T

pyfeng/heston_mc.py

+2-2
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
from . import sv_abc as sv
1010

1111

12-
class HestonCondMcQE(sv.SvABC, sv.CondMcBsmABC):
12+
class HestonMcAndersen2008(sv.SvABC, sv.CondMcBsmABC):
1313
"""
1414
Heston model with conditional Monte-Carlo simulation
1515
@@ -26,7 +26,7 @@ class HestonCondMcQE(sv.SvABC, sv.CondMcBsmABC):
2626
>>> strike = np.array([60, 100, 140])
2727
>>> spot = 100
2828
>>> sigma, vov, mr, rho, texp = 0.04, 1, 0.5, -0.9, 10
29-
>>> m = pf.HestonCondMcQE(sigma, vov=vov, mr=mr, rho=rho)
29+
>>> m = pf.HestonMcAndersen2008(sigma, vov=vov, mr=mr, rho=rho)
3030
>>> m.set_mc_params(n_path=1e5, dt=1/8, rn_seed=123456)
3131
>>> m.price(strike, spot, texp)
3232
>>> # true price: 44.330, 13.085, 0.296

pyfeng/ousv.py

+4-4
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
from . import sv_abc as sv
44

55

6-
class OusvIFT(sv.SvABC):
6+
class OusvSchobelZhu1998(sv.SvABC):
77
"""
88
The implementation of Schobel & Zhu (1998)'s inverse FT pricing formula for European
99
options the Ornstein-Uhlenbeck driven stochastic volatility process.
@@ -12,10 +12,10 @@ class OusvIFT(sv.SvABC):
1212
1313
Examples:
1414
>>> import pyfeng as pf
15-
>>> model = pf.OusvIFT(0.2, mr=4, vov=0.1, rho=-0.7, intr=0.09531)
15+
>>> model = pf.OusvSchobelZhu1998(0.2, mr=4, vov=0.1, rho=-0.7, intr=0.09531)
1616
>>> model.price(100, 100, texp=np.array([1, 5, 10]))
1717
array([13.21493, 40.79773, 62.76312])
18-
>>> model = pf.OusvIFT(0.25, mr=8, vov=0.3, rho=-0.6, intr=0.09531)
18+
>>> model = pf.OusvSchobelZhu1998(0.25, mr=8, vov=0.3, rho=-0.6, intr=0.09531)
1919
>>> model.price(np.array([90, 100, 110]), 100, texp=1)
2020
array([21.41873, 15.16798, 10.17448])
2121
"""
@@ -103,7 +103,7 @@ def price(self, strike, spot, texp, cp=1):
103103
return df * fwd * price
104104

105105

106-
class OusvCondMC(sv.SvABC, sv.CondMcBsmABC):
106+
class OusvMcCond(sv.SvABC, sv.CondMcBsmABC):
107107
"""
108108
OUSV model with conditional Monte-Carlo simulation
109109
The SDE of SV is: d sigma_t = mr (theta - sigma_t) dt + vov dB_T

pyfeng/sabr_mc.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
from . import cev
1111

1212

13-
class SabrCondMc(sabr.SabrABC, sv.CondMcBsmABC):
13+
class SabrMcCond(sabr.SabrABC, sv.CondMcBsmABC):
1414
"""
1515
Conditional MC for SABR model (beta=0,1 or rho=0) with conditional Monte-Carlo simulation
1616

pyfeng/sv32_mc.py

+2-2
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616
from .norm import Norm
1717

1818

19-
class Sv32CondMcQE:
19+
class Sv32McCondQE:
2020
"""
2121
Conditional MC for 3/2 model based on QE discretization scheme by Andersen(2008)
2222
@@ -30,7 +30,7 @@ class Sv32CondMcQE:
3030
>>> forward = 100
3131
>>> delta = [1, 1/2, 1/4, 1/8, 1/16, 1/32]
3232
>>> vov, kappa, rho, texp, theta, sigma = [1, 0.5, -0.9, 10, 0.04, np.sqrt(0.04)]
33-
>>> sv32_cmc_qe = pf.Sv32CondMcQE(vov=vov, kappa=kappa, rho=rho, theta=theta)
33+
>>> sv32_cmc_qe = pf.Sv32McCondQE(vov=vov, kappa=kappa, rho=rho, theta=theta)
3434
>>> price_cmc = np.zeros([len(delta), len(strike)])
3535
>>> for d in range(len(delta)):
3636
>>> price_cmc[d, :] = sv32_cmc_qe.price(strike, forward, texp, sigma=sigma, delta=delta[d], path=1e5, seed=123456)

tests/test_sabr.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,7 @@ def test_UnCorrChoiWu2021(self):
6363

6464
def test_CondMc(self):
6565
for k in [19, 20]: # can test 22 (Korn&Tang) also, but difficult to pass
66-
m, df, rv = pf.SabrCondMc.init_benchmark(k)
66+
m, df, rv = pf.SabrMcCond.init_benchmark(k)
6767
m.set_mc_params(n_path=5e4, dt=0.05, rn_seed=1234)
6868
p = m.price(**rv["args_pricing"])
6969
np.testing.assert_almost_equal(p, rv["val"], decimal=4)

0 commit comments

Comments
 (0)