30

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

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

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

一些仁慈的用户可以告诉我如何将这些数据输入 Pandas 吗?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..."
4

6 回答 6

17

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

它已经从彭博社下载数据作为熊猫数据框。您可以在一次通话中下载多个代码的历史记录,甚至可以下载一些彭博社的参考数据(中央银行日期会议、某个国家/地区的假期等)

你只需用 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 是一个熊猫数据框。

希望能帮助到你

于 2016-06-10T22:06:53.963 回答
9

您也可以为此使用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")])
于 2017-03-13T05:23:51.577 回答
6

我刚刚发布了这个可能会有所帮助

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
于 2014-07-02T14:09:32.077 回答
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 工作站)。

  • 继上述之后,它依赖于 Python 的 32 位 OLE api。它仅适用于 32 位版本 - 所以您需要 32 位 python 和 32 位 OLE 绑定

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

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

于 2013-12-25T12:07:47.827 回答
3

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(security, field)。

于 2016-08-17T22:40:01.163 回答
1

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

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

于 2014-03-23T18:14:28.933 回答