def _grab_bbg_data(self): bbg = BBG() self.contract_list = bbg.fetch_futures_list( generic_ticker=self.comm_bbg_code + '1 Comdty') self.first_notice_dates = bbg.fetch_contract_parameter( securities=self.contract_list, field='FUT_NOTICE_FIRST').sort_values('FUT_NOTICE_FIRST') # Grab all contract series df_prices = bbg.fetch_series(securities=self.contract_list, fields='PX_LAST', startdate=self.start_date, enddate=self.end_date) self.prices = df_prices.fillna(method='ffill')
startdate=start_date, enddate=end_date) print(df) # Grabs cashflow payments of corporate bonds df = bbg.fetch_cash_flow('EI1436001 Govt', pd.to_datetime('03-jul-2017')) print(df) # Grabs weights of the components of an index df = bbg.fetch_index_weights(index_name='IBOV Index', ref_date=pd.to_datetime('03-jul-2017')) print(df) print(df.sum()) # Grabs all the contracts from a generic series futures_list = bbg.fetch_futures_list(generic_ticker='TY1 Comdty') print(futures_list) # grabs the first notice date for each contract df_fn = bbg.fetch_contract_parameter(securities=futures_list, field='FUT_NOTICE_FIRST') print(df_fn) # fetches fields with bulk data df_bulk = bbg.fetch_bulk_data(index_name='AAPL US Equity', field='PG_REVENUE', ref_date=start_date) print(df_bulk) # fetches historical dividends df_div = bbg.fetch_dividends('AAPL US Equity', end_date)
class BuildBondFutureTracker(object): futures_ticker_dict = { 'US': 'TY', 'GE': 'RX', 'FR': 'OAT', 'IT': 'IK', 'JP': 'JB', 'AU': 'XM', 'UK': 'G ', 'CA': 'CN' } fx_dict = { 'GE': 'EURUSD Curncy', 'UK': 'GBPUSD Curncy', 'CA': 'CADUSD Curncy', 'JP': 'JPYUSD Curncy', 'AU': 'AUDUSD Curncy', 'FR': 'EURUSD Curncy', 'IT': 'EURUSD Curncy', 'US': 'USD Curncy' } def __init__(self, country, start_date, end_date): self.bbg = BBG() self.country = country self.start_date = self._assert_date_type(start_date) self.end_date = self._assert_date_type(end_date) self.generic_tickers = [ self.futures_ticker_dict[country] + str(x) + ' Comdty' for x in range(1, 4) ] self.df_generics = self._get_generic_future_series() self.df_uc = self._get_underlying_contracts() self.contract_list = self._get_contracts_list() self.df_fn = self._get_first_notice_dates() self.df_prices = self._get_all_prices() df_tracker = self._build_tracker() self.tr_index = df_tracker[['er_index']] self.df_roll_info = df_tracker[[ 'contract_rolling_out', 'roll_out_date', 'holdings' ]].dropna(how='any') def _get_generic_future_series(self): df = self.bbg.fetch_series(securities=self.generic_tickers, fields='PX_LAST', startdate=self.start_date, enddate=self.end_date) return df def _get_underlying_contracts(self): df = self.bbg.fetch_series(securities=self.generic_tickers, fields='FUT_CUR_GEN_TICKER', startdate=self.start_date, enddate=self.end_date) df = df.reindex(self.df_generics.index).fillna(method='ffill') return df def _get_contracts_list(self): contract_list = self.bbg.fetch_futures_list( generic_ticker=self.futures_ticker_dict[self.country] + '1 Comdty') return contract_list def _get_first_notice_dates(self): df = self.bbg.fetch_contract_parameter( securities=self.contract_list, field='FUT_NOTICE_FIRST').sort_values('FUT_NOTICE_FIRST') return df def _get_all_prices(self): tickers = self.contract_list + [self.fx_dict[self.country]] df = self.bbg.fetch_series(securities=tickers, fields='PX_LAST', startdate=self.start_date, enddate=self.end_date) df = df.reindex(self.df_generics.index).fillna(method='ffill') return df def _build_tracker(self): df_tracker = pd.DataFrame(index=self.df_generics.index, columns=[ 'contract_rolling_out', 'er_index', 'roll_out_date', 'holdings' ]) # set the values for the initial date dt_ini = self.df_uc.index[0] df_tracker.loc[dt_ini, 'er_index'] = 100 contract_rolling_out = self.df_uc.loc[ dt_ini, self.futures_ticker_dict[self.country] + '2 Comdty'] + ' Comdty' df_tracker.loc[dt_ini, 'contract_rolling_out'] = contract_rolling_out holdings = df_tracker.loc[dt_ini, 'er_index'] / ( self.df_generics.loc[ dt_ini, self.futures_ticker_dict[self.country] + '2 Comdty'] * self.df_prices[self.fx_dict[self.country]].loc[dt_ini]) df_tracker.loc[dt_ini, 'holdings'] = holdings roll_out_date = self.df_fn.loc[df_tracker.loc[dt_ini, 'contract_rolling_out'], 'FUT_NOTICE_FIRST'] - BDay(1) df_tracker.loc[dt_ini, 'roll_out_date'] = roll_out_date for d, dm1 in zip(df_tracker.index[1:], df_tracker.index[:-1]): df_tracker.loc[d, 'contract_rolling_out'] = contract_rolling_out price_dm1 = self.df_prices.loc[dm1, contract_rolling_out] price_d = self.df_prices.loc[d, contract_rolling_out] pnl = holdings * (price_d - price_dm1) * self.df_prices[ self.fx_dict[self.country]].loc[d] if math.isnan(pnl): pnl = 0 df_tracker.loc[d, 'er_index'] = df_tracker.loc[dm1, 'er_index'] + pnl if d >= roll_out_date.date(): contract_rolling_out = ( self.df_uc.loc[d, self.futures_ticker_dict[self.country] + '2 Comdty'] + ' Comdty') df_tracker.loc[d, 'contract_rolling_out'] = contract_rolling_out holdings = df_tracker.loc[d, 'er_index'] / ( self.df_generics.loc[ d, self.futures_ticker_dict[self.country] + '2 Comdty'] * self.df_prices[self.fx_dict[self.country]].loc[d]) df_tracker.loc[d, 'holdings'] = holdings roll_out_date = self.df_fn.loc[df_tracker.loc[ d, 'contract_rolling_out'], 'FUT_NOTICE_FIRST'] - BDay(1) df_tracker.loc[d, 'roll_out_date'] = roll_out_date return df_tracker @staticmethod def _assert_date_type(date): if type(date) is pd.Timestamp: date = date else: date = pd.to_datetime(date) return date
# value of the qoutes df_generics = bbg.fetch_series( securities=['JB1 Comdty', 'JB2 Comdty', 'JB3 Comdty'], fields='PX_LAST', startdate=start_date, enddate=end_date) # underlying contracts df_uc = bbg.fetch_series(securities=['JB1 Comdty', 'JB2 Comdty', 'JB3 Comdty'], fields='FUT_CUR_GEN_TICKER', startdate=start_date, enddate=end_date) df_uc = df_uc.reindex(df_generics.index).fillna(method='ffill') # all contracts contract_list = bbg.fetch_futures_list(generic_ticker='JB1 Comdty') # first notice date for the contract df_fn = bbg.fetch_contract_parameter( securities=contract_list, field='FUT_NOTICE_FIRST').sort_values('FUT_NOTICE_FIRST') # Grab all contract series contract_list = contract_list + ['JPYUSD Curncy'] df_prices = bbg.fetch_series(securities=contract_list, fields='PX_LAST', startdate=start_date, enddate=end_date) df_prices = df_prices.reindex(df_generics.index).fillna(method='ffill') # sets up the dataframe that will hold our results
class BondFutureTracker(object): futures_ticker_dict = { 'US': 'TY', 'DE': 'RX', 'FR': 'OAT', 'IT': 'IK', 'JP': 'JB', 'AU': 'XM', 'GB': 'G ', 'CA': 'CN' } fx_dict = { 'DE': 'EURUSD Curncy', 'GB': 'GBPUSD Curncy', 'CA': 'CADUSD Curncy', 'JP': 'JPYUSD Curncy', 'AU': 'AUDUSD Curncy', 'FR': 'EURUSD Curncy', 'IT': 'EURUSD Curncy', 'US': 'USD Curncy' } def __init__(self, country, start_date, end_date): assert country in list( self.futures_ticker_dict.keys()), 'Country not yet supported' self.bbg = BBG() self.country = country self.start_date = self._assert_date_type(start_date) self.end_date = self._assert_date_type(end_date) self.generic_tickers = [ self.futures_ticker_dict[country] + str(x) + ' Comdty' for x in range(1, 4) ] self.df_generics = self._get_generic_future_series() self.df_uc = self._get_underlying_contracts() self.contract_list = self._get_contracts_list() self.df_fn = self._get_first_notice_dates() self.df_prices = self._get_all_prices() self.df_tracker = self._build_tracker() self.tr_index = self.df_tracker[['er_index']] self.fh_ticker = 'fibf ' + self.country.lower() + ' 10y' self.df_roll_info = self.df_tracker[[ 'contract_rolling_out', 'roll_out_date', 'holdings' ]].dropna(how='any') self.df_metadata = self._get_metadata() self.df_tracker = self._get_tracker_melted() def _get_tracker_melted(self): df = self.df_tracker[['er_index']].rename({'er_index': self.fh_ticker}, axis=1) df['time_stamp'] = df.index.to_series() df = df.melt(id_vars='time_stamp', var_name='fh_ticker', value_name='value') df = df.dropna() return df def _get_generic_future_series(self): df = self.bbg.fetch_series(securities=self.generic_tickers, fields='PX_LAST', startdate=self.start_date, enddate=self.end_date) return df def _get_underlying_contracts(self): df = self.bbg.fetch_series(securities=self.generic_tickers, fields='FUT_CUR_GEN_TICKER', startdate=self.start_date, enddate=self.end_date) df = df.reindex(self.df_generics.index).fillna(method='ffill') return df def _get_contracts_list(self): contract_list = self.bbg.fetch_futures_list( generic_ticker=self.futures_ticker_dict[self.country] + '1 Comdty') return contract_list def _get_first_notice_dates(self): df = self.bbg.fetch_contract_parameter( securities=self.contract_list, field='FUT_NOTICE_FIRST').sort_values('FUT_NOTICE_FIRST') return df def _get_all_prices(self): tickers = self.contract_list + [self.fx_dict[self.country]] df = self.bbg.fetch_series(securities=tickers, fields='PX_LAST', startdate=self.start_date, enddate=self.end_date) df = df.reindex(self.df_generics.index).fillna(method='ffill') return df def _build_tracker(self): df_tracker = pd.DataFrame(index=self.df_generics.index, columns=[ 'contract_rolling_out', 'er_index', 'roll_out_date', 'holdings' ]) # set the values for the initial date dt_ini = self.df_uc.dropna(how='all').index[0] df_tracker.loc[dt_ini, 'er_index'] = 100 contract_rolling_out = self.df_uc.loc[ dt_ini, self.futures_ticker_dict[self.country] + '2 Comdty'] + ' Comdty' df_tracker.loc[dt_ini, 'contract_rolling_out'] = contract_rolling_out holdings = df_tracker.loc[dt_ini, 'er_index'] / ( self.df_generics.loc[ dt_ini, self.futures_ticker_dict[self.country] + '2 Comdty'] * self.df_prices[self.fx_dict[self.country]].loc[dt_ini]) df_tracker.loc[dt_ini, 'holdings'] = holdings roll_out_date = self.df_fn.loc[df_tracker.loc[dt_ini, 'contract_rolling_out'], 'FUT_NOTICE_FIRST'] - BDay(1) df_tracker.loc[dt_ini, 'roll_out_date'] = roll_out_date for d, dm1 in zip(df_tracker.index[1:], df_tracker.index[:-1]): df_tracker.loc[d, 'contract_rolling_out'] = contract_rolling_out price_dm1 = self.df_prices.loc[dm1, contract_rolling_out] price_d = self.df_prices.loc[d, contract_rolling_out] pnl = holdings * (price_d - price_dm1) * self.df_prices[ self.fx_dict[self.country]].loc[d] if math.isnan(pnl): pnl = 0 df_tracker.loc[d, 'er_index'] = df_tracker.loc[dm1, 'er_index'] + pnl if d >= roll_out_date: contract_rolling_out = ( self.df_uc.loc[d, self.futures_ticker_dict[self.country] + '2 Comdty'] + ' Comdty') df_tracker.loc[d, 'contract_rolling_out'] = contract_rolling_out holdings = df_tracker.loc[d, 'er_index'] / ( self.df_generics.loc[ d, self.futures_ticker_dict[self.country] + '2 Comdty'] * self.df_prices[self.fx_dict[self.country]].loc[d]) df_tracker.loc[d, 'holdings'] = holdings roll_out_date = self.df_fn.loc[df_tracker.loc[ d, 'contract_rolling_out'], 'FUT_NOTICE_FIRST'] - BDay(1) df_tracker.loc[d, 'roll_out_date'] = roll_out_date return df_tracker @staticmethod def _assert_date_type(date): if type(date) is pd.Timestamp: date = date else: date = pd.to_datetime(date) return date def _get_metadata(self): df = pd.DataFrame(index=[0], data={ 'fh_ticker': self.fh_ticker, 'asset_class': 'fixed income', 'type': 'bond future', 'exchange_symbol': self.futures_ticker_dict[self.country], 'currency': 'USD', 'country': self.country, 'maturity': 10 }) return df