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.")
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
def __init__(self, settings: Settings, pdf_exporter: PDFExporter, backtest_result: BacktestResult, title: str = "Portfolio Analysis Sheet", generate_pnl_chart_per_ticker: bool = False): super().__init__(settings, pdf_exporter, title=title) self.backtest_result = backtest_result self.full_image_axis_position = (0.08, 0.1, 0.915, 0.80) # (left, bottom, width, height) self.trades_generator = TradesGenerator() self.generate_pnl_chart_per_ticker = generate_pnl_chart_per_ticker
def setUpClass(cls): cls.initial_cash = 1000000 # 1M cls.contract = Contract('AAPL US Equity', security_type='STK', exchange='NYSE') cls.contract_size = 75 cls.fut_contract = Contract('CTZ9 Comdty', security_type='FUT', exchange='CME', contract_size=cls.contract_size) tickers = [DummyTicker(cls.contract.symbol), DummyTicker(cls.fut_contract.symbol)] cls.prices_series = QFSeries(data=[120, 250], index=tickers) cls.prices_up = QFSeries(data=[130, 270], index=tickers) cls.prices_down = QFSeries(data=[100, 210], index=tickers) cls.start_time = str_to_date('2017-01-01') cls.random_time = str_to_date('2017-02-02') cls.end_time = str_to_date('2018-02-03') cls.trades_generator = TradesGenerator()
def setUpClass(cls): cls.initial_cash = 1000000 # 1M cls.ticker = DummyTicker('AAPL US Equity', SecurityType.STOCK) cls.point_value = 75 cls.fut_ticker = DummyTicker('CTZ9 Comdty', SecurityType.FUTURE, cls.point_value) tickers = [cls.ticker, cls.fut_ticker] cls.prices_series = QFSeries(data=[120, 250], index=tickers) cls.prices_up = QFSeries(data=[130, 270], index=tickers) cls.prices_down = QFSeries(data=[100, 210], index=tickers) cls.start_time = str_to_date('2017-01-01') cls.random_time = str_to_date('2017-02-02') cls.end_time = str_to_date('2018-02-03') cls.trades_generator = TradesGenerator()
def setUp(self): self.portfolio = Portfolio(Mock(), 100000, Mock(), Mock()) self.trades_generator = TradesGenerator()
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)