def save(self, overwrite: Optional[bool] = False): if self.portfolios: raise ValueError('Cannot save portfolios with nested portfolios') if self.__id: if not overwrite: raise ValueError( f'Portfolio with id {id} already exists. Use overwrite=True to overwrite' ) else: if not self.__name: raise ValueError('name not set') self.__id = GsPortfolioApi.create_portfolio( MarqueePortfolio('USD', self.__name)).id _logger.info( f'Created Marquee portfolio {self.__name} with id {self.__id}') position_set = PositionSet( position_date=self.__position_context.position_date, positions=tuple( Position( asset_id=GsAssetApi.get_or_create_asset_from_instrument(i)) for i in self.instruments)) if len(position_set.positions) > 0: GsPortfolioApi.update_positions(self.__id, [position_set])
def _create(self): # If a priceables portfolio, try resolving to MQ portfolio if self.__priceables: self.save() self.priceables = None return # If a positions portfolio, create using MQ API port = GsPortfolioApi.create_portfolio( portfolio=MQPortfolio(name=self.name, currency=self.currency, entitlements=self.entitlements.to_target())) PositionedEntity.__init__(self, port.id, EntityType.PORTFOLIO) Entity.__init__(self, port.id, EntityType.PORTFOLIO) self.__id = port.id self._PositionedEntity__entity_type = EntityType.PORTFOLIO self.entitlements = Entitlements.from_target(port.entitlements) self.currency = Currency(port.currency) # If the portfolio contains positions, upload them to the MQ portfolio and schedule reports if self.position_sets: position_sets = self.position_sets self.position_sets = None self.update_positions(position_sets, False) self._schedule_first_reports( [pos_set.date for pos_set in position_sets]) self.position_sets = None
def test_create_portfolio(mocker): id_1 = 'MP1' portfolio = Portfolio(id=id_1, currency='USD', name='Example Port') # mock GsSession mocker.patch.object(GsSession.__class__, 'current', return_value=GsSession.get(Environment.QA, 'client_id', 'secret')) mocker.patch.object(GsSession.current, '_post', return_value=portfolio) # run test response = GsPortfolioApi.create_portfolio(portfolio) GsSession.current._post.assert_called_with('/portfolios', portfolio, cls=Portfolio) assert response == portfolio
def save(self): if not self.name: raise ValueError('name not set') try: portfolio_id = GsPortfolioApi.get_portfolio_by_name(self.name).id except ValueError: from gs_quant.target.portfolios import Portfolio as MarqueePortfolio portfolio_id = GsPortfolioApi.create_portfolio(MarqueePortfolio('USD', self.name)).id _logger.info('Created Marquee portfolio with ID: {}'.format(portfolio_id)) position_set = PositionSet( position_date=dt.date.today(), positions=tuple(Position(asset_id=GsAssetApi.get_or_create_asset_from_instrument(i)) for i in self.instruments)) GsPortfolioApi.update_positions(portfolio_id, (position_set,))
def save(self, overwrite: Optional[bool] = False): if self.portfolios: raise ValueError('Cannot save portfolios with nested portfolios') if self.__id: if not overwrite: raise ValueError( f'Portfolio with id {id} already exists. Use overwrite=True to overwrite' ) else: if not self.__name: raise ValueError('name not set') try: self.__id = GsPortfolioApi.get_portfolio_by_name( self.__name).id if not overwrite: raise RuntimeError( f'Portfolio {self.__name} with id {self.__id} already exists. Use overwrite=True to overwrite' ) except ValueError: from gs_quant.target.portfolios import Portfolio as MarqueePortfolio self.__id = GsPortfolioApi.create_portfolio( MarqueePortfolio('USD', self.__name)).id _logger.info( f'Created Marquee portfolio {self.__name} with id {self.__id}' ) position_set = PositionSet( position_date=dt.date.today(), positions=tuple( Position( asset_id=GsAssetApi.get_or_create_asset_from_instrument(i)) for i in self.instruments)) GsPortfolioApi.update_positions(self.__id, (position_set, ))