如何将Bloomberg API中的数据存储到Pandas数据帧中?

时间:2013-10-15 17:55:56

标签: python pandas finance bloomberg blpapi

我最近开始使用Python,因此我可以与Bloomberg API进行交互,而且我在将数据存储到Pandas数据帧(或面板)时遇到了一些麻烦。我可以在命令提示符中得到输出就好了,所以这不是问题。

这里提出了一个非常相似的问题: Pandas wrapper for Bloomberg api?

该问题的已接受答案中引用的代码适用于旧API,但它不适用于新的开放API。显然,提出问题的用户能够轻松修改该代码以使用新的API,但我习惯将手放在R中,这是我对Python的第一次尝试。

有些仁慈的用户能告诉我如何将这些数据导入熊猫吗? Python API中有一个例子(在这里可用:http://www.openbloomberg.com/open-api/),名为SimpleHistoryExample.py,我一直在使用,我已经在下面包含了这个例子。我相信我需要在'main()'函数的末尾围绕'while(True)'循环进行修改,但到目前为止我尝试的所有内容都有问题。

提前致谢,我希望这对使用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..."

6 个答案:

答案 0 :(得分:11)

我使用tia(https://github.com/bpsmith/tia/blob/master/examples/datamgr.ipynb

它已经从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数据帧。

希望有所帮助

答案 1 :(得分: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")])

答案 2 :(得分:5)

我刚刚发布了可能有用的内容

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 :(得分: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 workstationg)。

  • 以上内容依赖于Python的32位OLE api。 它只适用于32位版本 - 所以你需要32位python和32位OLE绑定

  • 有一些错误。根据我的经验,当检索多个乐器的数据时,它往往会挂起IPython。不确定是什么原因引起的。

根据最后一点,我建议如果您获得大量数据,则将其检索并存储在Excel工作表(每张工作一个工具)中,然后导入这些数据。 read_excel这样做效率不高;您需要使用ExcelReader(?)对象,然后迭代工作表。否则,每次阅读工作表时,使用read_excel将重新打开文件;这可能需要很长时间。

答案 4 :(得分:2)

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/blpapiwrapperhttps://github.com/kyuni22/pybbg都做了基本的工作(谢谢大家!)但是在多个证券/领域以及你不可避免需要的覆盖方面遇到了麻烦。

这个https://github.com/kyuni22/pybbg有一件事,tia没有bds(安全,字段)。

答案 5 :(得分:0)

现在存在一个适用于python的Bloomberg API,它不使用COM。它具有允许您复制Excel插件功能的所有钩子,具有适当的编程语言端点的明显优势。请求和响应对象的文档记录很差,而且非常迟钝。尽管如此,API中的示例仍然很好,有些使用检查模块和打印响应消息可以让您加快速度。遗憾的是,标准终端许可仅适用于Windows。对于* nix,您将需要服务器许可证(甚至更昂贵)。我已经广泛使用它了。

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