Path: blob/master/sage/finance/markov_multifractal_cython.pyx
4102 views
"""1Markov Switching Multifractal model23Cython code4"""56from sage.misc.randstate cimport randstate, current_randstate78cdef extern from "math.h":9double sqrt(double)1011from time_series cimport TimeSeries1213def simulations(Py_ssize_t n, Py_ssize_t k,14double m0, double sigma,15int kbar, gamma):16"""17Return k simulations of length n using the Markov switching18multifractal model.1920INPUT:21n, k -- positive integers22m0, sigma -- floats23kbar -- integer24gamma -- list of floats2526OUTPUT:27list of lists2829EXAMPLES:30sage: set_random_seed(0)31sage: msm = finance.MarkovSwitchingMultifractal(8,1.4,1.0,0.95,3)32sage: import sage.finance.markov_multifractal_cython33sage: sage.finance.markov_multifractal_cython.simulations(5,2,1.278,0.262,8,msm.gamma())34[[0.0014, -0.0023, -0.0028, -0.0030, -0.0019], [0.0020, -0.0020, 0.0034, -0.0010, -0.0004]]35"""36cdef double m1 = 2 - m037cdef Py_ssize_t i, j, a, c38cdef TimeSeries t, eps39cdef TimeSeries markov_state_vector = TimeSeries(kbar)40cdef TimeSeries gamma_vals = TimeSeries(gamma)41cdef randstate rstate = current_randstate()4243sigma = sigma / 100 # model's sigma is a percent4445# output list of simulations46S = []4748for i from 0 <= i < k:49# Initialize the model50for j from 0 <= j < kbar:51# n & 1 means "is odd"52markov_state_vector._values[j] = m0 if (rstate.c_random() & 1) else m153t = TimeSeries(n)5455# Generate n normally distributed random numbers with mean 056# and variance 1.57eps = TimeSeries(n)58eps.randomize('normal')5960for a from 0 <= a < n:61# Compute next step in the simulation62t._values[a] = sigma * eps._values[a] * sqrt(markov_state_vector.prod())6364# Now update the volatility state vector65for c from 0 <= c < kbar:66if rstate.c_rand_double() <= gamma_vals._values[c]:67markov_state_vector._values[c] = m0 if (rstate.c_random() & 1) else m16869S.append(t)7071return S72737475767778798081