我使用 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,我无法正确拆分它们。
有什么建议吗?
答案 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)