Как получить форвардные курсы валют вместо баллов в BLPAPI на Python

#python #forward #bloomberg #rate #blpapi

Вопрос:

Я пытаюсь получить «CHF1M Curncy» как форвардные ставки, а не как баллы от Bloomberg API BLPAPI в Python. Сам код отлично работает для прямых точек, но как только я использую переопределение для переключения с точек на ставки, я получаю ошибку «Нет значения для []» для строки с первым переопределением. Это мой код:

 import blpapi
import json

HISTORICAL_DATA_RESPONSE = blpapi.Name("HistoricalDataResponse")

def historical_bloomberg_data(securities, fields, periodicity="DAILY", start_date="20190101", end_date="20190105"):

    # Create and start a session
    print("Creating session ...")

    sessionOptions = blpapi.SessionOptions()
    sessionOptions.setServerHost('localhost')
    sessionOptions.setServerPort(8194)

    session = blpapi.Session(sessionOptions)

    if not session.start():
        print("Failed to start session")
        return
   

    try:
        # Create and open a service
        print("Creating historical data service")

        if not session.openService("//blp/refdata"):
            print("Failed to create service")
            return
  
        refDataService = session.getService("//blp/refdata")
        request = refDataService.createRequest("HistoricalDataRequest")

   
        # Add all securities
        for security in securities:
            request.getElement("securities").appendValue(security)

        

        # Add all fields
        for field in fields:
            request.getElement("fields").appendValue(field)

            

        # Further settings
        request.set("periodicitySelection", periodicity)
        request.set("startDate", start_date)

 
        

        request.set("endDate", end_date)
        request.set("maxDataPoints", 2000)

 

        #Override code
        overrides = request.getElement('overrides')
        override1 = overrides.appendElement()
        override1.setElement('fieldID', 'FWD_CURVE_FORMAT')
        override1.setElement('value', 'RATES')
        #request.setOverride("FWD_CURVE_FORMAT", "RATES")

 

        # Send and process request
        print("Sending request...")
        session.sendRequest(request)

        results = {}
     

        while True:
            ev = session.nextEvent(500)
            for msg in ev:
                if msg.messageType() == HISTORICAL_DATA_RESPONSE:
                    #response = msg.getElement()
                    response = msg.getElement("securityData")
                    _sec = response.getElementAsString("security")
                    _data = [[fd.getElementAsString("date")]   [fd.getElementAsString(_) for _ in fields] for fd in response.getElement("fieldData").values()]
                 
                    results[_sec] = results.get(_sec, [])   _data
        

            if ev.eventType() == blpapi.Event.RESPONSE:
                break
       

        print("Results retrieved")
        return results
 

Ответ №1:

Правильное переопределение таково FWD_CURVE_QUOTE_FORMAT . Значения могут быть:

  • POINTS
  • RATES
  • OUTRIGHT

(Я подозреваю, что ПРЯМО и СТАВКИ делают то же самое)

Редактировать

И правильный способ переопределить поле-использовать fieldId (заканчивающийся маленькой шапкой d ) , а не fieldID .

Комментарии:

1. Привет, спасибо за ваш вклад. К сожалению, он также не работает с форматом FWD_CURVE_QUOTE_FORMAT. :/

2. Какой тикер и поле вы используете? Я только что попробовал использовать CHF1M Curncy и PX_LAST с 1 сентября 2021 года по сегодняшний день, и это работает так, как ожидалось. Я также отмечаю, что для переопределения вы должны использовать fieldId не fieldID — не уверен, имеет ли это значение.

3. В этом вся разница!. Вам нужно override1.setElement('fieldId', 'FWD_CURVE_QUOTE_FORMAT') использовать строчную букву «d», иначе это не сработает.