def _get_futures_chain_tickers(self): """ Function used to download the expiration dates of the futures contracts, in order to return afterwards current futures tickers. It uses the list of month codes of designated contracts and filter out these, that should not be considered by the future ticker. """ futures_chain_tickers_df = self._data_provider.get_futures_chain_tickers(self, ExpirationDateField.all_dates())[self] # Get the minimum date futures_chain_tickers = futures_chain_tickers_df.min(axis=1) futures_chain_tickers = QFSeries(data=futures_chain_tickers.index, index=futures_chain_tickers.values) futures_chain_tickers.index = pd.to_datetime(futures_chain_tickers.index) # Filter out the non-designated contracts seed = self.family_id.split("{}")[0] designated_contracts_seeds = tuple(seed + month_code for month_code in self.designated_contracts) futures_chain_tickers = futures_chain_tickers[futures_chain_tickers.apply( lambda t: t.ticker.startswith(designated_contracts_seeds) )] return futures_chain_tickers
def _compute_aggregated_volume(self, ticker: FutureTicker, start_date: datetime, end_date: datetime) \ -> Optional[QFSeries]: # Compute the TOTAL VOLUME (aggregated across contracts) futures_chain_tickers_df = self.data_provider.get_futures_chain_tickers( ticker, ExpirationDateField.all_dates())[ticker] # Get the minimum date futures_chain_tickers = futures_chain_tickers_df.min(axis=1) futures_chain_tickers = QFSeries(data=futures_chain_tickers.index, index=futures_chain_tickers.values) futures_chain_tickers.index = to_datetime(futures_chain_tickers.index) futures_chain_tickers = futures_chain_tickers.sort_index() futures_chain_tickers = futures_chain_tickers.loc[start_date:end_date + RelativeDelta( months=6)] all_specific_tickers = futures_chain_tickers.values.tolist() volume_df = self.data_provider.get_price( all_specific_tickers, PriceField.Volume, start_date, end_date, Frequency.DAILY).dropna(axis=1, how="all").fillna(0) return volume_df.sum(axis=1) if not volume_df.empty else None
def _get_futures_chain_tickers(self) -> QFSeries: futures_chain_tickers_df = self._data_provider.get_futures_chain_tickers( self, [ExpirationDateField.LastTradeableDate])[self] futures_chain_tickers_series = futures_chain_tickers_df.loc[:, ExpirationDateField . LastTradeableDate] # Filter out the non-designated contracts month_codes = "|".join(self.designated_contracts) contracts_pattern = self.family_id.format(f"\\d{{4}}({month_codes})") designated_contracts = futures_chain_tickers_series.index[ futures_chain_tickers_series.index.map(lambda t: bool( re.search(f"^{contracts_pattern}$", t.as_string())))] futures_chain_tickers_series = futures_chain_tickers_series.loc[ designated_contracts] futures_chain_tickers = QFSeries(futures_chain_tickers_series.index, futures_chain_tickers_series.values) futures_chain_tickers.index = to_datetime(futures_chain_tickers.index) return futures_chain_tickers
def _get_futures_chain_tickers(self): """ Function used to download the expiration dates of the futures contracts, in order to return afterwards current futures tickers. It uses the list of month codes of designated contracts and filter out these, that should not be considered by the future ticker. """ futures_chain_tickers_df = self._data_provider.get_futures_chain_tickers( self, ExpirationDateField.all_dates())[self] # Get the minimum date futures_chain_tickers_series = futures_chain_tickers_df.min(axis=1) # Filter out the non-designated contracts month_codes = "|".join(self.designated_contracts) contracts_pattern = self.family_id.format(f"({month_codes})\\d{{1,2}}") designated_contracts = futures_chain_tickers_series.index[ futures_chain_tickers_series.index.map(lambda t: bool( re.search(f"^{contracts_pattern}$", t.as_string())))] futures_chain_tickers_series = futures_chain_tickers_series.loc[ designated_contracts] futures_chain_tickers = QFSeries(futures_chain_tickers_series.index, futures_chain_tickers_series.values) futures_chain_tickers.index = to_datetime(futures_chain_tickers.index) return futures_chain_tickers