Как создать фрейм данных с помощью функции подписки Rblpapi

Извините, этот пример не будет воспроизведен теми, кто не является пользователями Bloomberg.

Для других я использую Rblpapi и его subscribe функция. Я хотел бы создать что-то вроде фрейма данных, матрицы или массива и заполнить его значениями, которые передаются по подписке.

Предполагая, что ваш компонент BBComm запущен и работает, мой пример говорит:

require(Rblpapi)
con <- blpConnect()
securities <- c('SX5E 07/20/18 C3400 Index',
            'SX5E 07/20/18 C3450 Index',
            'SX5E 07/20/18 C3500 Index')

Я хотел бы заполнить матрицу 3 x 2 этими полями:

fields <- c('BID', 'ASK')

Я думаю, что я могу создать такую ​​матрицу почти без потерь производительности:

mat <- matrix(data = NA,
          nrow = 3,
          ncol = 2)

Сейчас пользуюсь subscribe и его аргумент fun для наполнения, вот как-то так (хоть и некрасиво видеть и скорее всего неэффективно):

i <- 1
subscribe(securities = securities,
          fields = fields,
          fun = function(x){
            if (i > length(securities))
              i <<- 1
            tryCatch(
              expr = {
                mat[i, 1] <<- x$data$BID
                mat[i, 2] <<- x$data$ASK
                i <<- i + 1
              },
              error = function(e){
                message(e)
              },
              finally = {}
              )
          })

Результат:

Error in subscribe_Impl(con, securities, fields, fun, options, identity) : 
  Evaluation error: number of items to replace is not a multiple of replacement length.

Конечно, это не работает, потому что я действительно не знаю, как использовать индексирование для потоковых данных. $ Оператор, кажется, нормально, чтобы получить точки данных по имени - как я сделал с BID а также ASK - но я не могу найти способ выяснить, какие значения относятся, скажем, securities[1] или securities[2], Кажется, что я получаю поток числовых значений, которые неотличимы друг от друга, потому что я не могу получить право собственности на стоимость среди ценных бумаг.

Использование индекса на x$data$BID[1] выдает ту же ошибку.

1 ответ

Хорошо, ваш код выглядит хорошо, единственное, что не работает, x$data$BIDизменить на x$data["BID"] и затем вы можете сохранить его, я работаю с вашим кодом, и это мой результат.

     fields=c("TIME","LAST_PRICE", "BID", "ASK")
     blpConnect()
     blpConnect()
     i <- 1

    subscribe(securities = securities,
    fields = fields,"interval=60",
      fun = function(x){
        if (i > length(securities))
          i <<- 1
        tryCatch(
          expr = {
            tim <- x$data["TIME"]
            last <<- x$data["LAST_PRICE"]
            ask <<- x$data["ASK"]
            bid <<- x$data["BID"]
            i <<- i + 1
          },
          error = function(e){
            message(e)
          },
          finally = {}
        )
        print(cbind(tim$TIME,last$LAST_PRICE,ask$ASK, bid$BID))
      })

результат

Хороший способ взглянуть на результат объекта из subscribe функция:

subscribe(securities=c("AAPL US Equity"),
          fields=c("LAST_PRICE"),
          fun=function(x) print(str(x)))

Оттуда вы можете пробраться в данные:

subscribe(securities=c("AAPL US Equity", "INTC US Equity"),
          fields=c("LAST_PRICE","BID","ASK"),
          fun=function(x) {
            if (!is.null(x$data$MKTDATA_EVENT_TYPE) && x$data$MKTDATA_EVENT_TYPE == "TRADE" && exists("LAST_PRICE", where = x$data)) {
              print(data.frame(Ticker = x$topic, DateTime = x$data$TRADE_UPDATE_STAMP_RT, Trade = x$data$LAST_PRICE))
            }
          })

Я только напечатал data.frame здесь. Данные могут быть обработаны или сохранены напрямую, используя аргумент FUN для подписки.

Другие вопросы по тегам