Source code for aleatory.processes.euler_maruyama.ckls_process

"""Chan-Karolyi-Longstaff-Sanders (CKLS) process"""

from aleatory.processes.euler_maruyama.ckls_process_generic import CKLSProcessGeneric
from aleatory.processes import BrownianMotion, Vasicek, CIRProcess, GBM


[docs]class CKLSProcess(CKLSProcessGeneric): r""" Chan-Karolyi-Longstaff-Sanders (CKLS) process ============================================= .. image:: ../_static/ckls_process_draw.png Notes ----- A CKLS process :math:`X = \{X : t \geq 0\}` is characterised by the following Stochastic Differential Equation .. math:: dX_t = (\alpha + \beta X_t) dt + \sigma X_t^{\gamma} dW_t, \ \ \ \ \forall t\in (0,T], with initial condition :math:`X_0 = x_0`, where - :math:`\alpha \in \mathbb{R}` - :math:`\beta \in \mathbb{R}` - :math:`\sigma>0` is the scale of the volatility - :math:`\gamma\geq 0` is the elasticity term - :math:`W_t` is a standard Brownian Motion. References ---------- - CHAN, K.C., KAROLYI, G.A., LONGSTAFF, F.A. and SANDERS, A.B. (1992), An Empirical Comparison of Alternative Models of the Short-Term Interest Rate. The Journal of Finance, 47: 1209-1227. https://doi.org/10.1111/j.1540-6261.1992.tb04011.x Constructor, Methods, and Attributes ------------------------------------ """ def __new__(cls, *args, **kwargs): alpha = kwargs["alpha"] if "alpha" in kwargs else 0.5 beta = kwargs["beta"] if "beta" in kwargs else 0.5 sigma = kwargs["sigma"] if "sigma" in kwargs else 0.1 gamma = kwargs["gamma"] if "gamma" in kwargs else 1.5 initial = kwargs["initial"] if "initial" in kwargs else 1.0 T = kwargs["T"] if "T" in kwargs else 1.0 rng = kwargs["rng"] if "rng" in kwargs else None if beta == 0.0 and gamma == 0: return BrownianMotion(drift=alpha, scale=sigma, T=T, rng=rng) elif gamma == 0 and beta < 0: theta = -1.0 * beta mu = -1.0 * alpha / beta return Vasicek( theta=theta, mu=mu, sigma=sigma, initial=initial, T=T, rng=rng ) elif gamma == 0.5: theta = -1.0 * beta mu = -1.0 * alpha / beta return CIRProcess( theta=theta, mu=mu, sigma=sigma, initial=initial, T=T, rng=rng ) elif alpha == 0.0 and gamma == 1.0: return GBM(drift=beta, volatility=sigma, initial=initial, T=T, rng=rng) else: return CKLSProcessGeneric( alpha=alpha, beta=beta, sigma=sigma, gamma=gamma, initial=initial, T=T, rng=rng, )