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