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

Dan*_*nny 28 python finance bloomberg blpapi pandas

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

这里提出了一个非常相似的问题: Bloomberg api的熊猫包装?

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

一些仁慈的用户可以告诉我如何将这些数据导入熊猫吗?有一个名为SimpleHistoryExample.py 的Python API(在这里提供:http://www.openbloomberg.com/open-api/),我一直在使用它,我已经在下面包含了这个例子.我相信我需要在'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..."
Run Code Online (Sandbox Code Playgroud)

Gab*_*iel 15

我用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')
Run Code Online (Sandbox Code Playgroud)

和df是一个熊猫数据帧.

希望能帮助到你


mgi*_*ert 8

您也可以为此使用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")])
Run Code Online (Sandbox Code Playgroud)


ale*_*159 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
Run Code Online (Sandbox Code Playgroud)


Luc*_*ano 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
Run Code Online (Sandbox Code Playgroud)

优点:

  • 便于使用; 最小的样板文件,并为您解析索引和日期。

  • 它正在阻塞。既然您提到了 R,我假设您正在某种类型的交互式环境中使用它,例如 IPython。所以这就是你想要的,而不是必须用回调来搞乱。

  • 它还可以执行历史(即价格系列)、日内和批量数据请求(尚无报价数据)。

缺点:

  • 据我所知,仅适用于 Windows(您必须安装并运行 BB 工作站)。

  • 接下来,它依赖于 Python 的 32 位 OLE api。它仅适用于 32 位版本 - 因此您将需要 32 位 python 和 32 位 OLE 绑定

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

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