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
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
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())
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
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())
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