diff --git a/freqtrade/ft_types/backtest_result_type.py b/freqtrade/ft_types/backtest_result_type.py index b253231a1..768d13517 100644 --- a/freqtrade/ft_types/backtest_result_type.py +++ b/freqtrade/ft_types/backtest_result_type.py @@ -55,6 +55,7 @@ class BacktestContentTypeIcomplete(TypedDict, total=False): backtest_start_time: int backtest_end_time: int run_id: str + wallet_summary: DataFrame class BacktestContentType(BacktestContentTypeIcomplete, total=True): diff --git a/freqtrade/optimize/backtesting.py b/freqtrade/optimize/backtesting.py index 797e47786..32c145e24 100644 --- a/freqtrade/optimize/backtesting.py +++ b/freqtrade/optimize/backtesting.py @@ -51,6 +51,7 @@ from freqtrade.mixins import LoggingMixin from freqtrade.optimize.backtest_caching import get_strategy_run_id from freqtrade.optimize.bt_progress import BTProgress from freqtrade.optimize.optimize_reports import ( + convert_bt_wallet_collection, generate_backtest_stats, generate_rejected_signals, generate_trade_signal_candles, @@ -1752,6 +1753,7 @@ class Backtesting: "canceled_entry_orders": self.canceled_entry_orders, "replaced_entry_orders": self.replaced_entry_orders, "final_balance": self.wallets.get_total(self.strategy.config["stake_currency"]), + "wallet_summary": convert_bt_wallet_collection(self.wallet_captures), } def backtest_one_strategy( diff --git a/freqtrade/optimize/optimize_reports/__init__.py b/freqtrade/optimize/optimize_reports/__init__.py index 5cf8e51ad..a41a8ebbf 100644 --- a/freqtrade/optimize/optimize_reports/__init__.py +++ b/freqtrade/optimize/optimize_reports/__init__.py @@ -12,6 +12,7 @@ from freqtrade.optimize.optimize_reports.bt_output import ( ) from freqtrade.optimize.optimize_reports.bt_storage import store_backtest_results from freqtrade.optimize.optimize_reports.optimize_reports import ( + convert_bt_wallet_collection, generate_all_periodic_breakdown_stats, generate_backtest_stats, generate_daily_stats, diff --git a/freqtrade/optimize/optimize_reports/optimize_reports.py b/freqtrade/optimize/optimize_reports/optimize_reports.py index 57b7740d8..2f640bcbf 100644 --- a/freqtrade/optimize/optimize_reports/optimize_reports.py +++ b/freqtrade/optimize/optimize_reports/optimize_reports.py @@ -29,6 +29,20 @@ from freqtrade.util import decimals_per_coin, fmt_coin, format_duration, get_dry logger = logging.getLogger(__name__) +def convert_bt_wallet_collection(wallet_captures: list[tuple]) -> DataFrame: + """ + Convert the wallet capture list to a DataFrame. + Assumes the wallet_captures list contains tuples with the following structure: + (date, currency, price, balance). + """ + if len(wallet_captures) == 0: + return [] + return DataFrame( + wallet_captures, + columns=["date", "currency", "price", "balance"], + ) + + def generate_trade_signal_candles( preprocessed_df: dict[str, DataFrame], bt_results: BacktestContentType, date_col: str ) -> dict[str, DataFrame]: