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 工作得很好。