def test_diff_in_years(self): s = BusinessDate('20011110') e = BusinessDate('20011112') self.assertEqual(BusinessDate.diff_in_years(s, e), 2 / DAYS_IN_YEAR) self.assertEqual( BusinessDate.diff_in_years(BusinessDate('20161101'), BusinessDate('20171102')), 366 / DAYS_IN_YEAR)
def get_present_value(self, value_date=BusinessDate(), index_model_dict={}): r""" returns the forward value of a amortizing collateral Parameters: value_date (BusinessDate): date of the valuation value_currency_name (Currency): valueation currrency index_model_dict (IndexModel): dict of IndexModel Returns: (float): forward value of a financial security The forward value at time :math:`t`, i.e. :math:`S_t`, is calculated by a linear depreciation of the prime costs :math:`AK` such that .. math:: :nowrap: \[ S_t = \max \left( \left(AK \left(1-\frac{t-t_{AK}} {T_{max}}\right) \right),0\right) \] where :math:`T_{max}` is the maximum amortization BusinessPeriod, :math:`t_{AK}` is the time of acquisition. """ s = self._acquisition_date_.to_businessdate(self.origin) e = self._amortization_date_.to_businessdate(self.origin) t_max = BusinessDate.diff_in_years(s, e) v = value_date.to_businessdate(self.origin) t = BusinessDate.diff_in_years(s, v) expected_value = max(self._notional_ * (1 - (t / t_max)), 0) return expected_value * self._discount_index_.get_value(value_date)
def get_expected_credit_loss(self, value_date=BusinessDate(), start_date=None, end_date=None, index_model_dict={}): """ gets the expected credit loss between desired dates :param value_date: :param start_date: :param end_date: :param index_model_dict (optional): dict of index models incl. default loss model :return: float """ if not end_date: end_date = max(c.maturity for c in self._contract_list_) end_date = end_date.to_businessdate(self.origin) if not start_date: start_date = self.origin start_date = start_date.to_businessdate(self.origin) freq = self._ecl_frequency_.period schedule = BusinessSchedule(start_date, end_date, freq, start_date) dcc = ActAct() total_ecl = 0.0 for loop_date, e in zip(schedule[:-1], schedule[1:]): df = Continuous().disc_factor_from_rate(start_date, loop_date, dcc, self._effective_rate) svp = self._survival_index.get_value(loop_date) yf = BusinessDate.diff_in_years(loop_date, e) fwd = 1 - self._survival_index.get_value(e, loop_date) loss = self.get_expected_default_loss(loop_date, index_model_dict) ecl = df * svp * yf * fwd * loss total_ecl += ecl return total_ecl
def test_diff_in_years(self): s = BusinessDate('20011110') e = BusinessDate('20011112') self.assertEqual(BusinessDate.diff_in_years(s, e), 2 / DAYS_IN_YEAR) self.assertEqual(BusinessDate.diff_in_years(BusinessDate('20161101'), BusinessDate('20171102')), 366 / DAYS_IN_YEAR)