[R-SIG-Finance] Option prices on SPX using IBrokers in R

Simone Gallo @imone@g@llo1990 @ending from gm@il@com
Thu Aug 30 15:15:17 CEST 2018


Hi everyone,

I'm trying to get SPX put option prices for a given strike and expiration
using the IBrokers package. The code is the following:

require(IBrokers)
tws=twsConnect()ticker="SPX"
exp="20181115"k=2700opt=twsOption(local="",symbol=ticker,expiry=exp,strike=k,right="P")optPrice=reqMktData(tws,opt,eventWrapper=eWrapper.data.Last(1),CALLBACK=snapShot)


where the two functions eWrapper.data.Last and snapShot are below reported:

eWrapper.data.Last <- function(n) {
  eW <- eWrapper(NULL)  # use basic template
  eW$assign.Data("data",
rep(list(structure(.xts(matrix(rep(NA_real_,2),nc=2),0),

.Dimnames=list(NULL,c("LastSize","Last")))),n))

  eW$tickPrice <- function(curMsg, msg, timestamp, file, ...)
  {
    tickType = msg[3]
    msg <- as.numeric(msg)
    id <- msg[2] #as.numeric(msg[2])
    data <- eW$get.Data("data") #[[1]]  # list position of symbol (by id ==
msg[2])
    attr(data[[id]],"index") <- as.numeric(Sys.time())
    nr.data <- NROW(data[[id]])
    if(tickType == .twsTickType$LAST) {
      data[[id]][nr.data,2] <- msg[4]
    }
    eW$assign.Data("data", data)
    c(curMsg, msg)
  }
  eW$tickSize  <- function(curMsg, msg, timestamp, file, ...)
  {
    data <- eW$get.Data("data")
    tickType = msg[3]
    msg <- as.numeric(msg)
    id <- as.numeric(msg[2])
    attr(data[[id]],"index") <- as.numeric(Sys.time())
    nr.data <- NROW(data[[id]])
    if(tickType == .twsTickType$LAST_SIZE) {
      data[[id]][nr.data,1] <- msg[4]
    }
    eW$assign.Data("data", data)
    c(curMsg, msg)
  }
  return(eW)}



snapShot <- function (twsCon, eWrapper, timestamp, file, playback = 1, ...){
  if (missing(eWrapper))
    eWrapper <- eWrapper()
  names(eWrapper$.Data$data) <- eWrapper$.Data$symbols
  con <- twsCon[[1]]
  if (inherits(twsCon, "twsPlayback")) {
    sys.time <- NULL
    while (TRUE) {
      if (!is.null(timestamp)) {
        last.time <- sys.time
        sys.time <- as.POSIXct(strptime(paste(readBin(con,
                                                      character(), 2),
collapse = " "), timestamp))
        if (!is.null(last.time)) {
          Sys.sleep((sys.time - last.time) * playback)
        }
        curMsg <- .Internal(readBin(con, "character",
                                    1L, NA_integer_, TRUE, FALSE))
        if (length(curMsg) < 1)
          next
        processMsg(curMsg, con, eWrapper, format(sys.time,
                                                 timestamp), file, ...)
      }
      else {
        curMsg <- readBin(con, character(), 1)
        if (length(curMsg) < 1)
          next
        processMsg(curMsg, con, eWrapper, timestamp,
                   file, ...)
        if (curMsg == .twsIncomingMSG$REAL_TIME_BARS)
          Sys.sleep(5 * playback)
      }
    }
  }
  else {
    while (TRUE) {
      socketSelect(list(con), FALSE, NULL)
      curMsg <- .Internal(readBin(con, "character", 1L,
                                  NA_integer_, TRUE, FALSE))
      if (!is.null(timestamp)) {
        processMsg(curMsg, con, eWrapper, format(Sys.time(),
                                                 timestamp), file, ...)
      }
      else {
        processMsg(curMsg, con, eWrapper, timestamp,
                   file, ...)
      }
      if (!any(sapply(eWrapper$.Data$data, is.na)))
        return(do.call(rbind, lapply(eWrapper$.Data$data,
                                     as.data.frame)))
    }
  }}

I get this on the console:

2 -1 2104 Connessione con il Server dei dati di mercato è OK:usfuture
2 -1 2104 Connessione con il Server dei dati di mercato è OK:eufarm
2 -1 2104 Connessione con il Server dei dati di mercato è OK:usopt
2 -1 2104 Connessione con il Server dei dati di mercato è OK:usfarm.us
2 -1 2106 Connessione con il HMDS data farm è OK:euhmds
2 -1 2106 Connessione con il HMDS data farm è OK:ushmds
2 1 10090 Parte dei dati di mercato richiesti non sono sottoscritti.
Tick indipendenti dalle sottoscrizioni sono ancora attivi.Dati di
mercato differiti non disponibili.SPX S&P 500 Stock Index/TOP/ALL

The last R message is not very clear since OPRA market data (which includes
SPX) is already included in my market data subscription.

In some cases, I get the last put option price for only few strike prices,
for others R does not stop running and stamp the message:

 "2 1 10090 Parte dei dati di mercato richiesti non sono sottoscritti. Tick
indipendenti dalle sottoscrizioni sono ancora attivi.Dati di mercato
differiti non disponibili.SPX S&P 500 Stock Index/TOP/ALL

This lead to problems in loops with multiple expirations and strikes (the
final aim is to create an option price chain from IB).

Any help would be greatly appreciated.

Simone

	[[alternative HTML version deleted]]



More information about the R-SIG-Finance mailing list