Exemple #1
0
 def __call__(self):
     '''
 >>> from ppf.date_time import *
 >>> import math
 >>> from ppf.math.interpolation import loglinear
 >>> times = [0.0, 0.5, 1.0, 1.5, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0, 11.0]
 >>> factors = [math.exp(-0.05*t) for t in times]
 >>> import ppf.market
 >>> c = ppf.market.curve(times, factors, loglinear)
 >>> from numpy import zeros
 >>> expiries = [0.0, 0.5, 1.0, 1.5, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0, 11.0]
 >>> tenors = [0, 90]
 >>> values = zeros((14, 2))
 >>> for i in range(14): values[i, 0] = 0.01
 >>> for i in range(14): values[i, 1] = 0.01
 >>> surf = ppf.market.surface(expiries, tenors, values)
 >>> env = ppf.market.environment(date(2007, Mar, 29))
 >>> key = "zc.disc.usd"
 >>> env.add_curve(key, c)
 >>> key = "ve.term.usd.hw"
 >>> env.add_surface(key, surf)
 >>> key = "cv.mr.usd.hw"
 >>> env.add_constant(key, 0.01)
 >>> from ppf.core.pay_receive import *
 >>> from ppf.core.generate_flows import *
 >>> from ppf.core.generate_observables import *
 >>> from ppf.core.generate_exercise_table import *
 >>> from ppf.core.exercise_type import *
 >>> from ppf.core.leg import *
 >>> from ppf.core.trade import *
 >>> libor_observables = generate_libor_observables(
 ...     start  = date(2007, Jun, 29)
 ...   , end  = date(2010, Jun, 29)
 ...   , roll_period = 6
 ...   , roll_duration = ppf.date_time.months
 ...   , reset_period = 6
 ...   , reset_duration = ppf.date_time.months
 ...   , reset_currency = "USD"
 ...   , reset_basis = basis_act_360
 ...   , reset_shift_method = shift_convention.modified_following)
 >>> coupon_observables = generate_fixed_coupon_observables(
 ...     start  = date(2007, Jun, 29)
 ...   , end  = date(2010, Jun, 29)
 ...   , roll_period = 6
 ...   , reset_currency = "USD"
 ...   , coupon_shift_method = shift_convention.modified_following
 ...   , coupon_rate = 0.045)
 >>> #semi-annual flows
 >>> pay_flows = generate_flows(
 ...   start  = date(2007, Jun, 29)
 ...   , end  = date(2010, Jun, 29)
 ...   , duration = ppf.date_time.months
 ...   , period = 6
 ...   , notional = 0
 ...   , pay_shift_method = shift_convention.modified_following
 ...   , pay_currency = "USD"
 ...   , basis = "30/360"
 ...   , observables = coupon_observables)
 >>> from ppf.core.generate_adjuvant_table import *
 >>> from numpy import array
 >>> rcv_flows = generate_flows(
 ...   start  = date(2007, Jun, 29)
 ...   , end  = date(2010, Jun, 29)
 ...   , duration = ppf.date_time.months
 ...   , period = 6
 ...   , pay_shift_method = shift_convention.modified_following
 ...   , pay_currency = "USD"
 ...   , basis = "A/360"
 ...   , observables = libor_observables)
 >>> rcv_adjuvant_table = generate_adjuvant_table(
 ...   keys = ["spread0"]
 ...   , tenors = [48]
 ...   , values = array([[0.0]])
 ...   , shift_method = shift_convention.modified_following
 ...   , start_date = date(2007, Jun, 29))
 >>> from ppf.pricer import *
 >>> pay_leg = leg(pay_flows, PAY, None, payoffs.fixed_leg_payoff())
 >>> receive_leg = leg(rcv_flows, RECEIVE, rcv_adjuvant_table, payoffs.float_leg_payoff())
 >>> #1y nc
 >>> ex_sched = generate_exercise_table(
 ...   start = date(2007, Jun, 29)
 ... , end  = date(2009, Jun, 29)
 ... , period = 1
 ... , duration = ppf.date_time.years
 ... , shift_method = shift_convention.modified_following)
 >>> structure = trade((pay_leg, receive_leg))#, (ex_sched, exercise_type.callable))
 >>> from ppf.model import *
 >>> factory = hull_white_lattice_model_factory()
 >>> model = factory(structure, env)
 >>> pricer = lattice_pricer(structure, model, env)
 >>> print pricer()
 1376834.46742
 '''
     # create controller
     ctr = controller(self.__trade, self.__model, self.__env)
     times = self.__timeline.times()
     from_ = self.__env.relative_date(times[-1]) / 365.0
     # initialise symbols
     ctr.insert_symbol("underlying", from_)
     ctr.insert_symbol("berm", from_)
     cnt = 0
     for l in self.__trade.legs():
         symbol = "leg" + str(cnt)
         ctr.insert_symbol(symbol, from_)
         cnt += 1
     # reverse iterate through the timeline
     for i in range(len(times) - 1, -1, -1):
         time = times[i]
         to_ = 0
         if i <> 0:
             to_ = self.__env.relative_date(times[i - 1]) / 365.0
         events = self.__timeline.events(time)
         for event in events:
             # set event on controller
             ctr.set_event(event)
             # evaluate
             if is_pay_event(event):
                 #print 'evaluating leg ', event.leg_id(), ' at ', from_
                 # evaluate payoff
                 cpn = ctr(from_)
                 # rollback symbol
                 symbol = "leg" + str(event.leg_id())
                 leg_pv = ctr.retrieve_symbol(symbol)
                 leg_pv += cpn
                 self.__symbol_listener_(from_, symbol, leg_pv)
                 ctr.update_symbol(symbol, leg_pv, from_)
             else:
                 #print 'evaluating  berm at ', from_
                 # evaluate underlying
                 underlying = ctr.retrieve_symbol("underlying")
                 underlying *= 0  # not pretty
                 cnt = 0
                 for l in self.__trade.legs():
                     underlying += ctr.retrieve_symbol("leg" + str(cnt))
                     cnt += 1
                 self.__symbol_listener_(
                     from_, "underlying",
                     self.__trade.exercise_type() * underlying)
                 # rollback berm
                 berm = ctr.retrieve_symbol("berm")
                 self.__symbol_listener_(from_, "berm", berm)
                 berm = ctr.rollback_max(
                     from_, to_, berm,
                     self.__trade.exercise_type() * underlying)
                 # rollback underlying
                 underlying = ctr.rollback(from_, to_, underlying)
                 # update symbols
                 ctr.update_symbol("underlying", underlying, to_)
                 ctr.update_symbol("berm", berm, to_)
         # rollback any symbols in symbol table not already rolled back
         symbols = ctr.retrieve_symbols_to_rollback(to_)
         for symbol in symbols:
             from_ = ctr.retrieve_symbol_update_time(symbol)
             value = ctr.retrieve_symbol(symbol)
             value = ctr.rollback(from_, to_, value)
             ctr.update_symbol(symbol, value, to_)
         from_ = to_
     # calculate pv
     underlying = ctr.retrieve_symbol("underlying")
     underlying *= 0
     cnt = 0
     for l in self.__trade.legs():
         underlying += ctr.retrieve_symbol("leg" + str(cnt))
         cnt += 1
     ctr.update_symbol("underlying", underlying, to_)
     pv = 0
     if self.__trade.has_exercise_schedule():
         if self.__trade.exercise_type() == exercise_type.callable:
             pv = ctr.retrieve_symbol("berm").mean()
         else:
             pv = ctr.retrieve_symbol(
                 "underlying").mean() + ctr.retrieve_symbol("berm").mean()
     else:
         pv = ctr.retrieve_symbol("underlying").mean()
     return pv
