从列表中提取股票股利数据并转换为Dataframe

dkqlctbz  于 2023-02-01  发布在  其他
关注(0)|答案(2)|浏览(85)

我使用R中quantmod包中的getDividends函数来获取一个公司列表的股息,我有一个要获取股息的列表,存储为:

stocks <- c("AAPL", "MMM", "CAT", "MSFT", "TSLA")

在单个股票代码上运行getDividends时:

getDividends("AAPL")

它给出的结果如下所示:

我试着编写一个函数来为列表中的所有股票代码执行上述步骤:

dividends_list <- sapply(stocks, function(x) try(getDividends(x, auto.assign = FALSE)))

在这里,我想把这个列表转换成一个 Dataframe ,并且能够获得存储股息发放日期的行名。
希望 Dataframe 输出如下所示:

date        ticker   dividend
2022-11-04   AAPL     0.23
2022-08-05   AAPL     0.23
2022-11-17   MMM      1.49
2022-08-19   MMM      1.49
2023-01-19   CAT      1.20
2022-10-21   CAT      1.20
etc.
vyswwuz2

vyswwuz21#

使用tidyquant的建议

library(tidyquant)
library(tidyverse)

stocks <- c("AAPL", "MMM", "CAT", "MSFT", "TSLA")

tq_get(stocks, get = "dividends") %>% 
  group_by(symbol) %>% 
  slice_tail(n = 2)

# A tibble: 8 × 3
# Groups:   symbol [4]
  symbol date       value
  <chr>  <date>     <dbl>
1 AAPL   2022-08-05  0.23
2 AAPL   2022-11-04  0.23
3 CAT    2022-10-21  1.2 
4 CAT    2023-01-19  1.2 
5 MMM    2022-08-19  1.49
6 MMM    2022-11-17  1.49
7 MSFT   2022-08-17  0.62
8 MSFT   2022-11-16  0.68
mkh04yzy

mkh04yzy2#

我们可以使用

library(quantmod)
library(zoo)
out <- do.call(rbind, lapply(Filter(nrow, dividends_list), 
    \(x) {
    x1 <- fortify.zoo(x)
    x1$ticker <- sub("\\.div", "", names(x1)[2])
   names(x1) <- c("date", "dividend", "ticker")
  x1})
)
row.names(out) <- NULL
  • 输出
library(dplyr)
out %>% 
 slice_tail(n = 2, by = 'ticker')
        date dividend ticker
1 2022-08-05     0.23   AAPL
2 2022-11-04     0.23   AAPL
3 2022-08-19     1.49    MMM
4 2022-11-17     1.49    MMM
5 2022-10-21     1.20    CAT
6 2023-01-19     1.20    CAT
7 2022-08-17     0.62   MSFT
8 2022-11-16     0.68   MSFT

相关问题