diff options
Diffstat (limited to 'python/bbg_helpers.py')
| -rw-r--r-- | python/bbg_helpers.py | 101 |
1 files changed, 64 insertions, 37 deletions
diff --git a/python/bbg_helpers.py b/python/bbg_helpers.py index 6205f7ab..1abac308 100644 --- a/python/bbg_helpers.py +++ b/python/bbg_helpers.py @@ -7,7 +7,8 @@ import datetime logger = logging.getLogger(__name__) -BBG_IP = ["guillaume-pc", "edwin-pc", '192.168.0.10', '192.168.0.12'] +BBG_IP = ["guillaume-pc", "edwin-pc", "192.168.0.10", "192.168.0.12"] + @contextmanager def init_bbg_session(ip_list, port=8194): @@ -33,8 +34,9 @@ def init_bbg_session(ip_list, port=8194): finally: session.stop() + def append_overrides(request, d): - overrides = request.getElement('overrides') + overrides = request.getElement("overrides") for k, v in d.items(): o = overrides.appendElement() o.setElement("fieldId", k) @@ -47,7 +49,7 @@ def append_overrides(request, d): def event_loop(session, request): session.sendRequest(request) # Process received events - while(True): + 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]: @@ -76,10 +78,14 @@ def get_pythonvalue(e): def field_array_todf(field): - df = pd.DataFrame.from_dict([{str(e.name()): get_pythonvalue(e) for e in f.elements()} \ - for f in field.values()]) + df = pd.DataFrame.from_dict( + [ + {str(e.name()): get_pythonvalue(e) for e in f.elements()} + for f in field.values() + ] + ) if "date" in df: - df = df.set_index('date') + df = df.set_index("date") return df @@ -101,7 +107,9 @@ def process_reference_msg(msg): if not field.isValid(): logger.info(f"Invalid field: {str(field)}") elif field.isArray(): - row[str(field.name())] = field_array_todf(field) #to convert dates to timestamps + row[str(field.name())] = field_array_todf( + field + ) # to convert dates to timestamps else: row[str(field.name())] = get_pythonvalue(field) data[securityName] = row @@ -113,9 +121,17 @@ def process_intraday_tick_msg(msg): return field_array_todf(tickdata) -def retrieve_data(session, securities, fields=[], overrides={}, - start_date=None, end_date=None, frequency="DAILY", - options={}, event_types=["TRADE"]): +def retrieve_data( + session, + securities, + fields=[], + overrides={}, + start_date=None, + end_date=None, + frequency="DAILY", + options={}, + event_types=["TRADE"], +): """ Convenience function to retrieve data from the Bloomberg API. @@ -154,7 +170,7 @@ def retrieve_data(session, securities, fields=[], overrides={}, else: request.set("security", securities) else: - if hasattr(securities, '__iter__'): + if hasattr(securities, "__iter__"): for security in securities: request.append("securities", security) else: @@ -171,12 +187,12 @@ def retrieve_data(session, securities, fields=[], overrides={}, if start_date: if request.asElement().name() == blpapi.Name("IntradayTickRequest"): - start_date = timezone('America/New_York').localize(start_date) - start_date = start_date.astimezone(timezone('GMT')) + start_date = timezone("America/New_York").localize(start_date) + start_date = start_date.astimezone(timezone("GMT")) request.set("startDateTime", start_date) if end_date: - end_date = timezone('America/New_York').localize(end_date) - end_date = end_date.astimezone(timezone('GMT')) + end_date = timezone("America/New_York").localize(end_date) + end_date = end_date.astimezone(timezone("GMT")) request.set("endDateTime", end_date) else: request.set("startDate", "{:%Y%m%d}".format(start_date)) @@ -185,8 +201,8 @@ def retrieve_data(session, securities, fields=[], overrides={}, data = {} for msg in event_loop(session, request): - if msg.hasElement('responseError'): - logger.error(msg.getElement('responseError').getElementAsString('message')) + if msg.hasElement("responseError"): + logger.error(msg.getElement("responseError").getElementAsString("message")) continue if msg.messageType() == blpapi.Name("ReferenceDataResponse"): data.update(process_reference_msg(msg)) @@ -196,8 +212,8 @@ def retrieve_data(session, securities, fields=[], overrides={}, data.update(process_intraday_tick_msg(msg)) if request.asElement().name() == blpapi.Name("IntradayTickRequest"): df = pd.DataFrame(data) - if 'time' in df: - df.time = df.time.dt.tz_convert('America/New_York') + if "time" in df: + df.time = df.time.dt.tz_convert("America/New_York") return df else: return data @@ -205,26 +221,37 @@ def retrieve_data(session, securities, fields=[], overrides={}, if __name__ == "__main__": testdate = pd.datetime(2013, 1, 1) - hist_securities = ['CADUSD Curncy', "EURUSD Curncy"] - hist_fields = ['PX_LAST'] - securities = ['004421BW2 Mtge', '75157EAE2 Mtge', 'XS0295516776 Mtge'] - fields = ['CUR_CPN', 'START_ACC_DT'] + hist_securities = ["CADUSD Curncy", "EURUSD Curncy"] + hist_fields = ["PX_LAST"] + securities = ["004421BW2 Mtge", "75157EAE2 Mtge", "XS0295516776 Mtge"] + fields = ["CUR_CPN", "START_ACC_DT"] with init_bbg_session(BBG_IP) as session: - hist_data = retrieve_data(session, securities, hist_fields, start_date=testdate.date(), - frequency="MONTHLY") - overrides={'SETTLE_DT': testdate} + hist_data = retrieve_data( + session, + securities, + hist_fields, + start_date=testdate.date(), + frequency="MONTHLY", + ) + overrides = {"SETTLE_DT": testdate} ref_data = retrieve_data(session, securities, fields, overrides=overrides) struct_data = retrieve_data(session, securities, ["HIST_CASH_FLOW"]) - spx_ndx_monthly = retrieve_data(session, ["SPX Index", "NDX Index"], - fields=["PX_LAST"], - start_date=datetime.date(2012, 1, 1), - options={'periodicityAdjustment': 'ACTUAL'}, - frequency="MONTHLY") - trace_data = retrieve_data(session, "BNCMT 2007-1 A5@TRAC Mtge", - start_date=datetime.datetime(2018, 5, 18, 9), - end_date=datetime.datetime(2018, 9, 18, 9)) + spx_ndx_monthly = retrieve_data( + session, + ["SPX Index", "NDX Index"], + fields=["PX_LAST"], + start_date=datetime.date(2012, 1, 1), + options={"periodicityAdjustment": "ACTUAL"}, + frequency="MONTHLY", + ) + trace_data = retrieve_data( + session, + "BNCMT 2007-1 A5@TRAC Mtge", + start_date=datetime.datetime(2018, 5, 18, 9), + end_date=datetime.datetime(2018, 9, 18, 9), + ) today = datetime.datetime.today() yesterday = today - datetime.timedelta(days=1) - tick_data = retrieve_data(session, "GOOG US Equity", - start_date=yesterday, - end_date=today) + tick_data = retrieve_data( + session, "GOOG US Equity", start_date=yesterday, end_date=today + ) |
