2015-02-11 3 views
0

Я хочу загрузить данные о цепочке опций из google finance, и здесь я нахожу скрипт R для загрузки, это полезно, я изменил его, чтобы загрузить несколько опций цены истечения срока действия, но исходная json-ссылка кажется только имеют данные опций вызова, как я могу получить данные опциона пут.Как получить цену опциона пут с json-форматом?

library(rjson) 

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

ответ

1

Если вы хотите быстро и грязный раствор, замените эту строку

options <- ldply (options.list[["calls"]], data.frame)

с

options <- ldply (options.list[["puts"]], data.frame)

В обоих случаях функция будет возвращать кадр данных с 48 строк. Но вы заметите, что возвращенные данные разные. вызовы имеют ИДС, такие как «GOOG170120C00250000», путы есть «P» внутри:

Из личного интереса, я переписан ваш пример немного «GOOG170120P00250000», так что он работает для меня. Вот код:

library(rjson) 
library(plyr) 

getOptionChain <- function (symbol,exp = 14, type = "calls") { 
     # symbol = "WMT" 
     if(! any(grepl(type, c("puts", "calls")))){ 
       stop("ERROR: Third argument must be either 'calls' or 'puts'. Defaults to 'calls'.") 
     } 

     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,) 
     outfile = paste0(symbol, ".json") 
     rv <- download.file(url, destfile = outfile, method="curl") 
     warning(paste0("fetching url 1: ", url)) 

     google.options.json <- readLines(outfile, 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="") 
     warning(paste0("fetching url 2: ", url)) 
     outfile2 = paste0(symbol, ".longest-expiry.json") 
     rv <- download.file(url, destfile = outfile2, method="curl") 

     google.options.json <- readLines(outfile2, 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[[type]], 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) 
} 

Пример вызова функции:

calls <- getOptionChain("GOOG", 12, "calls") puts <- getOptionChain("GOOG", 12, "puts")

параметр "ехр" установлен на произвольное значение "12". Я не понимаю, для чего это важно, но неважно.

+0

Спасибо, я также изменил код, как ваш путь, exp 2017/01/20 из-за финансов Google предоставляет только опцию Chain в то время. Другой вопрос этой программы заключается в том, что она не может загрузить optionChain из SPY, вы пробовали? –

+0

Не знаю. Что означает SPY? ETF или «небольшая» логистическая компания или что-то еще? – knb

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

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