【问题标题】:Defining arguments for Kalman filter in R在 R 中定义卡尔曼滤波器的参数
【发布时间】:2016-10-13 06:13:56
【问题描述】:

我一直试图弄清楚如何定义方程和参数以运行具有 4 个变量的卡尔曼滤波器(fkf 包)。我正在使用的模型是扩展资本资产定价模型,变量是因变量:Rpt(超额投资组合回报)和三个自变量:Rmt(优于每月回报)、SMB(规模因子)和 ILLIQ(流动性不足)因素)。该数据包括 22 只股票连续 5 年的月度数据。该链接提供了数据集外观的概念,以便于参考。 Portfolio returns。这是前三只股票的数据集:3 first stocks

加载上面的数据集(完整),我已经能够运行卡尔曼滤波器,只有一个变量,上面的 Rpt。但是,如何向模型添加更多变量?我正在努力定义正确的论点和方程式。有人能帮忙吗?以下是我到目前为止的代码。

namibia1 <- read.delim(file.choose(), header=T)
attach(namibia1)
namibia1_ts <- ts(as.numeric(namibia1[,1]), frequency=12, start=c(2011,1), end=c(2015,12))
namibia1_ts <- ts(as.numeric(namibia1[,1]), frequency=12, start=c(2011,1), end=c(2015,12))
y <- namibia1_ts
dt <- ct <- matrix(0)
Tt <- matrix(1)
a0 <- y[1]
P0 <- matrix(1)
Zt <- matrix(c(1), ncol=60)
fit.fkf <- optim(c(HHt = var(y, na.rm=TRUE)*.5, 
                   GGt = var(y, na.rm=TRUE)*.5), 
                   fn  = function(par, ...){ -fkf(HHt = matrix(par[1]) }, 
                   GGt = matrix(par[2]), ...)$logLik, 
                   yt  = rbind(y), 
                   a0 = a0, P0 = P0, dt = dt, ct = ct, Zt = Zt, Tt = Tt, 
                  check.input = FALSE)

更准确地说,我正在努力将转换和测量方程定义为矩阵,如果是,如何定义?这似乎是一件很容易做到的事情,但到目前为止它对我来说还没有奏效。

【问题讨论】:

    标签: r kalman-filter


    【解决方案1】:

    当解释变量个数为1时,测量和转移方程为: 在这张图片中,[1 Xt] 是Zt,νt 的错误是GGtdiag(2) 是 Tt。上图,我假设没有拦截,所以ct = matrix(0)dt &lt;- matrix(0, nrow=2, ncol=1)。估计c(μ0, β0)a0,它的方差是P0

    # using data
    namibia1 <- data.frame(Rpt = c(-7.9466, 7.0845, -6.4460, 5.0913, -0.1614, 10.4113, 11.5786, 
                                  -6.6402, -6.9760, -0.7926, 7.2900, 16.1156, -12.1467),
                          Rmt = c(-2.9151, -2.6468, -3.5493, -2.9928, -1.8305, -1.8491, -3.2975,
                                  -0.9582, -4.1794, -5.0553, 1.8858, -1.4464, -2.9151),
                          SMB = c(-2.5471, -4.3690, 4.2772, 12.1632, 5.1860, -5.3839, -1.4868, 
                                  12.1463, 10.8383, 8.4175, -11.1109, -32.2698, -0.5691),
                          ILLIQ = c(-1.7851, 18.3652, -3.2890, 4.9808, -13.8678, -2.9312, 18.5644,
                                    -2.6254, -23.1361, 3.2620, -8.3979, 37.6330, 14.7067),
                          Year = c(rep(2011, 12), 2012),
                          Month = c("January", "February", "March", "April", "May", "June", "Juli", "August",
                                    "September", "October", "November", "December", "Janualy"))
    
    # In your equations, m = 4, d = 1, n = nrow(namibia1)
    y <- namibia1$Rpt
    dt <- matrix(0, nrow=4, ncol=1)
    ct <- matrix(0)
    Tt <- diag(4)
    Zt <- array(t(cbind(rep(1,nrow(namibia1)), namibia1[,2:4])), dim=c(1, 4, nrow(namibia1)))
    a0 <- c(1, 1, 1, 1)
    P0 <- matrix(100, nrow=4, ncol=4)
    
    fit.fkf <- optim(c(1, 1, 1, 1, 1),
                     fn = function(par, ...) -fkf(HHt = diag(4) * par[1:4], GGt = matrix(par[5]), ...)$logLik,
                     yt = rbind(y), a0 = a0, P0 = P0, dt = dt, ct = ct,
                     Zt = Zt, Tt = Tt, check.input = T)
    sqrt(fit.fkf$par) # estimated sd
    fkf.obj <- fkf(a0, P0, dt, ct, Tt, Zt, HHt = diag(4) * fit.fkf$par[1:4],
                   GGt = matrix(fit.fkf$par[5]), yt = rbind(y))
    # the value of a0, P0 and optim's par mean nothing special.
    


    已编辑(抱歉,我忘记了坡度。)

    estimatedLevel <- fkf.obj$att[1,] + namibia1[,2] * fkf.obj$att[2,] + namibia1[,3] * fkf.obj$att[3,] + namibia1[,4] * fkf.obj$att[4,]
    
    plot(y)
    lines(estimatedLevel, col = "blue")
    

    【讨论】:

    • 非常感谢以上内容!非常感激。对于一只股票来说,这似乎是正确的。我添加了与前三只股票的另一个链接。请注意“Stock”下的标识符对于前 12 个是相同的,然后在接下来的 12 个中发生变化,依此类推。如何更新上述代码,以便可以包含 5(2011-2015)年数据的所有 22 只股票?
    • 您想要 22 个结果,不是吗?您将制作 22 个具有 5 年数据的 data.frames,并对所有这些数据使用上述代码。更新点只是 data.frame 的名称(上面代码中的 nanobial1)和结果对象的名称。如果列号发生变化,修改Zt &lt;- ... namibia1[,2:4]2:4(例如;3:5c(2,4,5))。
    • 如果可能的话,我实际上希望为每个变量获得一个系数。我可以将其与我的 OLS 回归系数进行比较(此处不包括)。我看到你列出了维度,但是因为我有 22 只股票(每只都有每月观察),不应该 d = 22 吗?此外,由于我还有七个数据集,我希望得到一串代码,可以轻松调整并准备好用于所有八个数据集。所有数据集中的列号都相同。但是,股票的数量不同。有没有可能设计出这样的代码?
    • 这个方法计算每个时间点的截距和每个变量的系数。 fkf.obj$att的第一行是截距,第二行是Rmt的系数,以此类推。抱歉,我不知道,因为我只用 d = 1 完成了 fkf。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-04-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-11
    • 1970-01-01
    相关资源
    最近更新 更多