def test_Prefix_decorator(self):
        baz = 'baz'
        barz = 'barz'
        name = 'fara'

        with Record() as rec:
            foo = Foo(name)
            foo.do_something(baz, barz)
            foo.bar(baz, barz)

        assumed_record_entries = {
            ('Foo({}).do_something'.format(name), 'again_a_key'):
            baz,
            ('Foo({}).do_something'.format(name), 'so_creative'):
            barz,
            ('Foo({}).bar'.format(name), 'Foo({}).do_something'.format(name), 'again_a_key'):
            baz,
            ('Foo({}).bar'.format(name), 'Foo({}).do_something'.format(name), 'so_creative'):
            barz,
            ('Foo({}).bar'.format(name), 'a_key'):
            "That's",
            ('Foo({}).bar'.format(name), 'another_key'):
            "great"
        }
        self.assertEqual(Record().entries, assumed_record_entries)
Exemple #2
0
    def get_present_value(self,
                          value_date=BusinessDate(),
                          index_model_dict={}):
        """

        :param value_date:
        :param index_model_dict:
        :return:
        """
        pv_let = 0.0
        pv_let_value_ccy = None
        df = None
        fx = None

        if self._pay_date_ > value_date:
            fx = 1.0  # fixme: handle other ccy, too.
            df = self._discount_index_.get_value(self._pay_date_, value_date)
            pv_let_value_ccy = df * self._notional_
            pv_let = fx * pv_let_value_ccy

        Record(notional=self._notional_,
               pay_date=self._pay_date_,
               disc_fact=df,
               fx=fx,
               pv_let=pv_let,
               pv_let_value_ccy=pv_let_value_ccy,
               disc_index=self._discount_index_.object_name,
               fx_index=self._f_x_index_.object_name)

        return pv_let
Exemple #3
0
    def _get_discounted_value(self,
                              value_date,
                              payoff,
                              discount_index,
                              pay_date=None):
        """ discounts the payoff by discount_index values

        :param value_date:
        :param payoff:
        :param discount_index:
        :param pay_date:
        :return:
        """
        if pay_date is None:
            pay_date = self.pay_date
        df = discount_index.get_value(pay_date, value_date)
        pv_let = df * payoff

        Record(pay_off=payoff,
               pv_let=pv_let,
               disc_fact=df,
               disc_index=str(discount_index),
               pay_date=self.pay_date)

        return pv_let
Exemple #4
0
    def get_expected_payoff(self,
                            value_date=BusinessDate(),
                            index_model_dict={}):
        """ calculates expected payoff at paydate

        :param BusinessDate value_date:
        :param IndexModel index_model_dict:
        :return: float, the pv of the cash flow
        """
        idx_model = index_model_dict.get(self._rate_index_.object_name,
                                         self._rate_index_.index_model)

        payoff = 0.0
        is_fixed_cash_flow = False
        fwd = None
        fixing_value = None
        time = None
        vol = None
        strike = self._get_strike_value()
        effective_strike = (strike - self._spread_) / self._multiplier_
        pay_rec = 1.0 if self._notional_ >= 0.0 else -1.0
        rate_ccy = self._rate_index_.currency

        if self._pay_date_ > value_date:
            if self._rate_index_.has_fixing(self._reset_date_):
                is_fixed_cash_flow = True
                fixing_value = self._rate_index_.get_fixing(self._reset_date_)
                rate = self._payoff(fixing_value, effective_strike)
            else:
                rate, vol, time, fwd = self._get_option_value(
                    idx_model, effective_strike)

            rate *= self._multiplier_
            rate += self._spread_
            payoff = rate * self._year_fraction_ * self._notional_ + self._amount_

        Record(pay_rec="REC" if pay_rec == 1.0 else "PAY",
               year_fraction=self.year_fraction,
               cf_name=self.object_name,
               notional=self._notional_,
               currency=self.currency,
               forward=fwd,
               is_fixed_cash_flow=is_fixed_cash_flow,
               fixing_value=fixing_value,
               vol=vol,
               expiry_time=time,
               spread=self._spread_,
               reset_date=self._reset_date_,
               start_date=self._start_date_,
               end_date=self._end_date_,
               pay_date=self._pay_date_,
               constant_rate=self._constant_rate_,
               amount=self._amount_,
               strike=strike,
               effective_strike=effective_strike,
               index=self._rate_index_.object_name,
               expected_payoff=payoff,
               rate_ccy=rate_ccy)  # pylint: disable=unexpected-keyword-arg

        return payoff