Exemple #2
0
 def __call__(self):
   '''
   >>> from ppf.date_time import *
   >>> import math
   >>> from ppf.math.interpolation import loglinear
   >>> times = [0.0, 0.5, 1.0, 1.5, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0, 11.0]
   >>> factors = [math.exp(-0.05*t) for t in times]
   >>> import ppf.market
   >>> c = ppf.market.curve(times, factors, loglinear)
   >>> from numpy import zeros
   >>> expiries = [0.0, 0.5, 1.0, 1.5, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0, 11.0]
   >>> tenors = [0, 90]
   >>> values = zeros((14, 2))
   >>> for i in range(14): values[i, 0] = 0.01
   >>> for i in range(14): values[i, 1] = 0.01
   >>> surf = ppf.market.surface(expiries, tenors, values)
   >>> env = ppf.market.environment(date(2007, Mar, 29))
   >>> key = "zc.disc.usd"
   >>> env.add_curve(key, c)
   >>> key = "ve.term.usd.hw"
   >>> env.add_surface(key, surf)
   >>> key = "cv.mr.usd.hw"
   >>> env.add_constant(key, 0.01)
   >>> from ppf.core.pay_receive import *
   >>> from ppf.core.generate_flows import *
   >>> from ppf.core.generate_observables import *
   >>> from ppf.core.generate_exercise_table import *
   >>> from ppf.core.exercise_type import *
   >>> from ppf.core.leg import *
   >>> from ppf.core.trade import *
   >>> libor_observables = generate_libor_observables(
   ...     start  = date(2007, Jun, 29)
   ...   , end  = date(2010, Jun, 29)
   ...   , roll_period = 6
   ...   , roll_duration = ppf.date_time.months
   ...   , reset_period = 6
   ...   , reset_duration = ppf.date_time.months
   ...   , reset_currency = "USD"
   ...   , reset_basis = basis_act_360
   ...   , reset_shift_method = shift_convention.modified_following)
   >>> coupon_observables = generate_fixed_coupon_observables(
   ...     start  = date(2007, Jun, 29)
   ...   , end  = date(2010, Jun, 29)
   ...   , roll_period = 6
   ...   , reset_currency = "USD"
   ...   , coupon_shift_method = shift_convention.modified_following
   ...   , coupon_rate = 0.045)
   >>> #semi-annual flows
   >>> pay_flows = generate_flows(
   ...   start  = date(2007, Jun, 29)
   ...   , end  = date(2010, Jun, 29)
   ...   , duration = ppf.date_time.months
   ...   , period = 6
   ...   , notional = 0
   ...   , pay_shift_method = shift_convention.modified_following
   ...   , pay_currency = "USD"
   ...   , basis = "30/360"
   ...   , observables = coupon_observables)
   >>> from ppf.core.generate_adjuvant_table import *
   >>> from numpy import array
   >>> rcv_flows = generate_flows(
   ...   start  = date(2007, Jun, 29)
   ...   , end  = date(2010, Jun, 29)
   ...   , duration = ppf.date_time.months
   ...   , period = 6
   ...   , pay_shift_method = shift_convention.modified_following
   ...   , pay_currency = "USD"
   ...   , basis = "A/360"
   ...   , observables = libor_observables)
   >>> rcv_adjuvant_table = generate_adjuvant_table(
   ...   keys = ["spread0"]
   ...   , tenors = [48]
   ...   , values = array([[0.0]])
   ...   , shift_method = shift_convention.modified_following
   ...   , start_date = date(2007, Jun, 29))
   >>> from ppf.pricer import *
   >>> pay_leg = leg(pay_flows, PAY, None, payoffs.fixed_leg_payoff())
   >>> receive_leg = leg(rcv_flows, RECEIVE, rcv_adjuvant_table, payoffs.float_leg_payoff())
   >>> #1y nc
   >>> ex_sched = generate_exercise_table(
   ...   start = date(2007, Jun, 29)
   ... , end  = date(2009, Jun, 29)
   ... , period = 1
   ... , duration = ppf.date_time.years
   ... , shift_method = shift_convention.modified_following)
   >>> structure = trade((pay_leg, receive_leg))#, (ex_sched, exercise_type.callable))
   >>> from ppf.model import *
   >>> factory = hull_white_lattice_model_factory()
   >>> model = factory(structure, env)
   >>> pricer = lattice_pricer(structure, model, env)
   >>> print pricer()
   1376834.46742
   '''
   # create controller
   ctr = controller(self.__trade, self.__model, self.__env)
   times = self.__timeline.times()
   from_ = self.__env.relative_date(times[-1])/365.0
   # initialise symbols
   ctr.insert_symbol("underlying", from_)
   ctr.insert_symbol("berm", from_)
   cnt = 0
   for l in self.__trade.legs():
     symbol = "leg"+str(cnt)
     ctr.insert_symbol(symbol, from_)      
     cnt += 1
   # reverse iterate through the timeline
   for i in range(len(times)-1,-1,-1):
      time = times[i]
      to_ = 0
      if i <> 0:
        to_ = self.__env.relative_date(times[i-1])/365.0
      events = self.__timeline.events(time)
      for event in events:
        # set event on controller
        ctr.set_event(event)
        # evaluate
        if is_pay_event(event):
          #print 'evaluating leg ', event.leg_id(), ' at ', from_          
          # evaluate payoff
          cpn = ctr(from_)
          # rollback symbol
          symbol = "leg"+str(event.leg_id())
          leg_pv = ctr.retrieve_symbol(symbol) 
          leg_pv += cpn        
          self.__symbol_listener_(from_, symbol, leg_pv)
          ctr.update_symbol(symbol, leg_pv, from_)   
        else:
          #print 'evaluating  berm at ', from_          
          # evaluate underlying             
          underlying = ctr.retrieve_symbol("underlying")
          underlying *= 0 # not pretty
          cnt = 0
          for l in self.__trade.legs():
            underlying += ctr.retrieve_symbol("leg"+str(cnt))         
            cnt += 1
          self.__symbol_listener_(from_, "underlying", self.__trade.exercise_type()*underlying)
          # rollback berm
          berm = ctr.retrieve_symbol("berm")
          self.__symbol_listener_(from_, "berm", berm)
          berm = ctr.rollback_max(from_, to_, berm, self.__trade.exercise_type()*underlying)
          # rollback underlying
          underlying = ctr.rollback(from_, to_, underlying)
          # update symbols
          ctr.update_symbol("underlying", underlying, to_)
          ctr.update_symbol("berm", berm, to_)
      # rollback any symbols in symbol table not already rolled back
      symbols = ctr.retrieve_symbols_to_rollback(to_)
      for symbol in symbols:
        from_ = ctr.retrieve_symbol_update_time(symbol)
        value = ctr.retrieve_symbol(symbol)
        value = ctr.rollback(from_, to_, value)
        ctr.update_symbol(symbol, value, to_)
      from_ = to_
   # calculate pv
   underlying = ctr.retrieve_symbol("underlying")
   underlying *= 0
   cnt = 0
   for l in self.__trade.legs():
     underlying += ctr.retrieve_symbol("leg"+str(cnt))         
     cnt += 1
   ctr.update_symbol("underlying", underlying, to_)
   pv = 0
   if self.__trade.has_exercise_schedule():
     if self.__trade.exercise_type() == exercise_type.callable:
       pv = ctr.retrieve_symbol("berm").mean()
     else:
       pv = ctr.retrieve_symbol("underlying").mean()+ctr.retrieve_symbol("berm").mean()
   else:
     pv = ctr.retrieve_symbol("underlying").mean()
   return pv
