[R] quantmod getOptionChain Not Work

Sparks, John James jspark4 at uic.edu
Mon Apr 9 01:11:22 CEST 2012


Michael,

I have not had time to look at this for a while but still wanted to say
thanks for looking into it and sending this solution.

By the way, Jeff mentioned that the version of quantmod on the SVN
(0.3.18) works for this.  I tried to figure out how to download that
version, but found the documentation on SVN's quite confusing.  Is there
anyway that you could make that version available?

Much appreciated.
--John Sparks



On Fri, March 23, 2012 5:55 pm, R. Michael Weylandt wrote:
> Sorry about that: two small mistakes and I imagine there are a few
> more I've missed.  This should actually work:
>
> ###########################################
>
>
> library(XML)
>
> readYahooOptions <- function(Symbols, Exp, ...){
>   parse.expiry <- function(x) {
>     if(is.null(x))
>       return(NULL)
>
>     if(inherits(x, "Date") || inherits(x, "POSIXt"))
>       return(format(x, "%Y-%m"))
>
>     if (nchar(x) == 5L) {
>       x <- sprintf(substring(x, 4, 5), match(substring(x,
>                                                        1, 3),
> month.abb), fmt = "20%s-%02i")
>     }
>     else if (nchar(x) == 6L) {
>       x <- paste(substring(x, 1, 4), substring(x, 5, 6),
>                  sep = "-")
>     }
>     return(x)
>   }
>
>   clean.opt.table <- function(tableIn){
>     tableOut <- sapply(tableIn[,-2], function(x)
> as.numeric(gsub(",","",x)))
>     rownames(tableOut) <- tableIn[,2]
>     tableOut
>   }
>
>   if(missing(Exp))
>     optURL <-
> paste(paste("http://finance.yahoo.com/q/op?s",Symbols,sep="="),"Options",sep="+")
>   else
>     optURL <-
> paste(paste("http://finance.yahoo.com/q/op?s=",Symbols,"&m=",parse.expiry(Exp),sep=""),"Options",sep="+")
>
>   if(!missing(Exp) && is.null(Exp)) {
>     optPage <- readLines(optURL)
>     optPage <- optPage[grep("View By Expiration", optPage)]
>     allExp <- gregexpr("m=", optPage)[[1]][-1] + 2
>     allExp <- substring(optPage, allExp, allExp + 6)
>     allExp <- allExp[seq_len(length(allExp)-1)] # Last one seems useless ?
>     return(structure(lapply(allExp, readYahooOptions,
> Symbols=Symbols), .Names=format(as.yearmon(allExp))))
>   }
>
>   stopifnot(require("XML"))
>
>   optURL <- readHTMLTable(optURL)
>
>   # Not smart to hard code these but it's a 'good-enough' hack for now
>   # Also, what is table 9 on this page?
>
>   list(calls = clean.opt.table(optURL[[10]]),
>        puts = clean.opt.table(optURL[[14]]),
>        symbol = Symbols)
> }
>
>
>
> On Fri, Mar 23, 2012 at 6:44 PM, R. Michael Weylandt
> <michael.weylandt at gmail.com> wrote:
>> I just got around to taking a look at this, but below is a fix. It
>> seems like yahoo finance redesigned the page and rather than reparsing
>> all their HTML, I'll use Duncan TL's XML package to make life happier.
>> (I loathe HTML parsing....)
>>
>> This isn't thoroughly tested and it'll break if yahoo redesigns things
>> again (I hardcode the table numbers for now) but it seems to work well
>> enough. Let me know if you have any errors with it. If Jeff likes it,
>> it should be a drop-in replacement for the getOptionChain.yahoo for
>> quantmod with a name change.
>>
>> Feedback welcome,
>>
>> Michael
>>
>> #############################################
>>
>> library(XML)
>>
>> readYahooOptions <- function(Symbols, Exp, ...){
>>  parse.expiry <- function(x) {
>>    if(is.null(x))
>>      return(NULL)
>>
>>    if(inherits(x, "Date") || inherits(x, "POSIXt"))
>>      return(format(x, "%Y-%m"))
>>
>>    if (nchar(x) == 5L) {
>>      x <- sprintf(substring(x, 4, 5), match(substring(x,
>>                                                       1, 3),
>> month.abb), fmt = "20%s-%02i")
>>    }
>>    else if (nchar(x) == 6L) {
>>      x <- paste(substring(x, 1, 4), substring(x, 5, 6),
>>                 sep = "-")
>>    }
>>    return(x)
>>  }
>>
>>  clean.opt.table <- function(tableIn){
>>    tableOut <- lapply(tableIn[,-2], function(x)
>> as.numeric(gsub(",","",x)))
>>    rownames(tableOut) <- tableIn[,2]
>>  }
>>
>>  if(missing(Exp))
>>    optURL <-
>> paste(paste("http://finance.yahoo.com/q/op?s",Symbols,sep="="),"Options",sep="+")
>>  else
>>    optURL <-
>> paste(paste("http://finance.yahoo.com/q/op?s=",Symbols,"&m=",parse.expiry(Exp),sep=""),"Options",sep="+")
>>
>>  if(!missing(Exp) && is.null(Exp)) {
>>    optPage <- readLines(optURL)
>>    optPage <- optPage[grep("View By Expiration", optPage)]
>>    allExp <- gregexpr("m=", optPage)[[1]][-1] + 2
>>    allExp <- substring(optPage, allExp, allExp + 6)
>>    allExp <- allExp[seq_len(length(allExp)-1)] # Last one seems
>> useless ? Always true?
>>    return(structure(lapply(allExp, readYahooOptions,
>> Symbols=Symbols), .Names=format(as.yearmon(allExp))))
>>  }
>>
>>  stopifnot(require("XML"))
>>
>>  optURL <- readHTMLTable(optURL)
>>
>>  # Not smart to hard code these but it's a 'good-enough' hack for now
>>  # Also, what is table 9 on this page?
>>  CALLS <- optURL[[10]]
>>  PUTS <- optURL[[14]]
>>
>>  list(calls = CALLS, puts = PUTS, symbol = Symbols)
>> }
>>
>>
>> ###########################################################
>>
>> On Sun, Mar 4, 2012 at 2:18 PM, Sparks, John James <jspark4 at uic.edu>
>> wrote:
>>> Dear R Helpers,
>>>
>>> I am still having trouble with the getOptionChain command in quantmod.
>>>  I
>>> have the latest version of quantmod, etc. so I was under the impression
>>> that the problem was solved with updates to the package.
>>>
>>> If someone could let me know what I need to install in order to make
>>> this
>>> work, I would really appreciate it.
>>>
>>> My error message as session info are shown below.  Thanks a bunch.
>>> --John Sparks
>>>
>>> R version 2.14.2 (2012-02-29)
>>> Platform: i386-pc-mingw32/i386 (32-bit)
>>>
>>> locale:
>>> [1] LC_COLLATE=English_United States.1252  LC_CTYPE=English_United
>>> States.1252    LC_MONETARY=English_United States.1252 LC_NUMERIC=C
>>> [5] LC_TIME=English_United States.1252
>>>
>>> attached base packages:
>>> [1] stats     graphics  grDevices utils     datasets  methods   base
>>>
>>> other attached packages:
>>> [1] pomp_0.40-2      deSolve_1.10-3   subplex_1.1-3    mvtnorm_0.9-9992
>>> quantmod_0.3-17  TTR_0.21-0       xts_0.8-2        zoo_1.7-7
>>> Defaults_1.1-1
>>>
>>> loaded via a namespace (and not attached):
>>> [1] grid_2.14.2    lattice_0.20-0 tools_2.14.2
>>>> AAPL.OPT<-getOptionChain("AAPL")
>>> Error in puts[, 2] : incorrect number of dimensions
>>>> AAPL.OPT<-getOptionChain("AAPL",NULL)
>>> Error in puts[, 2] : incorrect number of dimensions
>>>>
>>>
>>> ______________________________________________
>>> R-help at r-project.org mailing list
>>> https://stat.ethz.ch/mailman/listinfo/r-help
>>> PLEASE do read the posting guide
>>> http://www.R-project.org/posting-guide.html
>>> and provide commented, minimal, self-contained, reproducible code.
>
>



More information about the R-help mailing list