Exemple #5
0
    def get_expected_payoff(self,
                            value_date=BusinessDate(),
                            index_model_dict={}):
        """ calculates expected payoff at paydate

        :param BusinessDate value_date:
        :param IndexModel index_model_dict:
        :return: float, the pv of the cash flow
        """
        rate = 0.0
        is_fix_rate = True
        is_fixed_cash_flow = False
        fwd = None
        fixing_value = None
        time = None
        vol = None
        effective_floor_strike = None
        effective_cap_strike = None
        pay_rec = 1.0 if self._notional_ >= 0.0 else -1.0
        payoff = 0.0
        rate_ccy = self.currency

        if self._pay_date_ > value_date:
            rate += self._constant_rate_

            fx_index = self._get_fx_index(self.currency)
            fx = fx_index.get_value(value_date) if fx_index else 1.0

            payoff = fx * rate * self._year_fraction_ * self._notional_ + self._amount_

        Record(pay_rec="REC" if pay_rec == 1.0 else "PAY",
               year_fraction=self.year_fraction,
               cf_name=self.object_name,
               notional=self._notional_,
               currency=self.currency,
               rate_ccy=rate_ccy,
               is_fix_rate=is_fix_rate,
               forward=fwd,
               is_fixed_cash_flow=is_fixed_cash_flow,
               fixing_value=fixing_value,
               vol=vol,
               expiry_time=time,
               spread=self._spread_,
               reset_date=self._reset_date_,
               start_date=self._start_date_,
               end_date=self._end_date_,
               pay_date=self._pay_date_,
               constant_rate=self._constant_rate_,
               amount=self._amount_,
               effective_floor_strike=effective_floor_strike,
               effective_cap_strike=effective_cap_strike,
               index=self._rate_index_.object_name,
               expected_payoff=payoff,
               floor=None if self._floor_ == NO_FLOOR_VALUE else self._floor_,
               cap=None if self._cap_ == NO_CAP_VALUE else self._cap_)  # pylint: disable=unexpected-keyword-arg

        return payoff
Exemple #6
0
    def test_call_to_RecordClass_start_stop(self):
        value = 'value'

        a_dict = {'a_key': 'a_value'}
        b_dict = {'b_key': 'b_value'}

        Record().start()
        Record(key=value)
        self.assertEqual(Record().entries, {('key',):'value'})
        Record(a_dict)
        self.assertEqual(Record().entries, {('key',):'value', ('a_key',):'a_value'})
        Record().stop()
        Record(b_dict, INT=12345)
        self.assertEqual(Record().entries, {('key',):'value', ('a_key',):'a_value'})
Exemple #7
0
 def test_multilevel_record_context(self):
     R1 = Record()
     R2 = Record()
     self.assertEqual(R1, R2)
     with Record() as R1:
         with Record() as R2a:
             self.assertNotEqual(R1, R2a)
             self.assertEqual(Record(), R2a)
         with Record() as R2b:
             self.assertNotEqual(R1, R2b)
             self.assertEqual(Record(), R2b)
         self.assertNotEqual(R2a, R2b)
Exemple #8
0
 def _prepare_return(self, value, vol, time, forward):
     possign = self._position_sign()
     payoff = self._notional_ * possign * value
     #pv = self._get_discounted_value(value_date, payoff, self._underlying_.domestic_currency)
     Record(expected_payoff=payoff,
            opt_value=value,
            vol=vol,
            time=time,
            forward=forward,
            strike=self._strike_,
            position_sign=possign,
            notional=self._notional_,
            pay_ccy=self._pay_currency_)
     return payoff
