예제 #1
0
파일: report.py 프로젝트: xuover/gs-quant
 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)
예제 #2
0
 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
예제 #3
0
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
예제 #4
0
 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]
예제 #5
0
 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)
예제 #6
0
 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
예제 #7
0
파일: entity.py 프로젝트: shlff/gs-quant
 def get_position_dates(self):
     if self.positioned_entity_type == EntityType.PORTFOLIO:
         return GsPortfolioApi.get_position_dates(portfolio_id=self.id)
     raise NotImplementedError