def schedule(self, start_date: dt.date = None, end_date: dt.date = None, backcast: bool = None): if None in [self.id, self.__position_source_id]: raise MqValueError( 'Can only schedule reports with valid IDs and Position Source IDs.' ) if self.position_source_type != PositionSourceType.Portfolio and None in [ start_date, end_date ]: raise MqValueError( 'Must specify schedule start and end dates for report.') if None in [start_date, end_date]: position_dates = GsPortfolioApi.get_position_dates( self.position_source_id) if len(position_dates) == 0: raise MqValueError( 'Cannot schedule reports for a portfolio with no positions.' ) if start_date is None: start_date = business_day_offset(min(position_dates) - relativedelta(years=1), -1, roll='forward') \ if backcast else min(position_dates) if end_date is None: end_date = min( position_dates) if backcast else business_day_offset( dt.date.today(), -1, roll='forward') GsReportApi.schedule_report(report_id=self.id, start_date=start_date, end_date=end_date, backcast=backcast)
def _get_instruments(self, position_date: dt.date, in_place: bool, return_priceables: bool = True): if self.id: dates_prior = list(filter(lambda date: date < position_date, GsPortfolioApi.get_position_dates(self.id))) if len(dates_prior) == 0: raise ValueError('Your portfolio has no positions on the PositionContext date') date = max(dates_prior) response = GsPortfolioApi.get_positions_for_date(self.id, date) positions = response.positions if response else [] instruments = GsAssetApi.get_instruments_for_positions(positions) if in_place: self.__priceables = instruments return instruments return self.__priceables if return_priceables else self.all_instruments
def test_get_portfolio_position_dates(mocker): id_1 = 'MP1' mock_response = {'results': ('2019-02-18', '2019-02-19'), 'totalResults': 2} expected_response = (dt.date(2019, 2, 18), dt.date(2019, 2, 19)) # mock GsSession mocker.patch.object(GsSession.__class__, 'current', return_value=GsSession.get(Environment.QA, 'client_id', 'secret')) mocker.patch.object(GsSession.current, '_get', return_value=mock_response) # run test response = GsPortfolioApi.get_position_dates(id_1) GsSession.current._get.assert_called_with('/portfolios/{id}/positions/dates'.format(id=id_1)) assert response == expected_response
def get_schedule_dates(self, backcast: bool) -> List[dt.date]: """ Get recommended start and end dates for a portfolio report scheduling job :param backcast: true if reports should be backcasted :return: a list of two dates, the first is the suggested start date and the second is the suggested end date """ position_dates = GsPortfolioApi.get_position_dates(self.__portfolio_id) if len(position_dates) == 0: raise MqValueError( 'Cannot schedule reports for a portfolio with no positions.') if backcast: start_date = business_day_offset(min(position_dates) - relativedelta(years=1), -1, roll='forward') end_date = min(position_dates) else: start_date = min(position_dates) end_date = max(position_dates) return [start_date, end_date]
def schedule(self, start_date: dt.date = None, end_date: dt.date = None): if None in [self.id, self.__position_source_id]: raise MqValueError( 'Can only schedule reports with valid IDs and Position Source IDs.' ) if self.position_source_type != PositionSourceType.Portfolio and None in [ start_date, end_date ]: raise MqValueError( 'Must specify schedule start and end dates for report.') if None in [start_date, end_date]: position_dates = GsPortfolioApi.get_position_dates( self.position_source_id) if len(position_dates) == 0: raise MqValueError( 'Cannot schedule reports for a portfolio with no positions.' ) if start_date is None: start_date = min(position_dates) if end_date is None: end_date = max(position_dates) GsReportApi.schedule_report(report_id=self.id, start_date=start_date, end_date=end_date)
def get_position_dates(self) -> Tuple[dt.date, ...]: if self.positioned_entity_type == EntityType.PORTFOLIO: return GsPortfolioApi.get_position_dates(portfolio_id=self.id) if self.positioned_entity_type == EntityType.ASSET: return GsAssetApi.get_position_dates(asset_id=self.id) raise NotImplementedError
def get_position_dates(self): if self.positioned_entity_type == EntityType.PORTFOLIO: return GsPortfolioApi.get_position_dates(portfolio_id=self.id) raise NotImplementedError