Exemple #9
0
    def test_call_to_RecordClass_not_started(self):
        value = 'value'
        a_dict = {'a_key': 'a_value'}

        Record(key=value)
        self.assertEqual(Record().entries, dict())
        Record(a_dict)
        self.assertEqual(Record().entries, dict())
        Record(a_dict, key=value)
        self.assertEqual(Record().entries, dict())
Exemple #10
0
    def test_Record_as_context(self):
        a_dict = {'a_key': 'a_value'}
        Record(a_dict, key='value')
        self.assertEqual(Record().entries, dict())

        with Record() as R:
            Record(a_dict)
            self.assertEqual(Record().entries, {('a_key',): 'a_value'})
            self.assertEqual(R, Record())

        self.assertEqual(R.entries, {('a_key',): 'a_value'})
Exemple #11
0
    def get_expected_payoff(self,
                            value_date=BusinessDate(),
                            index_model_dict={}):
        """

        :param value_date:
        :param index_model_dict:
        :return:
        """
        payoff = 0.0
        rate = None
        if self._pay_date_ > value_date:
            rate_idx = self._rate_index_
            fixing_fct = OISCashFlow.ConstFixing(rate_idx)
            oispayoff = OISCashFlow.OISPayoff(rate_idx.index_model.yieldcurve,
                                              fixing_fct, rate_idx._calendar_,
                                              rate_idx._day_count_)
            rate = oispayoff.calc_payoff(value_date, self._start_date_,
                                         self._end_date_, self._year_fraction_)
            rate *= self._multiplier_
            rate += self._spread_
            payoff = rate * self._year_fraction_ * self._notional_ + self._amount_

        Record(year_fraction=self.year_fraction,
               cf_name=self.object_name,
               notional=self._notional_,
               currency=self.currency,
               forward=rate,
               spread=self._spread_,
               reset_date=self._reset_date_,
               start_date=self._start_date_,
               end_date=self._end_date_,
               pay_date=self._pay_date_,
               amount=self._amount_,
               index=self._rate_index_.object_name,
               expected_payoff=payoff)  # pylint: disable=unexpected-keyword-arg

        return payoff
Exemple #12
0
    def get_expected_payoff(self,
                            value_date=BusinessDate(),
                            index_model_dict={}):
        """ calculates expected payoff at paydate

        :param BusinessDate value_date:
        :param IndexModel index_model_dict:
        :return: float, the pv of the cash flow
        """
        idx_model = index_model_dict.get(self._rate_index_.object_name,
                                         self._rate_index_.index_model)
        rate = 0.0
        is_fix_rate = True
        is_fixed_cash_flow = False
        fwd = None
        fixing_value = None
        time = None
        vol = None
        effective_floor_strike = None
        effective_cap_strike = None
        pay_rec = 1.0 if self.is_rec else -1.0
        payoff = 0.0
        rate_ccy = self.currency

        if self._pay_date_ > value_date:
            if self._constant_rate_:
                rate += self._constant_rate_
            else:
                is_fix_rate = False  # fixme: be consistent, use is_fixed_flow?
                rate_ccy = self._rate_index_.currency

                if self._rate_index_.has_fixing(self._reset_date_):
                    is_fixed_cash_flow = True
                    fixing_value = self._rate_index_.get_fixing(
                        self._reset_date_)
                    rate = fixing_value
                else:
                    fwd = idx_model.get_value(self._rate_index_,
                                              self._reset_date_,
                                              self._pay_date_)
                    rate = fwd

                if self._floor_ != NO_FLOOR_VALUE:
                    effective_floor_strike = (
                        self._floor_ - self._spread_) / self._multiplier_
                    if not is_fixed_cash_flow:
                        value, vol, time, fwd = idx_model.get_option_payoff_value(
                            self._rate_index_, Put(), effective_floor_strike,
                            self._reset_date_)
                    else:
                        value = max(effective_floor_strike - rate, 0)
                    rate += value

                if self._cap_ != NO_CAP_VALUE:
                    effective_cap_strike = (self._cap_ -
                                            self._spread_) / self._multiplier_
                    if not is_fixed_cash_flow:
                        value, vol, time, fwd = idx_model.get_option_payoff_value(
                            self._rate_index_, Call(), effective_cap_strike,
                            self._reset_date_)
                    else:
                        value = max(rate - effective_cap_strike, 0)
                    rate -= value

                rate *= self._multiplier_
                rate += self._spread_

            fx_index = self._get_fx_index(self.currency)
            fx = fx_index.get_value(value_date) if fx_index else 1.0

            payoff = fx * rate * self._year_fraction_ * self._notional_ + self._amount_

        Record(pay_rec="REC" if pay_rec == 1.0 else "PAY",
               year_fraction=self.year_fraction,
               cf_name=self.object_name,
               notional=self._notional_,
               currency=self.currency,
               rate_ccy=rate_ccy,
               is_fix_rate=is_fix_rate,
               forward=fwd,
               is_fixed_cash_flow=is_fixed_cash_flow,
               fixing_value=fixing_value,
               vol=vol,
               expiry_time=time,
               spread=self._spread_,
               reset_date=self._reset_date_,
               start_date=self._start_date_,
               end_date=self._end_date_,
               pay_date=self._pay_date_,
               constant_rate=self._constant_rate_,
               amount=self._amount_,
               effective_floor_strike=effective_floor_strike,
               effective_cap_strike=effective_cap_strike,
               index=self._rate_index_.object_name,
               expected_payoff=payoff,
               floor=None if self._floor_ == NO_FLOOR_VALUE else self._floor_,
               cap=None if self._cap_ == NO_CAP_VALUE else self._cap_)  # pylint: disable=unexpected-keyword-arg

        return payoff
