import blpapi import sys import pandas as pd # Fill SessionOptions def init_bbg_session(ipaddr, port=8184): sessionOptions = blpapi.SessionOptions() sessionOptions.setServerHost(ipaddr) sessionOptions.setServerPort(port) session = blpapi.Session(sessionOptions) # Start a Session if not session.start(): print "Failed to start session." sys.exit(0) if not session.openService("//blp/refdata"): print "Failed to open //blp/refdata" sys.exit(0) return session def retreive_data(session, securities, fields, settle_date=None): refDataService = session.getService("//blp/refdata") request = refDataService.createRequest("ReferenceDataRequest") for security in securities: request.append("securities", security) for field in fields: request.append("fields", field) if settle_date: overrides = request.getElement('overrides') o = overrides.appendElement() o.setElement("fieldId", "SETTLE_DT") o.setElement("value", "{0:%Y%m%d}".format(settle_date)) session.sendRequest(request) data = [] try: # Process received events while(True): # We provide timeout to give the chance to Ctrl+C handling: ev = session.nextEvent(500) if ev.eventType() in [blpapi.Event.PARTIAL_RESPONSE, blpapi.Event.RESPONSE]: for msg in ev: data.append(msg) # Response completely received, so we could exit if ev.eventType() == blpapi.Event.RESPONSE: break finally: # Stop the session session.stop() return data def process_msgs(data): # return a dict whose keys are the bloomberg securities # and whose values are a dict of bloomberg fields -> values # the values can either be a scalar or a dataframe newdata = {} for msg in data: if msg.messageType() == blpapi.Name("ReferenceDataResponse"): securityDataArray = msg.getElement("securityData") for securityData in securityDataArray.values(): securityName = securityData.getElementValue("security") row = {} fieldData = securityData.getElement("fieldData") for field in fieldData.elements(): if not field.isValid(): print "Invalid field: {0}".format(str(field)) elif field.isArray(): df = pd.DataFrame.from_dict( [{str(e.name()): e.getValue() for e in f.elements()} \ for f in field.values()]) row[str(field.name())] = df.convert_objects(convert_dates='coerce') #to convert dates to timestamps else: row[str(field.name())] = field.getValue() newdata[securityName] = row return newdata if __name__=="__main__": session = init_bbg_session('192.168.0.4', 8194) fields = ['HIST_PRINCIPAL_DISTRIBUTED', 'HIST_LOSSES', 'MTG_HIST_FACT', 'MTG_HIST_CPN', 'HIST_INTEREST_DISTRIBUTED'] sec = ['45254NMV6 Mtge'] data = retreive_data(session, sec, fields) test = process_msgs(data)