2013-07-21 6 views
3

Я использую R для загрузки дополнительных цепей через quantmod. Моя цель - загрузить и экспортировать цепочки опций для использования на другом программном обеспечении.getOptionChain с несколькими сроками действия

Если я загружаю только передний месяц истечения срока действия, я могу правильно экспортировать в файл .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 список списков, который содержит все истекает, и я не в состоянии правильно разделить их.

Любые предложения?

+0

aapl_total содержит следующие 7 истекает: "LUG 2013", "назад 2013" "Set 2013" "OTT 2013" "Gen 2014" "апр 2014" «Gen 2015 ». Каждый из них содержит 2 data.frame (вызовы и помехи). Я хотел бы добавить их ниже ниже. – GrilloRob

ответ

2

Вы можете прокручивать каждое истечение срока и 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))) 
+0

Отлично, это именно то, что я искал. Благодарю. – GrilloRob

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) 

EDIT добавить тип столбца, так как 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) 
+0

Это прекрасно, но имена розеров не соответствуют OP, и порядок отличается. – GSee

+0

@GПожалуйста, добавьте новый столбец. Но я признаю, что решение выглядит немного сложнее. – agstudy

1

Это не работает для данных опции больше, потому что Yahoo меняет свой веб-сайт, пожалуйста, используйте Google финансов в качестве источника данных опций, вот пример

Пример: getOptionChain («GOOG», 3) означает, что следующая дата 3 экспирации для Google вариант цепи

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) 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^