Comment puis-je stocker les données de L'API Bloomberg dans une base de données Pandas?

j'ai récemment commencé à utiliser Python pour pouvoir interagir avec L'API Bloomberg, et j'ai un peu de mal à stocker les données dans une base de données Pandas (ou un panneau). Je peux obtenir la sortie dans l'invite de commande très bien, si ce n'est pas un problème.

une question très similaire a été posée ici: Pandas wrapper pour Bloomberg api?

le code de référence dans la réponse acceptée pour cette question Est pour l'ancienne API, cependant, et cela ne fonctionne pas pour la nouvelle API ouverte. Apparemment, l'utilisateur qui a posé la question a pu facilement modifier ce code pour fonctionner avec la nouvelle API, mais j'ai l'habitude de me faire tenir la main en R, et c'est ma première tentative avec Python.

certains bienveillant utilisateur me montrer comment obtenir ces données dans les Pandas? Il y a un exemple dans L'API Python (disponible ici: http://www.openbloomberg.com/open-api / ) appelé SimpleHistoryExample.py que j'ai été travailler avec ce que j'ai inclus ci-dessous. Je crois que je vais avoir besoin de modifier principalement autour de la boucle' while(True) 'vers la fin de la fonction' main ()', mais tout ce que j'ai essayé jusqu'à présent a eu des problèmes.

merci à l'avance, et j'espère que cela pourra être utile à tous ceux qui utilisent Pandas pour la finance.

# 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..."
23
demandé sur Community 2013-10-15 21:55:56

6 réponses

j'utilise tia ( https://github.com/bpsmith/tia/blob/master/examples/datamgr.ipynb )

il télécharge déjà des données comme une base de données panda de bloomberg. Vous pouvez télécharger l'historique de plusieurs tickets en un seul appel et même télécharger quelques données de référence de bloombergs (Central Bank date meetings, holidays for a certain country, etc)

et vous venez de l'installer avec pip. Ce lien est plein d'exemples mais à télécharger les données historiques sont aussi faciles que:

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')

et df est une base de données pandas.

j'Espère que ça aide

10
répondu Gabriel 2017-08-10 06:40:59

je viens de publier ceci qui pourrait aider

http://github.com/alex314159/blpapiwrapper

ce n'est pas très intuitif de déballer le message, mais c'est ce qui fonctionne pour moi, où strData est une liste de champs bloomberg, par exemple ['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
4
répondu alex314159 2014-07-02 15:34:46

j'ai utilisé pybbg pour faire ce genre de choses. Vous pouvez l'obtenir ici:

https://github.com/bpsmith/pybbg

importer le paquet et vous pouvez alors faire (c'est dans le code source, bbg.py fichier):

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

les avantages:

  • facile à utiliser; boilerplate minimal, et analyse les indices et les dates pour vous.

  • ça bloque. Puisque vous mentionnez R, je suppose que vous utilisez ceci dans une sorte d'environnement interactif, comme IPython. C'est donc ce que vous voulez , plutôt que d'avoir à perdre avec des rappels.

  • il peut également faire historique (c.-à-d. séries de prix), intrajournalier et en vrac demande de données (pas de données de tique encore).

inconvénients:

  • ne fonctionne que sous Windows, pour autant que je sache (vous devez avoir BB workstationg installé et en cours d'exécution).

  • suivant ce qui précède, cela dépend de l'api OLE 32 bits pour Python. cela ne fonctionne qu'avec la version 32 bits - il vous faudra donc 32 bits python et 32 bits ole bindings

  • il y a des bogues. Dans mon expérience, lors de la récupération de données pour un certain nombre d'instruments, il a tendance à pendre IPython. Pas sûr de ce que provoque cette.

basé sur le dernier point, je suggérerais que si vous recevez de grandes quantités de données, vous les récupérez et les stockez dans une feuille excel (un instrument par feuille), puis importez-les. read_excel n'est pas efficace pour faire cela; vous devez utiliser L'ExcelReader (?) de l'objet, puis itérer sur les feuilles. Sinon, l'utilisation de read_excel va rouvrir le fichier chaque fois que vous lisez une feuille; ce peut prendre les âges.

3
répondu Luciano 2013-12-25 12:07:47

Tia https://github.com/bpsmith/tia est le meilleur que j'ai trouvé, et je les ai tous essayés... Il vous permet de faire:

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')

La mise en cache est sympa aussi.

les Deux https://github.com/alex314159/blpapiwrapper et https://github.com/kyuni22/pybbg faire le travail de base (merci les gars!) mais ont des problèmes avec de multiples titres / champs ainsi que des dérogations que vous inévitablement besoin.

La seule chose que cette https://github.com/kyuni22/pybbg a qui tia n'a pas est de bds(sécurité, champ).

2
répondu citynorman 2016-08-17 22:58:42

Vous pouvez également utiliser pdblp (Disclaimer: je suis l'auteur). Il y a un tutoriel montrant la fonctionnalité similaire disponible ici https://matthewgilbert.github.io/pdblp/tutorial.html , la fonctionnalité pourrait être réalisée en utilisant quelque chose comme

import pdblp
con = pdblp.BCon()
con.start()
con.bdh(['IBM US Equity', 'MSFT US Equity'], ['PX_LAST', 'OPEN'],
        '20061227', '20061231', elms=[("periodicityAdjustment", "ACTUAL")])
2
répondu mgilbert 2017-03-13 05:23:51

il existe maintenant une API Bloomberg appropriée pour python qui n'utilise pas COM. Il a tous les crochets pour vous permettre de répliquer la fonctionnalité de L'Addin Excel, avec l'avantage évident d'un bon langage de programmation endpoint. Les objets request et response sont assez mal documenté, et sont assez obtus. Néanmoins, les exemples dans L'API sont bons, et certains jouer en utilisant le module d'inspection et l'impression des messages de réponse devrait vous mettre à jour. Malheureusement, la norme la licence de terminal ne fonctionne que sur Windows. Pour *nix, vous aurez besoin d'une licence de Serveur (encore plus chère). Je l'ai utilisé assez largement.

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

0
répondu Thomas Browne 2017-09-20 12:41:38