aboutsummaryrefslogtreecommitdiffstats
path: root/python/bbg_helpers.py
blob: 9c34899c67284d3bec5054ba8bb794d639d1632f (plain)
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)