pymc3 - 具有潜在 AR(1) 过程的随机波动率模型
pymc3 - stochastic volatility model with latent AR(1) process
我一直在尝试使用 pymc3 实现和估计以下形式的基本随机波动率 (SV) 模型:
r_t = exp{h_t/2}*e_t
h_t = r_0 + r_1*h_{t-1} + n_t
其中 r_t 是 return 过程,h_t 是 AR(1) 过程之后的(潜在)对数方差过程。我的代码 (MWE) 如下所示:
import numpy as np
import pymc3 as pm
# simulate some random data
np.random.seed(13)
data = np.random.randn(10)
# SV model with AR
with pm.Model() as model:
nu = 2
rho = pm.Uniform("rho", -1, 1)
h = pm.AR("h", rho=rho, sigma=1, shape=len(data))
volatility_process = pm.Deterministic(
"volatility_process", pm.math.exp(h / 2) ** 0.5
)
r = pm.StudentT("r", nu=nu, sigma=volatility_process, observed=data)
prior = pm.sample_prior_predictive(10)
# trace = pm.sample(10)
但是 运行以上操作会导致以下错误消息:
Traceback (most recent call last):
File "C:\Users\jrilla\AppData\Local\Continuum\anaconda3\lib\site-packages\pymc3\distributions\distribution.py", line 801, in _draw_value
return dist_tmp.random(point=point, size=size)
File "C:\Users\jrilla\AppData\Local\Continuum\anaconda3\lib\site-packages\pymc3\distributions\continuous.py", line 1979, in random
point=point, size=size)
File "C:\Users\jrilla\AppData\Local\Continuum\anaconda3\lib\site-packages\pymc3\distributions\distribution.py", line 638, in draw_values
raise ValueError('Cannot resolve inputs for {}'.format([str(params[j]) for j in to_eval]))
ValueError: Cannot resolve inputs for ['Elemwise{mul,no_inplace}.0']
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "<stdin>", line 9, in <module>
File "C:\Users\jrilla\AppData\Local\Continuum\anaconda3\lib\site-packages\pymc3\sampling.py", line 1495, in sample_prior_predictive
values = draw_values([model[name] for name in names], size=samples)
File "C:\Users\jrilla\AppData\Local\Continuum\anaconda3\lib\site-packages\pymc3\distributions\distribution.py", line 620, in draw_values
size=size)
File "C:\Users\jrilla\AppData\Local\Continuum\anaconda3\lib\site-packages\pymc3\distributions\distribution.py", line 810, in _draw_value
size=None))
File "C:\Users\jrilla\AppData\Local\Continuum\anaconda3\lib\site-packages\pymc3\distributions\continuous.py", line 1979, in random
point=point, size=size)
File "C:\Users\jrilla\AppData\Local\Continuum\anaconda3\lib\site-packages\pymc3\distributions\distribution.py", line 638, in draw_values
raise ValueError('Cannot resolve inputs for {}'.format([str(params[j]) for j in to_eval]))
ValueError: Cannot resolve inputs for ['Elemwise{mul,no_inplace}.0']
此外,正是 prior = ...
行导致了错误。请注意,我使用的是 pm.AR()
而不是 pm.AR1()
,但这会导致相同的错误。我真的不明白为什么它不能按预期工作。我能够 运行 pymc3 文档中提供的(简化)SV example:
# SV model with GaussianRandomWalk
with pm.Model() as model:
nu = 2
sigma = pm.Exponential("sigma", 1.0, testval=1.0)
s = pm.GaussianRandomWalk("s", sigma=sigma, shape=len(data))
volatility_process = pm.Deterministic(
"volatility_process", pm.math.exp(-2 * s) ** 0.5
)
r = pm.StudentT("r", nu=nu, sigma=volatility_process, observed=data)
prior = pm.sample_prior_predictive(10)
# trace = pm.sample(10)
他们展示了高斯随机游走 (GRW) 的示例,而不是我想使用的一般 AR 过程。由于 GRM 只是一个特定的 AR,它适用于 GRM,我不明白为什么它不应该也适用于一般 AR。从代码中可以看出,我基本上只是将 pm.GaussianRandomWalk(...)
替换为 pm.AR(...)
(每个都有所需的参数)。我也可以简单地 implement/estimate AR 过程本身:
# Simple AR
with pm.Model() as model:
rho = pm.Uniform("rho", -1, 1)
h = pm.AR("h", rho=rho, sigma=1, shape=len(data), observed=data)
prior = pm.sample_prior_predictive(10)
#trace = pm.sample(10)
这也很好用,所以我假设我在定义 AR 时没有犯错。只有当 AR 被用作潜在过程时才会出现错误。可以找到有关 GRW 和 AR 模型的 pymc3 文档 here
知道这里的问题是什么或者我做错了什么吗?
谢谢!
在 pymc3 discours 页面上问了同样的问题。开发人员回应,上述错误的 reason 是要使 pm.sample_prior_predictive
工作,需要 random()
方法,该方法仅针对 GRM 实现。但是,pm.sample
工作得很好。
我一直在尝试使用 pymc3 实现和估计以下形式的基本随机波动率 (SV) 模型:
r_t = exp{h_t/2}*e_t
h_t = r_0 + r_1*h_{t-1} + n_t
其中 r_t 是 return 过程,h_t 是 AR(1) 过程之后的(潜在)对数方差过程。我的代码 (MWE) 如下所示:
import numpy as np
import pymc3 as pm
# simulate some random data
np.random.seed(13)
data = np.random.randn(10)
# SV model with AR
with pm.Model() as model:
nu = 2
rho = pm.Uniform("rho", -1, 1)
h = pm.AR("h", rho=rho, sigma=1, shape=len(data))
volatility_process = pm.Deterministic(
"volatility_process", pm.math.exp(h / 2) ** 0.5
)
r = pm.StudentT("r", nu=nu, sigma=volatility_process, observed=data)
prior = pm.sample_prior_predictive(10)
# trace = pm.sample(10)
但是 运行以上操作会导致以下错误消息:
Traceback (most recent call last):
File "C:\Users\jrilla\AppData\Local\Continuum\anaconda3\lib\site-packages\pymc3\distributions\distribution.py", line 801, in _draw_value
return dist_tmp.random(point=point, size=size)
File "C:\Users\jrilla\AppData\Local\Continuum\anaconda3\lib\site-packages\pymc3\distributions\continuous.py", line 1979, in random
point=point, size=size)
File "C:\Users\jrilla\AppData\Local\Continuum\anaconda3\lib\site-packages\pymc3\distributions\distribution.py", line 638, in draw_values
raise ValueError('Cannot resolve inputs for {}'.format([str(params[j]) for j in to_eval]))
ValueError: Cannot resolve inputs for ['Elemwise{mul,no_inplace}.0']
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "<stdin>", line 9, in <module>
File "C:\Users\jrilla\AppData\Local\Continuum\anaconda3\lib\site-packages\pymc3\sampling.py", line 1495, in sample_prior_predictive
values = draw_values([model[name] for name in names], size=samples)
File "C:\Users\jrilla\AppData\Local\Continuum\anaconda3\lib\site-packages\pymc3\distributions\distribution.py", line 620, in draw_values
size=size)
File "C:\Users\jrilla\AppData\Local\Continuum\anaconda3\lib\site-packages\pymc3\distributions\distribution.py", line 810, in _draw_value
size=None))
File "C:\Users\jrilla\AppData\Local\Continuum\anaconda3\lib\site-packages\pymc3\distributions\continuous.py", line 1979, in random
point=point, size=size)
File "C:\Users\jrilla\AppData\Local\Continuum\anaconda3\lib\site-packages\pymc3\distributions\distribution.py", line 638, in draw_values
raise ValueError('Cannot resolve inputs for {}'.format([str(params[j]) for j in to_eval]))
ValueError: Cannot resolve inputs for ['Elemwise{mul,no_inplace}.0']
此外,正是 prior = ...
行导致了错误。请注意,我使用的是 pm.AR()
而不是 pm.AR1()
,但这会导致相同的错误。我真的不明白为什么它不能按预期工作。我能够 运行 pymc3 文档中提供的(简化)SV example:
# SV model with GaussianRandomWalk
with pm.Model() as model:
nu = 2
sigma = pm.Exponential("sigma", 1.0, testval=1.0)
s = pm.GaussianRandomWalk("s", sigma=sigma, shape=len(data))
volatility_process = pm.Deterministic(
"volatility_process", pm.math.exp(-2 * s) ** 0.5
)
r = pm.StudentT("r", nu=nu, sigma=volatility_process, observed=data)
prior = pm.sample_prior_predictive(10)
# trace = pm.sample(10)
他们展示了高斯随机游走 (GRW) 的示例,而不是我想使用的一般 AR 过程。由于 GRM 只是一个特定的 AR,它适用于 GRM,我不明白为什么它不应该也适用于一般 AR。从代码中可以看出,我基本上只是将 pm.GaussianRandomWalk(...)
替换为 pm.AR(...)
(每个都有所需的参数)。我也可以简单地 implement/estimate AR 过程本身:
# Simple AR
with pm.Model() as model:
rho = pm.Uniform("rho", -1, 1)
h = pm.AR("h", rho=rho, sigma=1, shape=len(data), observed=data)
prior = pm.sample_prior_predictive(10)
#trace = pm.sample(10)
这也很好用,所以我假设我在定义 AR 时没有犯错。只有当 AR 被用作潜在过程时才会出现错误。可以找到有关 GRW 和 AR 模型的 pymc3 文档 here
知道这里的问题是什么或者我做错了什么吗? 谢谢!
在 pymc3 discours 页面上问了同样的问题。开发人员回应,上述错误的 reason 是要使 pm.sample_prior_predictive
工作,需要 random()
方法,该方法仅针对 GRM 实现。但是,pm.sample
工作得很好。