I’m trying to build a kind of volatility model.
import numpy as np
from pymc3.distributions.timeseries import GaussianRandomWalk
from scipy import stats
from scipy import optimize
import pymc3 as pm
x_mean = 10
x_normal_dev = 10
x_outlier_dev = 30
x_normal_ratio = 0.70
binom = np.random.binomial(1, 0.7, 10000)
a = np.random.normal(x_mean, x_normal_dev, 10000)
b = np.random.normal(x_mean, x_outlier_dev, 10000)
c = a * binom + b * (1 - binom)
I made a sample data with the preceding code. Then, I wanted to make a model and estimate the normal_dev for the model.
with pm.Model() as model:
#mu = pm.Uniform('mean', lower=-100, upper=100)
mu = 10
normal_dev = pm.Uniform('normal_dev', lower=0, upper=30)
dev1 = pm.Normal('dev1', mu=mu, sigma=normal_dev)
dev2 = pm.Normal('dev2', mu=mu, sigma=x_outlier_dev)
binom = pm.Binomial('binom', 1, 0.7)
output = pm.Normal('output', mu=dev1*binom + dev2*(1-binom), tau=1, observed=c)
with model:
trace = pm.sample(1000)
pm.traceplot(trace);
pm.summary(trace)
It seems not to work well to estimate even only normal_dev
value. What am I wrong with it?
It seems apply estimation not only normal_dev
but others like binom
value. Is there anyway to fix the variable value? I tried to use pm.Deterministic
but it didn’t help.