Exemple #3
0
  def __exercise_boundary_regression(self, symbol_value_pairs_to_add):
    num_expl_vars = self.__regression_model.exercise().num_explanatory_variables()
    num_sims = self.__regression_model.state().num_sims()
    num_exercises = self.__timeline.number_of_exercises()
    # create controller
    ctr = controller(self.__trade, self.__regression_model, self.__env, 1.0)
    times = self.__timeline.times()
    from_ = 0.0
    # initialise symbols
    ctr.insert_symbol("underlying", from_)
    # add extra symbols
    if symbol_value_pairs_to_add:
      for symbol_value_pair in symbol_value_pairs_to_add:
        symbol, value = symbol_value_pair
        ctr.insert_symbol(symbol, value)
    cnt = 0
    for l in self.__trade.legs():
      symbol = "leg"+str(cnt)
      ctr.insert_symbol(symbol, from_)      
      cnt += 1
    # forward iterate through the timeline
    vs = numpy.zeros([num_exercises, num_sims, num_expl_vars])
    ies = numpy.zeros([num_exercises, num_sims])
    ns = numpy.zeros([num_exercises, num_sims]) # for fees - ignored for present
    normalisation = 1.0/self.__trade.legs()[0].flows()[0].notional()
    ex_cnt = 0
    for time in times:
      to_ = self.__env.relative_date(time)/365.0
      # evolve
      ctr.evolve(from_, to_)
      events = self.__timeline.events(time)
      # evaluate explanatory variables and immediate exercise values
      for event in events:
        # set event on controller
        ctr.set_event(event)
        # evaluate
        if is_exercise_event(event):
          # evaluate underlying  
          underlying = ies[ex_cnt, :]           
          cnt = 0
          for l in self.__trade.legs():
            underlying += ctr.retrieve_symbol("leg"+str(cnt))         
            cnt += 1   
          underlying *= self.__trade.exercise_type()       
          underlying *= normalisation
          # evaluate explanatory variables and numeraire
          ns[ex_cnt, :] = ctr.numeraire(to_)
          vs[ex_cnt, :] = ctr.explanatory_variables(to_)
          ex_cnt += 1
      # evaluate cash flows
      for event in events:
        # set event on controller
        ctr.set_event(event)
        # evaluate
        if is_pay_event(event):
          # evaluate payoff
          cpn = ctr(to_)
          symbol = "leg"+str(event.leg_id())
          leg_pv = ctr.retrieve_symbol(symbol) 
          leg_pv += cpn        
          self.__symbol_listener_(to_, symbol, leg_pv)
          ctr.update_symbol(symbol, leg_pv, to_)                      
      from_ = to_

    # final immediate exercise value
    underlying = ctr.retrieve_symbol("underlying")
    cnt = 0
    for l in self.__trade.legs():
      underlying += ctr.retrieve_symbol("leg"+str(cnt))         
      cnt += 1          
    underlying *= self.__trade.exercise_type()   
    underlying *= normalisation
    # subtract immediate exercise values from final
    for i in range(num_exercises):
      ies[i, :]=underlying-ies[i, :]   
    # perform regression
    self.__fitted_fos = pickup_value_regression(ies, ns, vs)
    # create helper class for dealing with exercise indicator - note number of simulations
    self.__exercise_helper = exercise_helper(self.__model.state().num_sims()) 
