1

我正在尝试重现此示例,该示例使用 tidyquant 框架调整股息的股票价格。

这是原始示例:

library(quantmod)
library(tidyquant)
library(timetk)
  
SPY.Close <- Cl(getSymbols("SPY", auto.assign=FALSE))
SPY.Div <- getDividends("SPY", auto.assign=FALSE)

# Within xts framework
SPY <- merge(SPY.Close, SPY.Div)

# now adjust close for dividends
ratios <- adjRatios(dividends=SPY[,"SPY.div"], close=SPY[,"SPY.Close"])
SPY$SPY.Adjusted <- (ratios$Split * ratios$Div) * SPY$SPY.Close
# only keep dates from the original object
SPY <- SPY[index(SPY.Close), ]

这是我在 tidyquant 中的尝试:

#convert xts to tibble
spy.tbl <- tk_tbl(merge(SPY.Close, SPY.Div), preserve_index = TRUE)

#add a splits placeholder because adjRatios() complains if its not there.
spy.tbl$SPY.splits <- 0

spy.adj <- spy.tbl %>% 
  tq_mutate(
    select = c(index, SPY.Close, SPY.div, SPY.splits),
    mutate_fun = adjRatios,
    splits = SPY.splits,
    dividends = SPY.div,
    close = SPY.Close
  )

但这给出了错误: fun_transmute(., ...) 中的错误:未使用的参数 (.)

我尝试了各种参数组合,但我似乎无法让它发挥作用。

4

2 回答 2

1

以防万一有人搜索这个主题,我已经用下面的代码解决了我自己的问题。这样做的好处是它是在 tidyverse 框架中完成的,并且很容易通过 group_by(ticker) 扩展到许多ticker。

data 是一个带有 Close 和前一个 close 的数据框:

        Date ticker  Close Cl.prev
1 2017-08-14 SPY_US 246.54  244.12
2 2017-08-15 SPY_US 246.51  246.54
3 2017-08-16 SPY_US 246.94  246.51
4 2017-08-17 SPY_US 243.09  246.94
5 2017-08-18 SPY_US 242.71  243.09
6 2017-08-21 SPY_US 242.90  242.71

div.data 是一个只有股息支付的小标题,这里的日期是除息日期。

  ticker       Date      div
2 SPY_US 2017-09-15 1.234574
3 SPY_US 2017-12-15 1.351333
4 SPY_US 2018-03-16 1.096775
5 SPY_US 2018-06-15 1.245568

该链将价格数据合并到 div.data 中,以获取价格以计算 adjRatio

  div.data <- div.data %>% 
    left_join(., data[, c("Date", "ticker", "Close", "Cl.prev")], by = c("ticker", "Date"))  

该链计算 adjRatio:

  div.data <- div.data %>% 
    mutate(ratio = 1-div / Cl.prev) %>% 
    mutate(adjRatio = rev(cumprod(rev(ratio)))) %>% 
    select(-Close, -Cl.prev, -ratio)

该链将 div.data 合并回价格系列,传播 adjRatio 并计算调整后的收盘价:

data.adj <- data %>% 
  left_join(., div.data, by = c("ticker", "Date") ) %>% 
  mutate(adjRatio = dplyr::lead(adjRatio, n=1)) %>% 
  mutate(adjRatio = na.locf(adjRatio, fromLast = TRUE, na.rm = FALSE)) %>% 
  mutate(adjRatio = na.fill(adjRatio, fill = 1.0)) %>% 
  mutate(Cl.adj = Close * adjRatio) %>% 
  select(-Cl.prev, -div, -adjRatio)

这是最终数据:

> head(data.adj)
        Date ticker  Close   Cl.adj
1 2017-08-14 SPY_US 246.54 242.0153
2 2017-08-15 SPY_US 246.51 241.9858
3 2017-08-16 SPY_US 246.94 242.4079
4 2017-08-17 SPY_US 243.09 238.6286
5 2017-08-18 SPY_US 242.71 238.2556
6 2017-08-21 SPY_US 242.90 238.4421
于 2018-08-15T13:57:08.763 回答
0

目前只有tq_mutate()和两种形式tq_mutate_xy()。该adjRatios()函数有 3 个输入,需要 x,y,z。

于 2018-08-10T20:20:05.377 回答