将马尔可夫切换模型拟合到 R 中的数据
Fitting Markov Switching Models to data in R
我正在尝试使用 R 中的包 MSwM
将两种马尔可夫切换模型拟合到 log-returns 的时间序列。我正在考虑的模型是回归模型只有截距和 AR(1) 模型。
这是我正在使用的代码:
library(tseries)
#Prices
ftse<-get.hist.quote(instrument="^FTSE", start="1984-01-03", end="2014-01-01", quote="AdjClose", compression="m")
#Log-returns
ftse.ret<-diff(log(ftse))
library(MSwM)
#Model with only intercept
mod<-lm(ftse.ret ~ 1)
#Fit regime-switching model
msmFit(mod, k=2, sw=c(T,T), p=0, data=ftse.ret)
#AR(1) model
mod<-lm(ftse.ret[2:360] ~ ftse.ret[1:359])
#Fit regime-switching model
msmFit(mod, k=2, sw=c(T,T,T), p=1, data=ftse.ret)
在这两种情况下,函数 msmFit
都不起作用。这是我收到的错误消息:
Error in (function (classes, fdef, mtable) :
unable to find an inherited method for function ‘msmFit’ for signature ‘"lm", "numeric", "logical", "numeric", "zoo", "missing"’
我不知道为什么会收到此错误消息,因为我将 msmFit
对象用作函数的第一个参数 lm
,这是一个合适的 class对于函数的参数。
您在将数据传递给 msmFit 时有一个不必要的参数,这是不必要的。数据已包含在 mod 中。以下代码为我运行:
library(tseries)
#Prices
ftse<-get.hist.quote(instrument="^FTSE", start="1984-01-03", end="2014-01-01", quote="AdjClose", compression="m")
#Log-returns
ftse.ret<-diff(log(ftse))
library(MSwM)
#Model with only intercept
mod<-lm(ftse.ret ~ 1)
#Fit regime-switching model
mod.mswm=msmFit(mod, k=2, sw=c(T,T), p=0)
plot(mod.mswm)
当您设置 p = 1 时,msmFit model 将为您添加一个 AR(1) 系数。所以你可以简单地传入 model 只有截距 (mod) 并设置 p = 1。下面的代码应该有效。
library(tseries)
#Prices
ftse<-get.hist.quote(instrument="^FTSE", start="1984-01-03", end="2014-01-01", quote="AdjClose", compression="m")
#Log-returns
ftse.ret<-diff(log(ftse))
library(MSwM)
#Model with only intercept
mod<-lm(ftse.ret ~ 1)
#Fit regime-switching model
msm_intercept <- msmFit(mod, k=2, sw=c(T,T), p=0)
#Fit regime-switching model with AR(1) model
msm_ar1 <- msmFit(mod, k=2, sw=c(T,T,T), p=1)
我正在尝试使用 R 中的包 MSwM
将两种马尔可夫切换模型拟合到 log-returns 的时间序列。我正在考虑的模型是回归模型只有截距和 AR(1) 模型。
这是我正在使用的代码:
library(tseries)
#Prices
ftse<-get.hist.quote(instrument="^FTSE", start="1984-01-03", end="2014-01-01", quote="AdjClose", compression="m")
#Log-returns
ftse.ret<-diff(log(ftse))
library(MSwM)
#Model with only intercept
mod<-lm(ftse.ret ~ 1)
#Fit regime-switching model
msmFit(mod, k=2, sw=c(T,T), p=0, data=ftse.ret)
#AR(1) model
mod<-lm(ftse.ret[2:360] ~ ftse.ret[1:359])
#Fit regime-switching model
msmFit(mod, k=2, sw=c(T,T,T), p=1, data=ftse.ret)
在这两种情况下,函数 msmFit
都不起作用。这是我收到的错误消息:
Error in (function (classes, fdef, mtable) :
unable to find an inherited method for function ‘msmFit’ for signature ‘"lm", "numeric", "logical", "numeric", "zoo", "missing"’
我不知道为什么会收到此错误消息,因为我将 msmFit
对象用作函数的第一个参数 lm
,这是一个合适的 class对于函数的参数。
您在将数据传递给 msmFit 时有一个不必要的参数,这是不必要的。数据已包含在 mod 中。以下代码为我运行:
library(tseries)
#Prices
ftse<-get.hist.quote(instrument="^FTSE", start="1984-01-03", end="2014-01-01", quote="AdjClose", compression="m")
#Log-returns
ftse.ret<-diff(log(ftse))
library(MSwM)
#Model with only intercept
mod<-lm(ftse.ret ~ 1)
#Fit regime-switching model
mod.mswm=msmFit(mod, k=2, sw=c(T,T), p=0)
plot(mod.mswm)
当您设置 p = 1 时,msmFit model 将为您添加一个 AR(1) 系数。所以你可以简单地传入 model 只有截距 (mod) 并设置 p = 1。下面的代码应该有效。
library(tseries)
#Prices
ftse<-get.hist.quote(instrument="^FTSE", start="1984-01-03", end="2014-01-01", quote="AdjClose", compression="m")
#Log-returns
ftse.ret<-diff(log(ftse))
library(MSwM)
#Model with only intercept
mod<-lm(ftse.ret ~ 1)
#Fit regime-switching model
msm_intercept <- msmFit(mod, k=2, sw=c(T,T), p=0)
#Fit regime-switching model with AR(1) model
msm_ar1 <- msmFit(mod, k=2, sw=c(T,T,T), p=1)