【问题标题】:Calculating rolling Beta计算滚动 Beta
【发布时间】:2021-10-26 02:25:19
【问题描述】:

我正在尝试为股票生成滚动 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()

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

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

【问题讨论】:

    标签: r performanceanalytics tidyquant tibbletime


    【解决方案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 中找到几个示例。

    【讨论】:

    • 建议 library(zoo); betafun &lt;- function(x) cov(Re(x), Im(x)) / var(Im(x)); all_returns_df %&gt;% mutate(beta = rollapplyr(daily_return + mkt_daily_return * 1i, 40, betafun, fill = NA) 注意 rollapplyr 末尾的 r。我们还省略了不需要的参数,因为它们是默认值。
    • @G.Grothendieck 谢谢。这是一个很棒的功能。如果您还可以写出以下函数,将不胜感激:(1) CAPM.beta.bull(Ra, Rb, Rf = 0) 和 (2) CAPM.beta.bear(Ra, Rb, Rf = 0) for以同样的方式实现。
    • 在我上一条评论中定义betafun 的地方试试这些:beta.bull &lt;- function(x, s = x[Im(x) &gt; 0]) betafun(s); beta.bear &lt;- function(x, s = x[Im(x) &lt; 0]) betafun(s)
    猜你喜欢
    • 2021-02-26
    • 2021-06-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-27
    • 2012-08-14
    • 2017-02-27
    • 1970-01-01
    相关资源
    最近更新 更多