Как я могу реализовать модель ненаблюдаемых компонентов в R? - PullRequest
0 голосов
/ 03 мая 2018

Мне нужно проверить, влияет ли день недели или месяц года на доходность акций. Я решил использовать ненаблюдаемую модель компонентов с пакетом "rucm" в R, потому что она может извлекать сезонные характеристики из временных рядов. В моем случае я хочу определить, существует ли ежедневная и ежемесячная сезонность. Мой набор данных - это просто временной ряд ежедневных возвратов акций:

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)

Я положил сезон.длину = 30 случайно. Я думал, что если у меня есть ежедневные данные, а сезонность - ежедневная, season.length должна быть 1, но она не принимает 1.

И мой вывод выглядит так

Расчетная дисперсия: "Нерегулярные переменные" "Уровень_различия" "Сезонные перемены"

Как вы видите, я не получил много информации о том, как день недели или месяц года влияет на доходность акций. Не могли бы вы помочь мне с этой проблемой?

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 голосов
/ 11 мая 2018

Я не упоминаю об использовании 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, вы можете найти сезонность. Вот учебник временных рядов .

Другой вариант - использовать двойной сезонный ряд .

Поскольку вы не предоставили больше данных, мне трудно продемонстрировать это здесь. Но оба связанных руководства помогут вам структурировать ваш код и ваши данные для проведения сезонного анализа. Я предоставил anova в качестве руководства по началу работы и точки запуска, чтобы вы подумали об этом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...