0

我正在尝试为股票生成滚动 beta 并且我的滚动功能不起作用。到目前为止我已经尝试过:

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()

关于如何使这项工作适合我的任何想法?

我的主要目标是以“整洁”的方式做到这一点。

4

1 回答 1

1

注意:tibbletime 已停用。你应该看看timetk。

现在 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中找到几个示例。

于 2021-08-26T12:57:29.880 回答