У меня есть данные, которые выглядят примерно так
co_code company_name co_stkdate dailylogreturn
1 A 01-01-2000 0.76
1 A 02-01-2000 0.75
.
.
.
1 A 31-12-2019 0.54
2 B 01-01-2000 0.98
2 B 02-01-2000 0.45
. . И так далее
Я хочу найти еженедельные возвраты, который равен сумме возврата ежедневного журнала за одну неделю.
вывод должен выглядеть примерно так
co_code company_name co_stkdate weeklyreturns
1 A 07-01-2000 1.34
1 A 14-01-2000 0.95
.
.
.
1 A 31-12-2019 0.54
2 B 07-01-2000 0.98
2 B 14-01-2000 0.45
Я пытался применить функции в пакете quantmod, но эти функции применимы только к объектам xts. Другая проблема с объектами xts заключается в том, что нельзя использовать функцию «group_by()». Таким образом, я хочу работать только в обычном фрейме данных.
Код выглядит примерно так
library(dplyr)
### Reading txt file
df <- read.csv("33339_1_120_20190405_165913_dat.csv")
df <- mutate(df, "dailylogrtn"=log(nse_returns)) %>% as.data.frame()
df$co_stkdate<- as.Date(as.character(df$co_stkdate), format = "%d-%m-%Y")
что-то вроде DF %>% group_by(group = ceiling((1:nrow(DF)/ 7)))
, а затем вычислить средние значения для каждой группы.
Как выполнить это «типичное упражнение»? Любые идеи... Добавление дней
Конечно. один из способов – заполнить эти дни, и, поскольку это были праздники, мы обычно берем цены закрытия последнего торгового дня в эти дни, а также цены закрытия. Это делается для того, чтобы избежать каких-либо дат, превышающих фактические 52 или 53 недели.
Поскольку у меня нет образцов данных, я предполагаю, что это должно работать:
df %>%
group_by(group = ceiling((1:nrow(df)/ 7))) %>%
summarise(mean = mean(weeklyreturns))
Поскольку мы не знаем, сколько дней в каждой неделе вы получили dailylogreturn
, могут быть NA, я рекомендую группировать по неделям и годам:
#sample data
df <- data.frame(co_stkdate = rep(seq.Date(from = as.Date("2000-01-07"), to = as.Date("2000-02-07"), by = 1), 2),
dailylogreturn = abs(round(rnorm(64, 1, 1), 2)),
company_name = rep(c("A", "B"), each = 32))
df %>%
mutate(co_stkdate = as.POSIXct(co_stkdate),
year = strftime(co_stkdate, "%W"),
week = strftime(co_stkdate, "%Y")) %>%
group_by(company_name, year, week) %>%
summarise(weeklyreturns = sum(dailylogreturn, na.rm = TRUE))
# A tibble: 12 x 4
# Groups: company_name, year [12]
company_name year week weeklyreturns
<fct> <chr> <chr> <dbl>
1 A 01 2000 6.31
2 A 02 2000 6.11
3 A 03 2000 6.02
4 A 04 2000 8.27
5 A 05 2000 4.92
6 A 06 2000 0.5
7 B 01 2000 1.82
8 B 02 2000 6.6
9 B 03 2000 7.55
10 B 04 2000 7.63
11 B 05 2000 7.54
12 B 06 2000 1.03
Благодарю. Это сработало для меня. Но я получаю вывод вроде 00_2000 00_2001 00_2002 00_2003... затем 01_2000 01_2001. Как упорядочить этот столбец?
Хм, если вы заботитесь о порядке, вы можете разделить столбец yearweek
на один для week
и один для year
, сгруппировать по обоим столбцам (+ название компании) и затем упорядочить по week
и year
, если необходимо.
Большое спасибо.
Насколько я понимаю из своих торговых знаний, почти на всех биржах есть выходные и выходные дни (суббота и воскресенье). вам нужно создать набор данных, в который должны быть включены эти дни, но торговля возвращает в эти дни 0, чтобы получить полные 52 (или 53) недели в году (в зависимости от високосных и невисокосных лет). Это типичное упражнение. Но если вы хотите продолжить свои фактические данные, используйте потолок() для группировки данных по 7 дням.