getOptionChain有多个expiries

时间:2013-07-21 17:34:04

标签: r option quantmod chain

我使用 R 通过 quantmod 包下载选项链。 我的目标是下载和导出选项链,以便在其他软件上使用。

如果我只下载前月到期,我可以使用以下行正确导出到.txt文件:

library(quantmod)
aapl_front <- getOptionChain ('AAPL')
front <- do.call('rbind', aapl_front)
write.table (front, 'data_front.txt')

下载所有到期时出现问题。这里rbind函数无法按照我的想法运行,并且导出一个无用的表;这些是:

aapl_total <- getOptionChain('AAPL', NULL)
total <- do.call('rbind', aapl_total)
write.table(total, 'data_total.txt')

我想在第二种情况下aapl_total是一个列表列表,其中包含所有的expiries,我无法正确拆分它们。

有什么建议吗?

3 个答案:

答案 0 :(得分:3)

您可以遍历每个过期时间和rbind来电和放置。

lapply(aapl_total, function(x) do.call(rbind, x))

然后,你有一个列表,你可以do.call(rbind())

一步到位:

do.call(rbind, lapply(aapl_total, function(x) do.call(rbind, x)))

答案 1 :(得分:1)

这些不再适用于期权数据,因为雅虎更改了其网站,请使用Google财经作为期权数据源,这里有一个样本

示例:getOptionChain(&#39; GOOG&#39;,3)表示谷歌选项链的下一个3个到期日

library(rjson)
library(plyr)
getOptionChain <- function (symbol,exp) {
  # symbol = "WMT"  

  url <- "https://www.google.com/finance/option_chain?q="
  # url <- paste(url, symbol, "&expd=15&expm=01&expy=2016&output=json", sep="")
  url <- paste(url, symbol, "&output=json", sep="")

  google.options.json <- readLines(url, warn = FALSE)

  options.json <- google.options.json
  options.json <- gsub("[{]", "{\"", options.json)
  options.json <- gsub("[:]", "\":", options.json)
  options.json <- gsub("[,] ", "$$$", options.json)
  options.json <- gsub("[,]", ",\"", options.json)
  options.json <- gsub("[,]\"[{]", ",{", options.json)
  options.json <- gsub("[$][$][$]", ", ", options.json)

  options.list <- fromJSON(options.json)

  #get the options chain without an expiry date and then determine longest option

  last.expiration <- length(options.list[["expirations"]])
  if ( exp>0 && exp< last.expiration) {
    last.expiration <-exp
  } 
  month <- sprintf("%02d", options.list[["expirations"]][[last.expiration]]$m)
  day <- sprintf("%02d", options.list[["expirations"]][[last.expiration]]$d )
  year <- options.list[["expirations"]][[last.expiration]]$y

  #now request option chain for the longest expiry

  url <- "https://www.google.com/finance/option_chain?q="
  url <- paste(url, symbol, "&expd=", day, "&expm=", month, "&expy=", year, "&output=json", sep="")

  google.options.json <- readLines(url, warn = FALSE)

  options.json <- google.options.json
  options.json <- gsub("[{]", "{\"", options.json)
  options.json <- gsub("[:]", "\":", options.json)
  options.json <- gsub("[,] ", "$$$", options.json)
  options.json <- gsub("[,]", ",\"", options.json)
  options.json <- gsub("[,]\"[{]", ",{", options.json)
  options.json <- gsub("[$][$][$]", ", ", options.json)

  options.list <- fromJSON(options.json)

  options <- ldply (options.list[["calls"]], data.frame)
  options <- rename(options, c("s" = "contract.name",
                               "p" = "price",
                               "b" = "bid", 
                               "a" = "ask",
                               "c" = "change",
                               "cp" = "change.percentage",
                               "oi" = "open.interest",
                               "vol" = "volume"))
  options <- options[c( "contract.name", 
                        "strike",
                        "price", 
                        "change", 
                        "change.percentage",
                        "bid", 
                        "ask", 
                        "volume",
                        "open.interest")]


  options$expiry <- paste(options.list[["expiry"]]$m, options.list[["expiry"]]$d, options.list[["expiry"]]$y, sep = "/")

  last.expiration <- length(options.list[["expirations"]])
  options$longest.available.expiry <- paste(options.list[["expirations"]][[last.expiration]]$m,
                                            options.list[["expirations"]][[last.expiration]]$d, 
                                            options.list[["expirations"]][[last.expiration]]$y, sep = "/")

  options$underlying.price <- options.list[["underlying_price"]]

  return(options)
}

答案 2 :(得分:0)

这是另一种方法。我恢复了列表结构:

ni <- seq_along(aapl_total)
nj <- seq_along(aapl_total[[1]])
nij <- as.matrix(expand.grid( ni=ni,  nj=nj))
data <- apply(nij, 1, function(ij) aapl_total[[ij]])

然后我把它放在一个data.frame:

res <- do.call(rbind,data)

编辑添加列类型,因为rownames不重要。

labels <- as.vector(outer(c('call','put'),
                         names(aapl_total),paste0))
data <- lapply(seq(nrow(nij)), function(i) {
  data.frame(aapl_total[[nij[i,]]],type=labels[i])
})
res <- do.call(rbind,data)