Нахождение наивысших коррелированных акций до определенной c точки в R с еженедельными данными - PullRequest
0 голосов
/ 24 февраля 2020

Я пытался найти ответ на этот вопрос повсюду, и существует множество ответов о корреляции акций, но ничего не происходит вокруг одной точки.

Моя цель - найти, какие 5 акций имели наибольшую корреляцию с конкретный c идентификатор акции. Набор данных делится еженедельно в течение 10 лет.

Я попытался разбить наборы данных на два: 1) набор данных без запаса Мне нужно 2) набор данных с указанным c запасом.

Я знаю, что мне нужно делать еженедельное сравнение все акции на эту конкретную c акцию и каким-то образом находят, что наиболее коррелировало за определенный период времени.

Это примерно ясно в моей голове; однако, я застрял в реализации, потому что я не уверен, как сгруппировать недели и сравнить их с одной неделей и т. д.

Конечная цель: сравнить все запасы первой недели с первой строка второй таблицы и т. д.

Большое спасибо!

PS: Это не университетское задание, я просто пытаюсь улучшить свои навыки кодирования

1 Ответ

1 голос
/ 24 февраля 2020

Это шаги преобразования данных, чтобы вывести ваш набор данных в состояние, в котором вы можете легко рассчитать корреляции:

  1. Извлечение недели и года из столбца Дата, чтобы создать уникальный идентификатор недели по всему годы (week() и year() являются lubridate функциями).
  2. Столбец "Дата удаления".
  3. Расширьте набор данных, чтобы значение для каждого запаса находилось в отдельном столбце ( pivot_wider() - это функция tidyr).

Код:

library(lubridate)
library(dplyr)
library(tidyr)

week_stocks <-
  stocks %>%
  mutate(Week = paste(year(Date), week(Date), sep = "_")) %>%
  select(StockID, Value, Week) %>%
  pivot_wider(names_from = StockID, values_from = Value)

После преобразования вы используете cor(), чтобы получить корреляции всех акций. Поскольку вас интересуют только корреляции с одним указанным c запасом, вы можете использовать select(), чтобы отбросить все остальные запасы и их корреляции.

cor(week_stocks[-1]) %>%
  as_tibble(rownames = "stockIDs") %>%
  select(stockIDs, `210449`)

Некоторые общие замечания:

  1. В коде вашего вопроса вы используете команду attach(), обычно не рекомендуется использовать ее для фреймов данных, поскольку это может привести к путанице и ошибкам; см. Этот пост .
  2. Если вы хотите улучшить свои навыки R, проверьте tidyverse и его пакеты. Это большой набор пакетов, которые разделяют концепцию операций с данными, очень мощный и позволяет решать большинство проблем с данными с помощью небольшого набора лаконичных команд.
  3. При задании вопроса о StackOverflow Обычно хорошей практикой является включение ваших данных или хотя бы их части. dput() предоставляет код, необходимый для этого. Вставив вывод dput() в ваш вопрос, другие пользователи могут воссоздать ваши данные в своей среде и выработать свой ответ, одновременно проверяя свой код на соответствие вашим данным. Например, вот так выглядит вывод dput() моего фиктивного набора данных, который я использовал для создания кода в своем ответе.

Код:

dput(stocks)

Вывод:

structure(list(StockID = c(16139, 210449, 210449, 210449, 210449, 
210449), Date = c("2015-09-11", "2015-09-11", "2015-09-18", "2015-09-25", 
"2015-10-02", "2015-10-09"), Value = c(0.055063, 0.01851903, 
0.01338099, 0.03982749, 0.04798457, 0.02433628)), row.names = c(NA, 
-6L), class = c("tbl_df", "tbl", "data.frame"))
...