Exemple #4
0
 def __call__(self, symbol_value_pairs_to_add = None):
   # do regression if required
   if self.__regression_model:
     self.__exercise_boundary_regression(symbol_value_pairs_to_add)
   # create controller
   ctr = controller(self.__trade, self.__model, self.__env, 1.0)
   times = self.__timeline.times()
   from_ = 0.0
   # initialise symbols
   ctr.insert_symbol("underlying", from_)
   ctr.insert_symbol("berm", from_)
   # add extra symbols
   if symbol_value_pairs_to_add:
     for symbol_value_pair in symbol_value_pairs_to_add:
       symbol, value = symbol_value_pair
       ctr.insert_symbol(symbol, value)
   cnt = 0
   for l in self.__trade.legs():
     symbol = "leg"+str(cnt)
     ctr.insert_symbol(symbol, from_)      
     cnt += 1
   # forward iterate through the timeline
   ex_cnt = 0
   for time in times:
     to_ = self.__env.relative_date(time)/365.0
     # evolve
     ctr.evolve(from_, to_)
     events = self.__timeline.events(time)
     # set initial immediate exercise value - sum of all flows before exercise date
     for event in events:
       if is_exercise_event(event):
         # evaluate underlying             
         underlying = ctr.retrieve_symbol("underlying")
         underlying *= 0
         cnt = 0
         for l in self.__trade.legs():
           underlying += ctr.retrieve_symbol("leg"+str(cnt))         
           cnt += 1
         if ex_cnt == 0:
           self.__exercise_helper.set_last_cfs(self.__trade.exercise_type()*underlying)
         self.__symbol_listener_(to_, "underlying", underlying)
     # evaluate cash flows
     for event in events:
       # set event on controller
       ctr.set_event(event)
       # evaluate
       if is_pay_event(event):
         # evaluate payoff
         cpn = ctr(to_)
         symbol = "leg"+str(event.leg_id())
         leg_pv = ctr.retrieve_symbol(symbol) 
         leg_pv += cpn        
         self.__symbol_listener_(to_, symbol, leg_pv)
         ctr.update_symbol(symbol, leg_pv, to_)                   
     # evaluate exercise using regression   
     for event in events:
       # set event on controller
       ctr.set_event(event)
       # evaluate
       if is_exercise_event(event):
         # evaluate underlying             
         underlying = ctr.retrieve_symbol("underlying")
         underlying *= 0
         cnt = 0
         for l in self.__trade.legs():
           underlying += ctr.retrieve_symbol("leg"+str(cnt))         
           cnt += 1
         # explanatory variables and numeraire
         ns = ctr.numeraire(to_) # for fees but not used at present
         vs = ctr.explanatory_variables(to_)
         # evaluate regression
         self.__exercise_helper.update_indicator(to_, vs, self.__fitted_fos[ex_cnt])
         berm = ctr.retrieve_symbol("berm")
         berm = self.__exercise_helper.max(to_, self.__trade.exercise_type()*underlying, berm)
         # update symbols
         ctr.update_symbol("underlying", underlying, to_)
         ctr.update_symbol("berm", berm, to_)
         ex_cnt = ex_cnt+1
     from_ = to_
   # calculate pv
   underlying = ctr.retrieve_symbol("underlying")
   underlying *= 0
   cnt = 0
   for l in self.__trade.legs():
     underlying += ctr.retrieve_symbol("leg"+str(cnt))         
     cnt += 1
   self.__symbol_listener_(to_, "underlying", underlying)
   ctr.update_symbol("underlying", underlying, to_)
   if self.__regression_model:
     berm = ctr.retrieve_symbol("berm")
     berm = self.__exercise_helper.max(to_, self.__trade.exercise_type()*underlying, berm)
     ctr.update_symbol("berm", berm, to_)
   pv = 0
   if self.__trade.has_exercise_schedule():
     if self.__trade.exercise_type() == exercise_type.callable:
       pv = ctr.retrieve_symbol("berm").mean()
     else:
       pv = ctr.retrieve_symbol("underlying").mean()+ctr.retrieve_symbol("berm").mean()
   else:
     pv = ctr.retrieve_symbol("underlying").mean()
   return pv
