aboutsummaryrefslogtreecommitdiffstats
path: root/python/bbg_helpers.py
blob: 840ecc330b12459573597ef636700566114daa14 (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
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):
    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 = []
    # 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():
                        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)