我正在使用quantmod
下载以嵌套列表形式出现的期权链。
但是,出于我的目的,我希望以数据框的形式获取信息,其中每个列表的名称都包含在该数据框的一列中(因此,需要两列,其中包含该期权的行使日期)第二种是期权的类型-看涨期权或看跌期权)。
这在R中如何实现?
有关可重现的示例:
library(quantmod)
AAPL.2015 <- getOptionChain("AAPL", "2019/2021")
如果可能的话,我应该怎么做才能以英语获取期权行权日?
答案 0 :(得分:1)
我无法复制您的示例,但是您要尝试做的很简单。您可以使用do.call
调用列表中的rbind
函数,最后得到的是一个漂亮的数据帧。
list <- getOptionChain("AAPL", "2019/2021")
data <- do.call(rbind, list)
答案 1 :(得分:1)
考虑Map
至rbind
的各个调用,并在数据帧中添加所需的指标列。由于各个数据帧位于嵌套的命名列表中,因此使用提取功能[
。
然后,在结果数据帧列表中运行最后的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)
使用dplyr
和purrr
中的几个函数可能会更加灵活。 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")