Exemple #5
0
    def __exercise_boundary_regression(self, symbol_value_pairs_to_add):
        num_expl_vars = self.__regression_model.exercise(
        ).num_explanatory_variables()
        num_sims = self.__regression_model.state().num_sims()
        num_exercises = self.__timeline.number_of_exercises()
        # create controller
        ctr = controller(self.__trade, self.__regression_model, self.__env,
                         1.0)
        times = self.__timeline.times()
        from_ = 0.0
        # initialise symbols
        ctr.insert_symbol("underlying", from_)
        # add extra symbols
        if symbol_value_pairs_to_add:
            for symbol_value_pair in symbol_value_pairs_to_add:
                symbol, value = symbol_value_pair
                ctr.insert_symbol(symbol, value)
        cnt = 0
        for l in self.__trade.legs():
            symbol = "leg" + str(cnt)
            ctr.insert_symbol(symbol, from_)
            cnt += 1
        # forward iterate through the timeline
        vs = numpy.zeros([num_exercises, num_sims, num_expl_vars])
        ies = numpy.zeros([num_exercises, num_sims])
        ns = numpy.zeros([num_exercises,
                          num_sims])  # for fees - ignored for present
        normalisation = 1.0 / self.__trade.legs()[0].flows()[0].notional()
        ex_cnt = 0
        for time in times:
            to_ = self.__env.relative_date(time) / 365.0
            # evolve
            ctr.evolve(from_, to_)
            events = self.__timeline.events(time)
            # evaluate explanatory variables and immediate exercise values
            for event in events:
                # set event on controller
                ctr.set_event(event)
                # evaluate
                if is_exercise_event(event):
                    # evaluate underlying
                    underlying = ies[ex_cnt, :]
                    cnt = 0
                    for l in self.__trade.legs():
                        underlying += ctr.retrieve_symbol("leg" + str(cnt))
                        cnt += 1
                    underlying *= self.__trade.exercise_type()
                    underlying *= normalisation
                    # evaluate explanatory variables and numeraire
                    ns[ex_cnt, :] = ctr.numeraire(to_)
                    vs[ex_cnt, :] = ctr.explanatory_variables(to_)
                    ex_cnt += 1
            # evaluate cash flows
            for event in events:
                # set event on controller
                ctr.set_event(event)
                # evaluate
                if is_pay_event(event):
                    # evaluate payoff
                    cpn = ctr(to_)
                    symbol = "leg" + str(event.leg_id())
                    leg_pv = ctr.retrieve_symbol(symbol)
                    leg_pv += cpn
                    self.__symbol_listener_(to_, symbol, leg_pv)
                    ctr.update_symbol(symbol, leg_pv, to_)
            from_ = to_

        # final immediate exercise value
        underlying = ctr.retrieve_symbol("underlying")
        cnt = 0
        for l in self.__trade.legs():
            underlying += ctr.retrieve_symbol("leg" + str(cnt))
            cnt += 1
        underlying *= self.__trade.exercise_type()
        underlying *= normalisation
        # subtract immediate exercise values from final
        for i in range(num_exercises):
            ies[i, :] = underlying - ies[i, :]
        # perform regression
        self.__fitted_fos = pickup_value_regression(ies, ns, vs)
        # create helper class for dealing with exercise indicator - note number of simulations
        self.__exercise_helper = exercise_helper(
            self.__model.state().num_sims())
