Подтвердить что ты не робот

Как хранить данные из API Bloomberg в фреймворк Pandas?

Недавно я начал использовать Python, чтобы я мог взаимодействовать с API Bloomberg, и у меня возникли проблемы с хранением данных в DataFrame Pandas (или панели). Я могу получить вывод в командной строке просто отлично, так что это не проблема.

Здесь был задан очень похожий вопрос: Pandas обертка для Bloomberg api?

Указанный код в принятом ответе на этот вопрос для старого API, однако, не работает для нового открытого API. По-видимому, пользователь, который задал вопрос, смог легко изменить этот код для работы с новым API, но я привык к тому, что моя рука была в R, и это мое первое начинание с Python.

Может ли какой-нибудь доброжелательный пользователь показать мне, как получить эти данные в Pandas? В API Python есть пример: http://www.openbloomberg.com/open-api/), который называется SimpleHistoryExample.py, что я работал с этим я ' ниже. Я считаю, что мне нужно будет изменить в основном вокруг цикла while (True) в конце функции main(), но все, что я пробовал до сих пор, имеет проблемы.

Спасибо заранее, и я надеюсь, что это может помочь любому, кто использует Pandas для финансирования.

# SimpleHistoryExample.py

import blpapi
from optparse import OptionParser


def parseCmdLine():
    parser = OptionParser(description="Retrieve reference data.")
    parser.add_option("-a",
                      "--ip",
                      dest="host",
                      help="server name or IP (default: %default)",
                      metavar="ipAddress",
                      default="localhost")
    parser.add_option("-p",
                      dest="port",
                      type="int",
                      help="server port (default: %default)",
                      metavar="tcpPort",
                      default=8194)

    (options, args) = parser.parse_args()

    return options


def main():
    options = parseCmdLine()

    # Fill SessionOptions
    sessionOptions = blpapi.SessionOptions()
    sessionOptions.setServerHost(options.host)
    sessionOptions.setServerPort(options.port)

    print "Connecting to %s:%s" % (options.host, options.port)
    # Create a Session
    session = blpapi.Session(sessionOptions)

    # Start a Session
    if not session.start():
        print "Failed to start session."
        return

    try:
        # Open service to get historical data from
        if not session.openService("//blp/refdata"):
            print "Failed to open //blp/refdata"
            return

        # Obtain previously opened service
        refDataService = session.getService("//blp/refdata")

        # Create and fill the request for the historical data
        request = refDataService.createRequest("HistoricalDataRequest")
        request.getElement("securities").appendValue("IBM US Equity")
        request.getElement("securities").appendValue("MSFT US Equity")
        request.getElement("fields").appendValue("PX_LAST")
        request.getElement("fields").appendValue("OPEN")
        request.set("periodicityAdjustment", "ACTUAL")
        request.set("periodicitySelection", "DAILY")
        request.set("startDate", "20061227")
        request.set("endDate", "20061231")
        request.set("maxDataPoints", 100)

        print "Sending Request:", request
        # Send the request
        session.sendRequest(request)

        # Process received events
        while(True):
            # We provide timeout to give the chance for Ctrl+C handling:
            ev = session.nextEvent(500)
            for msg in ev:
                print msg

            if ev.eventType() == blpapi.Event.RESPONSE:
                # Response completly received, so we could exit
                break
    finally:
        # Stop the session
        session.stop()

if __name__ == "__main__":
    print "SimpleHistoryExample"
    try:
        main()
    except KeyboardInterrupt:
        print "Ctrl+C pressed. Stopping..."
4b9b3361

Ответ 1

