web-dev-qa-db-fra.com

Comment stocker les données de l'API Bloomberg dans un cadre de données Pandas?

J'ai récemment commencé à utiliser Python pour pouvoir interagir avec l'API Bloomberg et j'ai quelques difficultés à stocker les données dans un cadre de données Pandas (ou un panneau). Je peux très bien obtenir le résultat dans la commande Invite, ce qui ne pose pas de problème.

Une question très similaire a été posée ici: Enveloppe de pandas pour Bloomberg api?

Le code référencé dans la réponse acceptée pour cette question concerne toutefois l'ancienne API et ne fonctionne pas pour la nouvelle API ouverte. Apparemment, l'utilisateur qui a posé la question était capable de modifier facilement ce code pour qu'il fonctionne avec la nouvelle API, mais je suis habitué à ce que ma main soit tenue en R, et c'est ma première tentative avec Python.

Un utilisateur bienveillant pourrait-il me montrer comment importer ces données dans les pandas? Il existe un exemple dans l'API Python (disponible ici: http://www.openbloomberg.com/open-api/ ) appelé SimpleHistoryExample.py avec lequel j'ai déjà travaillé et que j'ai inclus ci-dessous. Je crois que je devrai modifier surtout autour de la boucle 'while (True)' vers la fin de la fonction 'main ()', mais tout ce que j'ai essayé jusqu'à présent a des problèmes.

Merci d’avance, et j’espère que cela pourra aider toutes les personnes qui utilisent des pandas comme moyen de financement.

# 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 __== "__main__":
    print "SimpleHistoryExample"
    try:
        main()
    except KeyboardInterrupt:
        print "Ctrl+C pressed. Stopping..."
23
Danny

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

Il télécharge déjà les données sous forme de cadre de données panda de bloomberg. Vous pouvez télécharger l’historique de plusieurs tickers en un seul appel et même télécharger certaines données de référence de bloomberg (réunions de la Banque centrale sur la date, vacances dans un pays donné, etc.)

Et vous venez de l'installer avec pip. Ce lien regorge d’exemples, mais télécharger des données historiques est aussi simple 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 de pandas. 

J'espère que ça aide

10
Gabriel

Je viens de publier ce qui pourrait aider

http://github.com/alex314159/blpapiwrapper

Ce n'est pas très intuitif de décompresser 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
alex314159

Vous pouvez également utiliser pdblp pour cela (Avertissement: je suis l’auteur). Un didacticiel présentant des fonctionnalités similaires est disponible ici https://matthewgilbert.github.io/pdblp/tutorial.html , cette fonctionnalité pourrait être obtenue à l'aide de

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

J'utilise pybbg pour faire ce genre de choses. Vous pouvez l'avoir ici:

https://github.com/bpsmith/pybbg

Importez le package et vous pourrez ensuite le faire (dans le code source, fichier bbg.py):

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; passe-partout minimal et analyse indices et dates pour vous.

  • C'est bloquant. Puisque vous mentionnez R, je suppose que vous l’utilisez dans un type d’environnement interactif, comme IPython. C'est donc ce que vous voulez, plutôt que d'avoir à vous occuper des rappels.

  • Il peut également effectuer des demandes de données historiques (c’est-à-dire des séries de prix), intraday et en masse (pas encore de données tick).

Désavantages:

  • Ne fonctionne que sous Windows, à ma connaissance (BB workstationg doit être 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 - vous aurez donc besoin de liaisons python 32 bits et OLE 32

  • Il y a des bugs. D'après mon expérience, lors de la récupération de données pour un certain nombre d'instruments, cela tend à se bloquer sur IPython. Pas sûr de ce qui cause cela.

Sur la base du dernier point, je suggérerais que si vous obtenez de grandes quantités de données, récupérez-les et stockez-les dans une feuille Excel (un instrument par feuille), puis importez-les. read_Excel n'est pas efficace pour cela; vous devez utiliser l'objet ExcelReader (?), puis parcourir les feuilles. Sinon, l'utilisation de read_Excel rouvrira le fichier chaque fois que vous lirez une feuille. cela peut prendre des siècles.

3
Luciano

Tia https://github.com/bpsmith/tia est le meilleur que j'ai trouvé, et je les ai tous essayés ... Cela 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 bien aussi.

Les deux https://github.com/alex314159/blpapiwrapper et https://github.com/kyuni22/pybbg font le travail de base (merci les gars!) Mais rencontrez des difficultés avec plusieurs titres/champs ainsi que des dérogations dont vous aurez inévitablement besoin.

La seule chose que ce https://github.com/kyuni22/pybbg a que tia ne possède pas est bds (sécurité, champ).

2
citynorman

Il existe maintenant une propre API Bloomberg pour python qui n'utilise pas COM. Il possède tous les crochets pour vous permettre de reproduire les fonctionnalités du complément Excel, avec l'avantage évident d'un noeud final de langage de programmation approprié. Les objets de requête et de réponse sont assez mal documentés et assez obtus. Néanmoins, les exemples de l'API sont bons, et certains jeux utilisant le module inspecter et l'impression des messages de réponse devraient vous permettre de vous familiariser rapidement. Malheureusement, la licence de terminal standard ne fonctionne que sous 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
Thomas Browne