Как получить цену опциона пут в формате json?

Я хочу загрузить данные цепочки опционов из Google Finance, и здесь я нахожу R-скрипт для загрузки, это полезно, я изменил его, чтобы загружать цену опциона с несколькими датами истечения срока действия, но исходная ссылка 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)
} 

person Community    schedule 11.02.2015    source источник


Ответы (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")

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

person knb    schedule 11.02.2015
comment
Спасибо, я также изменил код, как вы, exp 2017/01/20, потому что Google Finance предоставляет только опцию Chain в то время. Еще вопрос этой проги в том, что она не может скачать optionChain of SPY, вы пробовали? - person ; 16.02.2015
comment
Я не знаю. Что означает SPY? ETF, небольшая логистическая компания или что-то еще? - person knb; 16.02.2015