Source code for ajdmom.mdl_1fsvj.euler

"""
Module for generating a trajectory of samples from mdl_1fsvj by
Euler approximation

To facilitate the verification of the correctness of our codes
by comparison the population moments (given by our package) and
their sample counterparts.
Here I define function :py:func:`~ajdmom.mdl_1fsvj.euler.r1FSVJ`.
"""
import math
import numpy as np


[docs] def r1FSVJ(v0, par, N, n_segment=10, h=1): """Generate samples from mdl_1fsvj by Euler approximation :param float v0: value of the initial variance :math:`v(0) > 0`. :param dict par: parameters in a dict. :param int N: target length of samples to generate. :param int n_segment: number of segments each interval is split into. :param float h: time interval between any two consecutive samples. :return: a sequence of samples. :rtype: numpy 1-D array. """ mu = par['mu'] k = par['k'] theta = par['theta'] sigma = par['sigma_v'] rho = par['rho'] lmbd = par['lambda'] mu_j = par['mu_j'] sigma_j = par['sigma_j'] # dlt = h / n_segment std = math.sqrt(dlt) # y_series = np.empty(N) # for i in range(N): I = 0 I2 = 0 IV = 0 for j in range(n_segment): eps = math.sqrt(v0) * np.random.normal(0, std) eps2 = math.sqrt(v0) * np.random.normal(0, std) v = v0 + k * (theta - v0) * dlt + sigma * eps if v < 0: v = 0 # eps = -(v0 + k*(theta-v0)*dlt)/sigma I += eps I2 += eps2 IV += v0 * dlt v0 = v # # jump part n = np.random.poisson(lmbd * h) J_n = 0 if n > 0: for l in range(n): J_n += np.random.normal(mu_j, sigma_j) # y = mu * h - IV / 2 + rho * I + math.sqrt(1 - rho ** 2) * I2 + J_n y_series[i] = y # return y_series