def test_duplicate_instrument(mocker): set_session() dollar_price_values = [[[{ '$type': 'Risk', 'val': 0.01 }], [{ '$type': 'Risk', 'val': 0.02 }], [{ '$type': 'Risk', 'val': 0.03 }]]] mocker.return_value = [dollar_price_values] swap1 = IRSwap('Pay', '10y', 'USD', fixed_rate=0.01, name='swap1') swap2 = IRSwap('Pay', '10y', 'USD', fixed_rate=0.02, name='swap2') swap3 = IRSwap('Pay', '10y', 'USD', fixed_rate=0.03, name='swap3') portfolio = Portfolio((swap1, swap2, swap3, swap1)) assert portfolio.paths('swap1') == (PortfolioPath(0), PortfolioPath(3)) assert portfolio.paths('swap2') == (PortfolioPath(1), ) prices: PortfolioRiskResult = portfolio.dollar_price() assert tuple(prices) == (0.01, 0.02, 0.03, 0.01) assert round(prices.aggregate(), 2) == 0.07 assert tuple(prices[swap1]) == (0.01, 0.01)
def all_paths(self) -> Tuple[PortfolioPath, ...]: paths = () stack = [(None, self)] while stack: parent, portfolio = stack.pop() for idx, priceable in enumerate(portfolio.__priceables): path = parent + PortfolioPath(idx) if parent is not None else PortfolioPath(idx) if isinstance(priceable, Portfolio): stack.insert(0, (path, priceable)) else: paths += (path,) return paths
def paths(self, key: Union[str, PriceableImpl]) -> Tuple[PortfolioPath, ...]: if not isinstance(key, (str, Instrument, Portfolio)): raise ValueError('key must be a name or Instrument or Portfolio') idx = self.__priceables_by_name.get(key) if isinstance( key, str) else self.__priceables_lookup.get(key) paths = tuple(PortfolioPath(i) for i in idx) if idx else () for path, porfolio in ((PortfolioPath(i), p) for i, p in enumerate(self.__priceables) if isinstance(p, Portfolio)): paths += tuple(path + sub_path for sub_path in porfolio.paths(key)) return paths
def test_duplicate_instrument(mocker): with MockCalc(mocker): swap1 = IRSwap('Pay', '1y', 'EUR', name='EUR1y') swap2 = IRSwap('Pay', '2y', 'EUR', name='EUR2y') swap3 = IRSwap('Pay', '3y', 'EUR', name='EUR3y') portfolio = Portfolio((swap1, swap2, swap3, swap1)) assert portfolio.paths('EUR1y') == (PortfolioPath(0), PortfolioPath(3)) assert portfolio.paths('EUR2y') == (PortfolioPath(1), ) with PricingContext(pricing_date=dt.date(2020, 10, 15)): fwds: PortfolioRiskResult = portfolio.calc(risk.IRFwdRate) assert tuple(map(lambda x: round(x, 6), fwds)) == (-0.005378, -0.005224, -0.00519, -0.005378) assert round(fwds.aggregate(), 6) == -0.02117 assert round(fwds[swap1], 6) == -0.005378
def test_nested_portfolios(mocker): swap1 = IRSwap('Pay', '10y', 'USD', name='USD-swap') swap2 = IRSwap('Pay', '10y', 'EUR', name='EUR-swap') swap3 = IRSwap('Pay', '10y', 'GBP', name='GBP-swap') swap4 = IRSwap('Pay', '10y', 'JPY', name='JPY-swap') swap5 = IRSwap('Pay', '10y', 'HUF', name='HUF-swap') swap6 = IRSwap('Pay', '10y', 'CHF', name='CHF-swap') portfolio2_1 = Portfolio((swap1, swap2, swap3), name='portfolio2_1') portfolio2_2 = Portfolio((swap1, swap2, swap3), name='portfolio2_2') portfolio1_1 = Portfolio((swap4, portfolio2_1), name='portfolio1_1') portfolio1_2 = Portfolio((swap5, portfolio2_2), name='USD-swap') portfolio = Portfolio((swap6, portfolio1_1, portfolio1_2), name='portfolio') assert portfolio.paths('USD-swap') == (PortfolioPath(2), PortfolioPath((1, 1, 0)), PortfolioPath((2, 1, 0)))
def paths(self, key: Union[str, PriceableImpl]) -> Tuple[PortfolioPath, ...]: if not isinstance(key, (str, Instrument, Portfolio)): raise ValueError('key must be a name or Instrument or Portfolio') if isinstance(key, str): idx = self.__priceables_by_name.get(key) else: idx = [] for p_idx, p in enumerate(self.__priceables): if p == key or getattr(p, "unresolved", None) == key: idx.append(p_idx) paths = tuple(PortfolioPath(i) for i in idx) if idx else () for path, porfolio in ((PortfolioPath(i), p) for i, p in enumerate(self.__priceables) if isinstance(p, Portfolio)): paths += tuple(path + sub_path for sub_path in porfolio.paths(key)) return paths
def test_single_instrument_new_mock(mocker): with MockCalc(mocker): with PricingContext(pricing_date=dt.date(2020, 10, 15)): swap1 = IRSwap('Pay', '10y', 'USD', name='swap1') portfolio = Portfolio(swap1) fwd: PortfolioRiskResult = portfolio.calc(risk.IRFwdRate) assert portfolio.paths('swap1') == (PortfolioPath(0), ) assert tuple(map(lambda x: round(x, 6), fwd)) == (0.007512, ) assert round(fwd.aggregate(), 2) == 0.01 assert round(fwd[swap1], 6) == 0.007512
def test_single_instrument(mocker): with MockCalc(mocker): swap1 = IRSwap('Pay', '10y', 'USD', fixed_rate=0.0, name='10y@0') portfolio = Portfolio(swap1) assert portfolio.paths('10y@0') == (PortfolioPath(0), ) with PricingContext(pricing_date=dt.date(2020, 10, 15)): prices: PortfolioRiskResult = portfolio.dollar_price() assert tuple(map(lambda x: round(x, 0), prices)) == (7391258.0, ) assert round(prices.aggregate(), 0) == 7391258.0 assert round(prices[swap1], 0) == 7391258.0
def test_single_instrument(mocker): set_session() mocker.return_value = [[[[{'$type': 'Risk', 'val': 0.01}]]]] swap1 = IRSwap('Pay', '10y', 'USD', fixed_rate=0.01, name='swap1') portfolio = Portfolio(swap1) assert portfolio.paths('swap1') == (PortfolioPath(0), ) prices: PortfolioRiskResult = portfolio.dollar_price() assert tuple(prices) == (0.01, ) assert round(prices.aggregate(), 2) == 0.01 assert prices[swap1] == 0.01