如何在R中实现Unobserved组件模型?

时间:2018-05-03 05:44:19

标签: r

我需要检查一周中的某一天或一年中的某一天是否对股票收益产生影响。我决定在R中使用带有“rucm”包的未观察到的组件模型,因为它可以从时间序列中提取季节性特征。在我的情况下,我想确定是否存在每日和每月的季节性。我的数据集只是每日股票回报的时间序列:

structure(list(Date = structure(c(1388966400, 1389139200, 1389225600, 
1389312000, 1389571200, 1389657600, 1389744000, 1389830400, 1389916800, 
1390176000, 1390262400, 1390348800, 1390435200), class = c("POSIXct", 
"POSIXt"), tzone = "UTC"), LogReturn = c(-0.009, 0.016, 0.021, 
0.036, 0.049, 0.092, 0.023, -0.05, 0.044, -0.018, 0.001, -0.021, 
-0.022)), .Names = c("Date", "LogReturn"), row.names = c(NA, 
-13L), class = c("tbl_df", "tbl", "data.frame"))

enter image description here这就是它的样子

我使用的代码:

install.packages(rucm)
library(rucm)
model1<-ucm(formula=LogReturn~0,data=data, level=TRUE,slope=FALSE,season=TRUE,season.length=30)

我随机地将season.length = 30。我想如果我每天都有数据和季节性,那么season.length应该是1,但它不接受1.

我的输出看起来像这样

估计差异: “Irregular_Variance”“Level_Variance”“Season_Variance”

正如您所看到的,我没有得到关于一周中的哪一天或一年中的某个月如何影响股票回报的大量信息。你能帮我解决这个问题吗?

UPDATE1。我在我的数据集中添加了一些功能。现在它显示每个日期的星期几,并为一周中的每一天添加代理变量。

structure(list(Date = structure(c(1388966400, 1389139200, 1389225600, 
1389312000, 1389571200, 1389657600, 1389744000, 1389830400, 1389916800, 
1390176000, 1390262400, 1390348800, 1390435200), class = c("POSIXct", 
"POSIXt"), tzone = "UTC"), LogReturn = c(-0.009, 0.016, 0.021, 
0.036, 0.049, 0.092, 0.023, -0.05, 0.044, -0.018, 0.001, -0.021, 
-0.022), Dayoftheweek = c("Monday", "Wednesday", "Thursday", 
"Friday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", 
"Monday", "Tuesday", "Wednesday", "Thursday"), proxymonday = c(1, 
0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0), proxytuesday = c(0, 0, 0, 
0, 0, 1, 0, 0, 0, 0, 1, 0, 0), proxywednesday = c(0, 1, 0, 0, 
0, 0, 1, 0, 0, 0, 0, 1, 0), proxythursday = c(0, 0, 1, 0, 0, 
0, 0, 1, 0, 0, 0, 0, 1), proxyfriday = c(0, 0, 0, 1, 0, 0, 0, 
0, 1, 0, 0, 0, 0)), .Names = c("Date", "LogReturn", "Dayoftheweek", 
"proxymonday", "proxytuesday", "proxywednesday", "proxythursday", 
"proxyfriday"), row.names = c(NA, -13L), class = c("tbl_df", 
"tbl", "data.frame"))

看起来像enter image description here

1 个答案:

答案 0 :(得分:0)

我没有提到使用RUCM,因为我对未观察到的组件模型不够熟悉。但似乎你提出的问题可以用另一种方式回答。

在我看来,您感兴趣的是两个独立的问题。第一个是作为自变量的星期几,第二个是作为独立成分的一年中的一个月。在某种程度上,您也可能想要查看一周中某一天*月份的互动情况。所以让我们解决这个问题:

首先让我们看看一周中的哪一天。你想先找到每天的平均美元。在这种情况下,您的零假设将是没有日常差异与替代假设相比,至少一天将与其他日子有显着差异。要看到这一点,我们使用anova作为dayofweek的函数:(在此示例中,dat是数据集的名称)

datsum <- anova(lm(LogReturn~dayofweek))

这会产生:

> datsum
Analysis of Variance Table

Response: LogReturn
          Df    Sum Sq   Mean Sq F value Pr(>F)
dayofweek  4 0.0066421 0.0016605   1.266 0.3587
Residuals  8 0.0104932 0.0013116  

根据您提供的数据,似乎没有明显的日效。但就像你说的那样,这只是数据的一小部分。

现在,你可以这样做基于月份,虽然由于几个月没有几天的球衣号码,你将不得不调整它。但是你可以通过anova(lm(LogReturn ~ Month, data = dat))再次做同样的事情。

现在使用ARIMA建模,您可以找到季节性。这是time series的教程。

另一种选择是使用double-seasonal time series

由于您没有提供更多数据,因此我很难在此处进行演示。但是,这两个链接指南将帮助您构建代码和数据以执行季节性分析。我提供了anova作为起始指南和启动点,供您思考。