我正在尝试为股票生成滚动betas,但我的滚动函数不起作用。到目前为止,我尝试了以下几点:
library(tidyquant)
library(tidyverse)
library(tibbletime)
ticker_data <- tq_get(c("AAPL", "SPY"))
daily_returns <- ticker_data %>%
group_by(symbol) %>%
tq_transmute(select = close,
mutate_fun = periodReturn,
period = "daily",
col_rename = "daily_return") %>%
ungroup
all_returns_df <- left_join(daily_returns %>% filter(symbol == "AAPL"),
daily_returns %>% filter(symbol == "SPY") %>%
select(-symbol) %>%
rename(mkt_daily_return = daily_return))
# Can generate one Beta for all dates
all_returns_df %>%
tq_performance(Ra = daily_return,
Rb = mkt_daily_return,
scale = 252,
performance_fun = table.CAPM)
# Rolling Beta is not working
#Function that is not working
roll_beta <- rollify(.f = function(xy){ tq_performance(data = xy,
Ra = daily_return,
Rb = mkt_daily_return,
scale = 252,
performance_fun = table.CAPM)},
window = 40)
# This fails
all_returns_df %>% roll_beta()你有什么办法让我这么做吗?
我的主要目标是以一种“整洁”的方式来做这件事。
发布于 2021-08-26 12:57:30
注: tibbletime已停用你应该调查一下时刻表。
现在timetk用slidify代替了rollify函数。但是我不能让它正常工作,因为它一直在抱怨这个时期。但是回到zoo::rollapply可以解决这个问题。由于某些原因,获取整个表也是一个问题。
下面的代码将适用于给定的示例并返回测试版。我使用函数CAPM.beta来返回测试版。
CAPM_beta_roll <- function(data, width = 40) {
data <- timetk::tk_xts(data, date_var = date)
beta <- zoo::rollapply(data = data[, 1],
FUN = CAPM.beta,
Rb = data[, 2],
width = width,
by = 1,
align = "right",
by.column = TRUE)
names(beta) <- "beta"
out <- timetk::tk_tbl(beta, preserve_index = FALSE)
out$beta
}
all_returns_df %>%
mutate(beta = CAPM_beta_roll(.))
# A tibble: 2,680 x 5
symbol date daily_return mkt_daily_return beta
<chr> <date> <dbl> <dbl> <dbl>
1 AAPL 2011-01-03 0 0 NA
2 AAPL 2011-01-04 0.00522 -0.000551 NA
3 AAPL 2011-01-05 0.00818 0.00520 NA
4 AAPL 2011-01-06 -0.000808 -0.00196 NA
5 AAPL 2011-01-07 0.00716 -0.00196 NA
6 AAPL 2011-01-10 0.0188 -0.00126 NA
7 AAPL 2011-01-11 -0.00237 0.00354 NA
8 AAPL 2011-01-12 0.00814 0.00902 NA
9 AAPL 2011-01-13 0.00366 -0.00163 NA
10 AAPL 2011-01-14 0.00810 0.00724 NA
# ... with 2,670 more rows
Warning message:
Problem with `mutate()` column `beta`.
i `beta = CAPM.beta_roll(.)`.
i Non-numeric columns being dropped: symbol, date 您可以忽略警告消息。这些来自time_tk::tk_xts
为了更快地实现该函数,您可以在此SO post中找到几个示例。
https://stackoverflow.com/questions/68931512
复制相似问题