示例#1
0
    def _issue_trade_analysis_sheet(self):
        """
        Create TradeAnalysisSheet and write all the Trades into an Excel file.
        Issues a report with R multiply if initial risk is specified, otherwise returns of trades are expressed in %
        """
        if self._monitor_settings.issue_trade_analysis_sheet:
            trades_generator = TradesGenerator()
            portfolio_eod_series = self.backtest_result.portfolio.portfolio_eod_series()
            closed_positions = self.backtest_result.portfolio.closed_positions()
            trades_list = trades_generator.create_trades_from_backtest_positions(closed_positions, portfolio_eod_series)

            if len(trades_list) > 0:
                contract_ticker_mapper = self.backtest_result.portfolio.contract_ticker_mapper
                nr_of_assets_traded = len(
                    set(contract_ticker_mapper.contract_to_ticker(t.contract, False) for t in trades_list)
                )

                start_date = self.backtest_result.start_date if self.backtest_result.start_date is not None \
                    else portfolio_eod_series.index[0]

                end_date = self.backtest_result.end_date if self.backtest_result.end_date is not None \
                    else datetime.now()

                trades_analysis_sheet = TradeAnalysisSheet(self._settings, self._pdf_exporter,
                                                           nr_of_assets_traded=nr_of_assets_traded,
                                                           trades=trades_list,
                                                           start_date=start_date,
                                                           end_date=end_date,
                                                           initial_risk=self._signals_register.get_initial_risk(),
                                                           title="Trades analysis sheet")
                trades_analysis_sheet.build_document()
                trades_analysis_sheet.save(self._report_dir)
            else:
                self.logger.info("No trades generated throughout the backtest - "
                                 "Trade analysis sheet will not be generated.")
示例#2
0
def get_trade_rets_values(ts: BacktestTradingSession,
                          model: AlphaModel) -> List[float]:
    model_tickers_dict = {model: [BloombergTicker('SVXY US Equity')]}

    AlphaModelStrategy(ts, model_tickers_dict, use_stop_losses=True)
    ts.use_data_preloading([BloombergTicker('SVXY US Equity')])
    ts.start_trading()

    trades_generator = TradesGenerator()
    trades = trades_generator.create_trades_from_backtest_positions(
        ts.portfolio.closed_positions())
    returns_of_trades = [t.pnl for t in trades]
    return returns_of_trades
示例#3
0
class TestTrades(unittest.TestCase):
    @classmethod
    def setUpClass(cls):
        cls.contract = Contract('AAPL US Equity',
                                security_type='STK',
                                exchange='SIM_EXCHANGE')
        cls.start_time = str_to_date('2019-01-01')
        cls.time = str_to_date('2020-01-01')

    def setUp(self):
        self.portfolio = Portfolio(Mock(), 100000, Mock(), Mock())
        self.trades_generator = TradesGenerator()

    def test_long_trade(self):
        transactions = [
            Transaction(self.start_time, self.contract, 5, 10.0, 3.0),
            Transaction(self.time, self.contract, 5, 11.0, 4.0),
            Transaction(self.time, self.contract, -1, 13.0, 5.0),
            Transaction(self.time, self.contract, 1, 14.0, 5.0),
            Transaction(self.time, self.contract, -4, 15.0, 2.0),
            Transaction(self.time, self.contract, -6, 16.0, 1.0),
        ]

        for t in transactions:
            self.portfolio.transact_transaction(t)

        # The position should be closed after executing all transactions
        self.assertCountEqual(self.portfolio.open_positions_dict, {})

        all_closed_positions_for_contract = [
            p for p in self.portfolio.closed_positions()
            if p.contract() == self.contract
        ]
        self.assertEqual(len(all_closed_positions_for_contract), 1)
        position = all_closed_positions_for_contract[
            0]  # type: BacktestPosition

        trade_1 = self.trades_generator.create_trades_from_backtest_positions(
            position)
        trade_2 = self.trades_generator.create_trades_from_transactions(
            transactions)[0]
        commission = sum(t.commission for t in transactions)

        self.assertEqual(trade_1, trade_2)

        self.assertEqual(trade_1.commission, commission)
        self.assertEqual(trade_1.pnl, 50.0 - commission)
        self.assertEqual(trade_1.direction, 1.0)
        self.assertEqual(trade_1.start_time, self.start_time)
        self.assertEqual(trade_1.end_time, self.time)

    def test_short_trade(self):
        transactions = [
            Transaction(self.start_time, self.contract, -5, 10.0, 3.0),
            Transaction(self.time, self.contract, 1, 11.0, 4.0),
            Transaction(self.time, self.contract, -9, 10.0, 5.0),
            Transaction(self.time, self.contract, 4, 14.0, 5.0),
            Transaction(self.time, self.contract, 8, 10.0, 2.0),
            Transaction(self.time, self.contract, 1, 9.0, 1.0),
        ]

        for t in transactions:
            self.portfolio.transact_transaction(t)

        # The position should be closed after executing all transactions
        self.assertCountEqual(self.portfolio.open_positions_dict, {})

        all_closed_positions_for_contract = [
            p for p in self.portfolio.closed_positions()
            if p.contract() == self.contract
        ]
        self.assertEqual(len(all_closed_positions_for_contract), 1)
        position = all_closed_positions_for_contract[0]

        trade_1 = self.trades_generator.create_trades_from_backtest_positions(
            position)
        trade_2 = self.trades_generator.create_trades_from_transactions(
            transactions)[0]
        commission = sum(t.commission for t in transactions)

        self.assertEqual(trade_1, trade_2)

        self.assertEqual(trade_1.commission, commission)
        self.assertEqual(trade_1.pnl, -16.0 - commission)
        self.assertEqual(trade_1.direction, -1.0)
        self.assertEqual(trade_1.start_time, self.start_time)
        self.assertEqual(trade_1.end_time, self.time)