如何在R

时间:2019-09-21 19:43:47

标签: r list dataframe

我正在使用quantmod下载以嵌套列表形式出现的期权链。

但是,出于我的目的,我希望以数据框的形式获取信息,其中每个列表的名称都包含在该数据框的一列中(因此,需要两列,其中包含该期权的行使日期)第二种是期权的类型-看涨期权或看跌期权)。

这在R中如何实现?

有关可重现的示例:

library(quantmod)
AAPL.2015 <- getOptionChain("AAPL", "2019/2021")

enter image description here

如果可能的话,我应该怎么做才能以英语获取期权行权日?

3 个答案:

答案 0 :(得分:1)

我无法复制您的示例,但是您要尝试做的很简单。您可以使用do.call调用列表中的rbind函数,最后得到的是一个漂亮的数据帧。

list <- getOptionChain("AAPL", "2019/2021")

data <- do.call(rbind, list)

答案 1 :(得分:1)

考虑Maprbind的各个调用,并在数据帧中添加所需的指标列。由于各个数据帧位于嵌套的命名列表中,因此使用提取功能[

然后,在结果数据帧列表中运行最后的do.call + rbind。注意:rbind假定调用和放置数据帧保持完全相同的名称和列数。

call_put_func <- function(nm, call_df, put_df) {      
     cbind(rbind(transform(call_df, option_type = "call"),
                 transform(put_df, option_type = "put")
           ), date_of_strike = nm)
}

APPL_flat_df_list <- Map(call_put_func, nm = names(AAPL.2015), 
                                        call_df = lapply(AAPL.2015, "[[", "calls"), 
                                        put_df = lapply(AAPL.2015, "[[", "puts")
                        )

APPL_df <- do.call(rbind, unname(APPL_flat_df_list))

答案 2 :(得分:1)

使用dplyrpurrr中的几个函数可能会更加灵活。 dplyr::bind_rows可以获取数据帧列表,并且它们可以具有不同的名称,而基础rbind一次只能处理2个数据帧。 bind_rows还有一个参数.id,它将创建一列列表项名称。 purrr::map_dfr调用列表中的函数,并返回将它们全部行绑定在一起的数据帧;因为它环绕bind_rows,所以它还有一个.id参数。

可以使用设置这些ID的方法很有帮助,因为您有2套ID:一组日期,另一组是看跌期权和看跌期权。在内部bind_rows内设置一个ID,在map_dfr内设置一个ID均可。

编写了一个函数,使它更易于查看:

library(quantmod)
AAPL.2015 <- getOptionChain("AAPL", "2019/2021")

aapl_df <- purrr::map_dfr(AAPL.2015, function(d) {
  dplyr::bind_rows(d, .id = "type")
  }, .id = "date")

head(aapl_df)
#>          date  type Strike  Last   Chg   Bid   Ask Vol OI
#> 1 Sep.27.2019 calls    140 79.50  9.50 77.60 77.90  10 30
#> 2 Sep.27.2019 calls    145 75.85  0.00 72.70 73.30  NA 28
#> 3 Sep.27.2019 calls    150 72.22  0.00 67.85 67.90  10 91
#> 4 Sep.27.2019 calls    155 52.53  0.00 65.80 69.90  NA 10
#> 5 Sep.27.2019 calls    160 60.10  0.00 57.85 58.15   2 11
#> 6 Sep.27.2019 calls    165 54.40 15.95 52.65 52.90   9 16

或更常见的带有功能速记符号的dplyr管道中:

library(dplyr)
aapl_df <- AAPL.2015 %>%
  purrr::map_dfr(~bind_rows(., .id = "type"), .id = "date")