Esempio n. 1
0
    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')
Esempio n. 2
0
                      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
Esempio n. 5
0
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