Ok I think I solved that issue…need to ensure Vt is positive when taking the square root. Now I just need to get the correlation worked in
import numpy as np
import matplotlib.pyplot as plt
import pymc3 as pm
from pymc3.distributions.timeseries import EulerMaruyama
returns = np.genfromtxt(pm.get_data("SP500.csv"))
def Vt_sde(Vt, sigmaV, kappa, theta):
return kappa*(theta-Vt), sigmaV *np.sqrt(np.abs(Vt))
with pm.Model() as sp500_model:
theta=pm.HalfNormal('theta',sd=0.4)
kappa=pm.HalfNormal('kappa',sd=2)
sigmaV=pm.InverseGamma('sigmaV',2.5,0.1)
Vt = EulerMaruyama('Vt',1.0,Vt_sde,[sigmaV, kappa, theta],shape=len(returns),testval=np.repeat(.01,len(returns)))
volatility_process = pm.Deterministic('volatility_process', np.sqrt(np.abs(Vt)))
r = pm.Normal('r', mu=0,sd=volatility_process, observed=returns)
with sp500_model:
trace = pm.sample(2000,chains=1,cores=1)
pm.traceplot(trace, [sigmaV, kappa, theta])