Пример #1
0
    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
Пример #2
0
    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
Пример #3
0
    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
Пример #4
0
    def apply_action(self, state: Union[datetime.date,
                                        Iterable[datetime.date]],
                     backtest: BackTest):
        with HistoricalPricingContext(dates=make_list(state)):
            backtest.calc_calls += 1
            backtest.calculations += len(make_list(state)) * len(
                self._priceables)
            f = Portfolio(self._priceables).resolve(in_place=False)

        for s in backtest.states:
            pos = []
            for create_date, portfolio in f.result().items():
                pos += [
                    inst for inst in portfolio.instruments
                    if get_final_date(inst, create_date, self.trade_duration)
                    >= s >= create_date
                ]
            backtest.portfolio_dict[s].append(pos)

        return backtest
Пример #5
0
    def apply_action(self, state: Union[datetime.date,
                                        Iterable[datetime.date]],
                     backtest: BackTest):
        with HistoricalPricingContext(dates=make_list(state)):
            backtest.calc_calls += 1
            backtest.calculations += len(make_list(state))
            f = Portfolio(make_list(self._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.trade_duration) >= s >= create_date
            ]
            backtest.scaling_portfolios[create_date].append(
                ScalingPortfolio(trade=portfolio.instruments[0],
                                 dates=active_dates,
                                 risk=self.risk))

        return backtest