我最近开始使用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..."
答案 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/blpapiwrapper和https://github.com/kyuni22/pybbg都做了基本的工作(谢谢大家!)但是在多个证券/领域以及你不可避免需要的覆盖方面遇到了麻烦。
这个https://github.com/kyuni22/pybbg有一件事,tia没有bds(安全,字段)。
答案 5 :(得分:0)
现在存在一个适用于python的Bloomberg API,它不使用COM。它具有允许您复制Excel插件功能的所有钩子,具有适当的编程语言端点的明显优势。请求和响应对象的文档记录很差,而且非常迟钝。尽管如此,API中的示例仍然很好,有些使用检查模块和打印响应消息可以让您加快速度。遗憾的是,标准终端许可仅适用于Windows。对于* nix,您将需要服务器许可证(甚至更昂贵)。我已经广泛使用它了。