def apply_action(self, state: Union[date, Iterable[date]], backtest: BackTest): with HistoricalPricingContext(dates=make_list(state), csa_term=self.action.csa_term): backtest.calc_calls += 1 backtest.calculations += len(make_list(state)) f = Portfolio(make_list( self.action.priceable)).resolve(in_place=False) for create_date, portfolio in f.result().items(): active_dates = [ s for s in backtest.states if get_final_date(portfolio.instruments[0], create_date, self. action.trade_duration) >= s >= create_date ] if len(active_dates): for t in portfolio: t.name = f'{t.name}_{create_date.strftime("%Y-%m-%d")}' backtest.scaling_portfolios[create_date].append( ScalingPortfolio(trade=portfolio.instruments[0], dates=active_dates, risk=self.action.risk, csa_term=self.action.csa_term)) return backtest
def apply_action(self, state: Union[date, Iterable[date]], backtest: BackTest, trigger_info: Optional[Union[HedgeActionInfo, Iterable[HedgeActionInfo]]] = None): with HistoricalPricingContext(dates=make_list(state), csa_term=self.action.csa_term, show_progress=True): backtest.calc_calls += 1 backtest.calculations += len(make_list(state)) f = Portfolio(make_list(self.action.priceable)).resolve(in_place=False) for create_date, portfolio in f.result().items(): hedge = portfolio.instruments[0] hedge.name = f'{hedge.name}_{create_date.strftime("%Y-%m-%d")}' final_date = get_final_date(hedge, create_date, self.action.trade_duration) active_dates = [s for s in backtest.states if create_date <= s < final_date] if len(active_dates): backtest.scaling_portfolios[create_date].append( ScalingPortfolio(trade=hedge, dates=active_dates, risk=self.action.risk, csa_term=self.action.csa_term, scaling_parameter=self.action.scaling_parameter)) # add cashflows on trade entry and unwind backtest.cash_payments[create_date].append( CashPayment(trade=hedge, effective_date=create_date, direction=-1)) if final_date <= dt.date.today(): backtest.cash_payments[final_date].append( CashPayment(trade=hedge, effective_date=final_date, scale_date=create_date)) return backtest
def apply_action( self, state: Union[date, Iterable[date]], backtest: BackTest, trigger_info: Optional[Union[HedgeActionInfo, Iterable[HedgeActionInfo]]] = None): with HistoricalPricingContext(dates=make_list(state), csa_term=self.action.csa_term): backtest.calc_calls += 1 backtest.calculations += len(make_list(state)) f = Portfolio(make_list( self.action.priceable)).resolve(in_place=False) for create_date, portfolio in f.result().items(): final_date = get_final_date(portfolio.instruments[0], create_date, self.action.trade_duration) if self.action.risks_on_final_day: next_state = list( filter(lambda x: x > create_date, backtest.states)) final_date = min( final_date, next_state[0]) if len(next_state) else final_date active_dates = [ s for s in backtest.states if create_date <= s < final_date ] if len(active_dates): for t in portfolio: t.name = f'{t.name}_{create_date.strftime("%Y-%m-%d")}' backtest.scaling_portfolios[create_date].append( ScalingPortfolio(trade=portfolio.instruments[0], dates=active_dates, risk=self.action.risk, csa_term=self.action.csa_term)) if self.action.risks_on_final_day and final_date <= dt.date.today( ): backtest.scaling_portfolios[final_date].append( ScalingPortfolio(trade=portfolio.instruments[0], dates=[final_date], risk=self.action.risk, csa_term=self.action.csa_term, unwind=True)) return backtest