Я использую tia (https://github.com/bpsmith/tia/blob/master/examples/datamgr.ipynb)

Он уже загружает данные в виде panda dataframe из bloomberg. Вы можете загружать историю для нескольких тикеров одним звонком и даже загружать справочные данные bloombergs (встречи с датами в Центральном банке, праздники для определенной страны и т.д.)

И вы просто установите его с помощью pip. Эта ссылка полна примеров, но загрузка исторических данных так же проста, как:

import pandas as pd
import tia.bbg.datamgr as dm

mgr = dm.BbgDataManager()
sids = mgr['MSFT US EQUITY', 'IBM US EQUITY', 'CSCO US EQUITY']
df = sids.get_historical('PX_LAST', '1/1/2014', '11/12/2014')

и df - это фреймворк pandas.

Надеюсь, что это поможет

Ответ 2

Я только что опубликовал это, что может помочь

http://github.com/alex314159/blpapiwrapper

В основном это не очень интуитивно, чтобы распаковать сообщение, но это то, что работает для меня, где strData - это список полей bloomberg, например ['PX_LAST', 'PX_OPEN']:

fieldDataArray = msg.getElement('securityData').getElement('fieldData')
size = fieldDataArray.numValues()
fieldDataList = [fieldDataArray.getValueAsElement(i) for i in range(0,size)]
outDates = [x.getElementAsDatetime('date') for x in fieldDataList]
output = pandas.DataFrame(index=outDates,columns=strData)
for strD in strData:
    outData = [x.getElementAsFloat(strD) for x in fieldDataList]
    output[strD] = outData
output.replace('#N/A History',pandas.np.nan,inplace=True)
output.index = output.index.to_datetime()
return output

Ответ 3

Я использовал pybbg для создания такого рода вещей. Вы можете получить его здесь:

https://github.com/bpsmith/pybbg

Импортируйте пакет, и вы можете сделать это (это в исходном коде, файл bbg.py):

banner('ReferenceDataRequest: single security, single field, frame response')
req = ReferenceDataRequest('msft us equity', 'px_last', response_type='frame')
print req.execute().response

Преимущества:

  • Прост в использовании; минимальный шаблон, и анализирует индексы и даты для вас.

  • Он блокирует. Поскольку вы упоминаете R, я предполагаю, что вы используете это в некотором типе интерактивной среды, такой как IPython. Так что это то, чего вы хотите, вместо того, чтобы возиться с обратными вызовами.

  • Он также может выполнять исторические (например, ценовые серии), внутридневные и объемные запросы данных (пока еще нет данных тика).

Недостатки:

  • Работает только в Windows, насколько я знаю (у вас должна быть установлена ​​и запущена рабочая станция BB).

  • Следуя приведенному выше, это зависит от 32-разрядного OLE api для Python. Он работает только с 32-разрядной версией - так что вам понадобится 32-битное python и 32-разрядные привязки OLE

  • Есть некоторые ошибки. По моему опыту, при извлечении данных для ряда инструментов он имеет тенденцию к зависанию IPython. Не уверен, что вызывает это.

Основываясь на последнем пункте, я бы предположил, что если вы получаете большие объемы данных, вы извлекаете и сохраняете их на листе excel (один инструмент на листе), а затем импортируете их. read_excel неэффективен для этого; вам нужно использовать объект ExcelReader (?), а затем перебрать по листам. В противном случае использование read_excel будет снова открывать файл каждый раз, когда вы читаете лист; это может занять много времени.

Ответ 4

Tia https://github.com/bpsmith/tia - это лучшее, что я нашел, и я попробовал их все... Это позволяет:

import pandas as pd
import datetime
import tia.bbg.datamgr as dm
mgr = dm.BbgDataManager()
sids = mgr['BAC US EQUITY', 'JPM US EQUITY']
df = sids.get_historical(['BEST_PX_BPS_RATIO','BEST_ROE'],
                         datetime.date(2013,1,1),
                         datetime.date(2013,2,1),
                         BEST_FPERIOD_OVERRIDE="1GY",
                         non_trading_day_fill_option="ALL_CALENDAR_DAYS",
                         non_trading_day_fill_method="PREVIOUS_VALUE")
print df

#and you'll probably want to carry on with something like this
df1=df.unstack(level=0).reset_index()
df1.columns = ('ticker','field','date','value')
df1.pivot_table(index=['date','ticker'],values='value',columns='field')
df1.pivot_table(index=['date','field'],values='value',columns='ticker')

Кэширование тоже приятно.

Оба https://github.com/alex314159/blpapiwrapper и https://github.com/kyuni22/pybbg do основная работа (спасибо, ребята!), но у вас проблемы с несколькими ценными бумагами/полями, а также с переопределениями, которые вам неизбежно потребуются.

Единственное, что https://github.com/kyuni22/pybbg имеет то, что tia не имеет bds (безопасность, поле).

Ответ 5

Теперь существует правильный API Bloomberg для python, который не использует COM. В нем есть все перехваты, позволяющие вам копировать функциональность Excel addin с очевидным преимуществом правильной конечной точки языка программирования. Объекты запроса и ответа довольно плохо документированы и довольно тупые. Тем не менее, примеры в API хороши, а некоторые, играющие с использованием модуля проверки и печати ответных сообщений, должны довести вас до скорости. К сожалению, стандартная лицензия терминала работает только в Windows. Для * nix вам понадобится лицензия на сервер (еще дороже). Я использовал его довольно широко.

https://www.bloomberg.com/professional/support/api-library/

Ответ 6

Вы также можете использовать pdblp для этого (Отказ от ответственности: я автор). Существует учебник, показывающий аналогичную функциональность, доступную здесь https://matthewgilbert.github.io/pdblp/tutorial.html, функциональность может быть достигнута с помощью чего-то вроде

import pdblp
con = pdblp.BCon()
con.start()
con.bdh(['IBM US Equity', 'MSFT US Equity'], ['PX_LAST', 'OPEN'],
        '20061227', '20061231', elms=[("periodicityAdjustment", "ACTUAL")])