1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
|
import blpapi
import sys
import pandas as pd
from contextlib import contextmanager
import logging
# Fill SessionOptions
logger = logging.getLogger(__name__)
@contextmanager
def init_bbg_session(ipaddr, port=8194):
sessionOptions = blpapi.SessionOptions()
sessionOptions.setServerHost(ipaddr)
sessionOptions.setServerPort(port)
session = blpapi.Session(sessionOptions)
try:
# Start a Session
if not session.start():
raise NameError("Failed to start session")
if not session.openService("//blp/refdata"):
raise NameError("Failed to open //blp/refdata")
yield session
except NameError as e:
logger.error(e.message)
raise
finally:
session.stop()
def retreive_data(session, securities, fields, settle_date=None,
start_date=None, end_date=None):
refDataService = session.getService("//blp/refdata")
if start_date:
request = refDataService.createRequest("HistoricalDataRequest")
else:
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))
if start_date:
request.set("startDate", "{0:%Y%m%d}".format(start_date))
request.set("endDate", "{0:%Y%m%d}".format(end_date))
session.sendRequest(request)
data = []
# 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
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():
logger.info("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
if msg.messageType() == blpapi.Name("HistoricalDataResponse"):
securityData = msg.getElement("securityData")
securityName = securityData.getElementValue("security")
fieldData = securityData.getElement("fieldData")
df = pd.DataFrame.from_dict([{str(e.name()): e.getValue() for e in f.elements()} \
for f in fieldData.values()])
df.convert_objects(convert_dates='coerce')
newdata[securityName] = df
return newdata
if __name__=="__main__":
startdate = pd.datetime(2013, 1, 1)
enddate = pd.datetime(2015, 8, 7)
securities = ['CADUSD Curncy', "EURUSD Curncy"]
fields = ['PX_LAST']
with init_bbg_session('192.168.0.4', 8194) as session:
data = retreive_data(session, securities, fields, start_date=startdate, end_date=enddate)
test = process_msgs(data)
|