Exemple #6
0
 def __call__(self, symbol_value_pairs_to_add=None):
     # do regression if required
     if self.__regression_model:
         self.__exercise_boundary_regression(symbol_value_pairs_to_add)
     # create controller
     ctr = controller(self.__trade, self.__model, self.__env, 1.0)
     times = self.__timeline.times()
     from_ = 0.0
     # initialise symbols
     ctr.insert_symbol("underlying", from_)
     ctr.insert_symbol("berm", from_)
     # add extra symbols
     if symbol_value_pairs_to_add:
         for symbol_value_pair in symbol_value_pairs_to_add:
             symbol, value = symbol_value_pair
             ctr.insert_symbol(symbol, value)
     cnt = 0
     for l in self.__trade.legs():
         symbol = "leg" + str(cnt)
         ctr.insert_symbol(symbol, from_)
         cnt += 1
     # forward iterate through the timeline
     ex_cnt = 0
     for time in times:
         to_ = self.__env.relative_date(time) / 365.0
         # evolve
         ctr.evolve(from_, to_)
         events = self.__timeline.events(time)
         # set initial immediate exercise value - sum of all flows before exercise date
         for event in events:
             if is_exercise_event(event):
                 # evaluate underlying
                 underlying = ctr.retrieve_symbol("underlying")
                 underlying *= 0
                 cnt = 0
                 for l in self.__trade.legs():
                     underlying += ctr.retrieve_symbol("leg" + str(cnt))
                     cnt += 1
                 if ex_cnt == 0:
                     self.__exercise_helper.set_last_cfs(
                         self.__trade.exercise_type() * underlying)
                 self.__symbol_listener_(to_, "underlying", underlying)
         # evaluate cash flows
         for event in events:
             # set event on controller
             ctr.set_event(event)
             # evaluate
             if is_pay_event(event):
                 # evaluate payoff
                 cpn = ctr(to_)
                 symbol = "leg" + str(event.leg_id())
                 leg_pv = ctr.retrieve_symbol(symbol)
                 leg_pv += cpn
                 self.__symbol_listener_(to_, symbol, leg_pv)
                 ctr.update_symbol(symbol, leg_pv, to_)
         # evaluate exercise using regression
         for event in events:
             # set event on controller
             ctr.set_event(event)
             # evaluate
             if is_exercise_event(event):
                 # evaluate underlying
                 underlying = ctr.retrieve_symbol("underlying")
                 underlying *= 0
                 cnt = 0
                 for l in self.__trade.legs():
                     underlying += ctr.retrieve_symbol("leg" + str(cnt))
                     cnt += 1
                 # explanatory variables and numeraire
                 ns = ctr.numeraire(to_)  # for fees but not used at present
                 vs = ctr.explanatory_variables(to_)
                 # evaluate regression
                 self.__exercise_helper.update_indicator(
                     to_, vs, self.__fitted_fos[ex_cnt])
                 berm = ctr.retrieve_symbol("berm")
                 berm = self.__exercise_helper.max(
                     to_,
                     self.__trade.exercise_type() * underlying, berm)
                 # update symbols
                 ctr.update_symbol("underlying", underlying, to_)
                 ctr.update_symbol("berm", berm, to_)
                 ex_cnt = ex_cnt + 1
         from_ = to_
     # calculate pv
     underlying = ctr.retrieve_symbol("underlying")
     underlying *= 0
     cnt = 0
     for l in self.__trade.legs():
         underlying += ctr.retrieve_symbol("leg" + str(cnt))
         cnt += 1
     self.__symbol_listener_(to_, "underlying", underlying)
     ctr.update_symbol("underlying", underlying, to_)
     if self.__regression_model:
         berm = ctr.retrieve_symbol("berm")
         berm = self.__exercise_helper.max(
             to_,
             self.__trade.exercise_type() * underlying, berm)
         ctr.update_symbol("berm", berm, to_)
     pv = 0
     if self.__trade.has_exercise_schedule():
         if self.__trade.exercise_type() == exercise_type.callable:
             pv = ctr.retrieve_symbol("berm").mean()
         else:
             pv = ctr.retrieve_symbol(
                 "underlying").mean() + ctr.retrieve_symbol("berm").mean()
     else:
         pv = ctr.retrieve_symbol("underlying").mean()
     return pv