Exemple #13
0
    def test_record_of_RecordObject(self):
        value = 'value'

        a_dict = {'a_key': 'a_value'}
        b_dict = {'b_key': 'b_value'}

        R = Record()
        R._record(key=value)
        self.assertEqual(Record().entries, {('key',):'value'})
        R._record(a_dict)
        self.assertEqual(Record().entries, {('key',):'value', ('a_key',):'a_value'})
        R._record(b_dict, INT=12345)
        self.assertEqual(Record().entries, {('key',):'value', ('a_key',):'a_value', ('b_key',): 'b_value', ('INT',):12345} )
Exemple #14
0
    def test_multilevel_record_append_prefix_context(self):

        with Record() as R1:
            with Record().append_prefix('level2'):
                self.assertEqual(Record()._prefix_stack, ['level2'])
                with Record() as R2a:
                    self.assertEqual(Record()._prefix_stack, [])
                    Record(level=Record._record_level, name='R2a')

                    self.assertEqual(Record().entries, {('level',): 2, ('name',): 'R2a'})
                self.assertNotEqual(Record(), R2a)
                self.assertEqual(Record(), R1)
                with Record().append_prefix('another_prefix'):
                    self.assertEqual(Record()._prefix_stack,['level2','another_prefix'])
                    with Record() as R2b:
                        self.assertEqual(Record()._prefix_stack, [])
                        Record(recorded='just something')
                        self.assertEqual(Record().entries, {('recorded',): 'just something'})

                self.assertEqual(Record()._prefix_stack, ['level2'])
            self.assertEqual(Record()._prefix_stack, [])

        assumed_record_entries = {('level2', 'level'): 2,
                                  ('level2', 'name'): 'R2a',
                                  ('level2', 'another_prefix', 'recorded'): 'just something'}
        self.assertEqual(Record().entries, assumed_record_entries)
Exemple #15
0
 def setUp(self):
     Record().clear()
Exemple #16
0
def do_stuff():
    with Record() as rec:
        foo = Foo("Rom")
        foo.do_something("baz", "barz")
        foo.bar("baz", "barz")
Exemple #17
0
 def do_something(self, baz, barz):
     a_dict = {'again_a_key': baz, 'so_creative': barz}
     Record(a_dict)
     return magical_stuff_happens(baz, barz)
Exemple #18
0
 def bar(self, baz, barz):
     some_value1, some_value2 = self.do_something(baz, barz)
     Record(a_key=some_value1, another_key=some_value2)
     return some_value1, some_value2