def construct_vendor_md_request(self, md_request): """Creates a MarketDataRequest with the vendor tickers Parameters ---------- md_request : MarketDataRequest contains all the various parameters detailing time series start and finish, tickers etc Returns ------- MarketDataRequest """ symbols_vendor = self.translate_to_vendor_ticker(md_request) fields_vendor = self.translate_to_vendor_field(md_request) md_request_vendor = MarketDataRequest( md_request=md_request) md_request_vendor.tickers = symbols_vendor md_request_vendor.fields = fields_vendor md_request_vendor.old_tickers = md_request.tickers return md_request_vendor
def load_ticker(self, md_request): """Retrieves market data from external data source (in this case Bloomberg) Parameters ---------- md_request : MarketDataRequest contains all the various parameters detailing time series start and finish, tickers etc Returns ------- DataFrame """ constants = DataConstants() md_request = MarketDataRequest(md_request=md_request) md_request_vendor = self.construct_vendor_md_request(md_request) data_frame = None logger = LoggerManager().getLogger(__name__) logger.info("Request Bloomberg data") # Do we need daily or intraday data? if (md_request.freq in ['daily', 'weekly', 'monthly', 'quarterly', 'yearly']): # Work out the fields which need to be downloaded via Bloomberg ref request (BDP) and # those that can be downloaded via Historical request (BDH) ref_fields = [] ref_vendor_fields = [] # Get user defined list of BBG fields/vendor fields which need to # be downloaded by BDP bbg_ref_fields = list(constants.bbg_ref_fields.keys()) bbg_ref_vendor_fields = list(constants.bbg_ref_fields.values()) for i in range(0, len(md_request.fields)): if md_request.fields[i] in bbg_ref_fields \ or md_request_vendor.fields[ i] in bbg_ref_vendor_fields: ref_fields.append(md_request.fields[i]) ref_vendor_fields.append(md_request_vendor.fields[i]) non_ref_fields = [] non_ref_vendor_fields = [] for i in range(0, len(md_request.fields)): if md_request.fields[i] not in bbg_ref_fields \ and md_request_vendor.fields[ i] not in bbg_ref_vendor_fields: non_ref_fields.append(md_request.fields[i]) non_ref_vendor_fields.append(md_request_vendor.fields[i]) # For certain cases, need to use ReferenceDataRequest # eg. for events times/dates, last tradeable date fields (when specified) if len(ref_fields) > 0: # Careful: make sure you copy the market data request object # (when threading, altering that can # cause concurrency issues!) old_fields = copy.deepcopy(md_request.fields) old_vendor_fields = copy.deepcopy(md_request_vendor.fields) # md_request = MarketDataRequest(md_request=md_request_copy) md_request.fields = ref_fields md_request.vendor_fields = ref_vendor_fields md_request_vendor = self.construct_vendor_md_request( md_request) # Just select those reference fields to download via reference datetime_data_frame = self.get_reference_data( md_request_vendor, md_request) # Download all the other event or non-ref fields # (uses HistoricalDataRequest to Bloomberg) # concatenate with date time fields if len(non_ref_fields) > 0: md_request.fields = non_ref_fields md_request.vendor_fields = non_ref_vendor_fields md_request_vendor = self.construct_vendor_md_request( md_request) events_data_frame = self.get_daily_data( md_request, md_request_vendor) col = events_data_frame.index.name events_data_frame = events_data_frame.reset_index( drop=False) data_frame = pd.concat( [events_data_frame, datetime_data_frame], axis=1) temp = data_frame[col] del data_frame[col] data_frame.index = temp else: data_frame = datetime_data_frame md_request.fields = copy.deepcopy(old_fields) md_request_vendor.fields = copy.deepcopy(old_vendor_fields) # For all other daily/monthly/quarter data, we can use # HistoricalDataRequest to Bloomberg else: data_frame = self.get_daily_data(md_request, md_request_vendor) # if data_frame is not None: # # Convert fields with release-dt to dates (special case!) and assume everything else numerical # for c in data_frame.columns: # try: # if 'release-dt' in c: # data_frame[c] = (data_frame[c]).astype('int').astype(str).apply( # lambda x: pd.to_datetime(x, format='%Y%m%d')) # else: # data_frame[c] = pd.to_numeric(data_frame[c]) # except: # pass # Assume one ticker only for intraday data and use IntradayDataRequest # to Bloomberg if (md_request.freq in ['tick', 'intraday', 'second', 'minute', 'hourly']): md_request_vendor.tickers = \ md_request_vendor.tickers[0] if md_request.freq in ['tick', 'second']: data_frame = self.download_tick(md_request_vendor) else: data_frame = self.download_intraday(md_request_vendor) if data_frame is not None: if data_frame.empty: try: logger.info("No tickers returned for: " + md_request_vendor.tickers) except: pass return None cols = data_frame.columns.values import pytz try: data_frame = data_frame.tz_localize(pytz.utc) except: data_frame = data_frame.tz_convert(pytz.utc) cols = md_request.tickers[0] + "." + cols data_frame.columns = cols logger.info("Completed request from Bloomberg.") return data_frame