Esempio n. 1
0
 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)
Esempio n. 2
0
    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)
Esempio n. 3
0
    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
Esempio n. 4
0
 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)