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是一个熊猫数据帧.
希望能帮助到你
您也可以为此使用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)
我刚刚发布了这可能会有所帮助
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)
我一直在使用 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 将在每次读取工作表时重新打开文件;这可能需要很长时间。
| 归档时间: |
|
| 查看次数: |
55356 次 |
| 最近记录: |