1

この例の行に沿って、pymc3 で GARCH モデルを実装しようとしています。このために、次のように GARCH(1, 1) ディストリビューションを実装しようとしました

import pymc3 as pm
from pymc3.distributions import Continuous, Normal

class GARCH(Continuous):
    def __init__(self, alpha_0=None, alpha_1=None, beta_1=None, sigma_0=None, *args, **kwargs):
        super(GARCH, self).__init__(*args, **kwargs)

        self.alpha_0 = alpha_0
        self.alpha_1 = alpha_1
        self.beta_1 = beta_1
        self.sigma_0 = sigma_0
        self.mean = 0

    def logp(self, values):
        sigma = self.sigma_0
        alpha_0 = self.alpha_0
        alpha_1 = self.alpha_1
        beta_1 = self.beta_1

        x_prev = values[0]
        _logp = Normal.dist(0., sd=sigma).logp(x_prev)

        for x in values[1:]:
            sigma = pm.sqrt(alpha_0 + alpha_1 * (x_prev/sigma)**2
                            + beta_1 * sigma**2)
            _logp = _logp + pm.Normal(0., sd=sigma).logp(x)
            x_prev = x

        return _logp

明確にするために、これは GARCH(1,1) モデルの対数尤度です。ボラティリティ プロセスは、時間 t でのボラティリティが時間 t-1 での残差に依存する時系列です。しかし、時間 t-1 での残差を決定するには、時間 t-1 でのボラティリティが必要です。

とにかく、それは私の質問にとってそれほど重要ではありません。重要なのは、for ループをベクトル化することによって可能性を計算できないことです (これは、投稿の上部にあるリンクで実行される方法です)。したがって、各ステップで最初にボラティリティを更新し、次に観察されたリターンの可能性を決定する明示的なループが必要です。

しかし、上記のコードは機能しません。次のようなモデルを構築しようとすると

import numpy as np
returns = np.genfromtxt("SP500.csv")[-200:]
garchmodel = pm.Model()
with garchmodel:
    alpha_0 = pm.Exponential('alpha_0', 30., testval=.02)
    alpha_1 = pm.Uniform('alpha_1', lower=0, upper=1, testval=.9) 
    upper = pm.Deterministic('upper', 1-alpha_1)
    beta_1 = pm.Uniform('beta_1', lower=0, upper=upper, testval=.05)
    sigma_0 = pm.Exponential('sigma_0', 30., testval=.02)

    garch = GARCH('garch', alpha_0=alpha_0, alpha_1=alpha_1, 
                  beta_1=beta_1, sigma_0=sigma_0, observed=returns)

「SP500.csv」ファイルは、 githubなどで見つけることができます。

このコードはエラーを生成します:

ValueError: length not known

これは、for ループが theano と競合しているためだと確信しています。どうすればこれに対処できますか?

4

0 に答える 0