.. DO NOT EDIT. .. THIS FILE WAS AUTOMATICALLY GENERATED BY SPHINX-GALLERY. .. TO MAKE CHANGES, EDIT THE SOURCE PYTHON FILE: .. "gallery/trade_ledger.py" .. LINE NUMBERS ARE GIVEN BELOW. .. only:: html .. note:: :class: sphx-glr-download-link-note :ref:`Go to the end ` to download the full example code. .. rst-class:: sphx-glr-example-title .. _sphx_glr_gallery_trade_ledger.py: Trade Ledger and Position Analytics =================================== Every ``BacktestResult`` includes a trade ledger. Each row records costs, holding time, exit classification, maximum adverse excursion (MAE), and maximum favorable excursion (MFE), while the ledger provides portfolio-level position analytics such as expectancy and streaks. .. GENERATED FROM PYTHON SOURCE LINES 12-14 Create a short deterministic market and a single long signal. Its compact price path makes the resulting holding time, MAE, and MFE easy to audit. .. GENERATED FROM PYTHON SOURCE LINES 14-71 .. code-block:: Python from datetime import datetime, timedelta import numpy as np from TradeTide import ( Market, Portfolio, PositionCollection, capital_management, exit_strategy, ) from TradeTide.execution import ExecutionCosts from TradeTide.performance import BacktestResult market = Market() start = datetime(2024, 1, 1, 9) market.add_market_data( start, 1.2002, 1.2004, 1.2000, 1.2002, 1.2000, 1.2002, 1.1998, 1.2000 ) market.add_market_data( start + timedelta(minutes=1), 1.2004, 1.2008, 1.2002, 1.2006, 1.2002, 1.2006, 1.2000, 1.2004, ) market.add_market_data( start + timedelta(minutes=2), 1.2006, 1.2008, 1.2004, 1.2006, 1.2004, 1.2006, 1.2002, 1.2004, ) positions = PositionCollection(market, np.array([1, 0, 0])) positions.open_positions(exit_strategy.Static(stop_loss=2, take_profit=2)) positions.propagate_positions() portfolio = Portfolio(positions) portfolio.simulate( capital_management.FixedLot( capital=10_000, fixed_lot_size=100, max_capital_at_risk=1_000, max_concurrent_positions=1, ) ) .. GENERATED FROM PYTHON SOURCE LINES 72-74 Add optional execution costs and inspect the ledger. ``to_dataframe`` is convenient for notebooks and CSV/HTML reporting workflows. .. GENERATED FROM PYTHON SOURCE LINES 74-82 .. code-block:: Python result = BacktestResult.from_portfolio( portfolio, ExecutionCosts(commission_per_lot=0.001, slippage_pips=0.0), ) print(result.ledger.to_dataframe()) print(result.ledger.analytics) .. rst-class:: sphx-glr-script-out .. code-block:: none trade_id ... maximum_favorable_excursion 0 1 ... 0.04 [1 rows x 14 columns] .. rst-class:: sphx-glr-timing **Total running time of the script:** (0 minutes 0.005 seconds) .. _sphx_glr_download_gallery_trade_ledger.py: .. only:: html .. container:: sphx-glr-footer sphx-glr-footer-example .. container:: sphx-glr-download sphx-glr-download-jupyter :download:`Download Jupyter notebook: trade_ledger.ipynb ` .. container:: sphx-glr-download sphx-glr-download-python :download:`Download Python source code: trade_ledger.py ` .. container:: sphx-glr-download sphx-glr-download-zip :download:`Download zipped: trade_ledger.zip ` .. only:: html .. rst-class:: sphx-glr-signature `Gallery generated by Sphinx-Gallery `_