Simplify backtest storage
This commit is contained in:
@@ -34,7 +34,6 @@ from freqtrade.optimize.optimize_reports import (generate_backtest_stats, genera
|
|||||||
show_backtest_results,
|
show_backtest_results,
|
||||||
store_backtest_analysis_results,
|
store_backtest_analysis_results,
|
||||||
store_backtest_stats)
|
store_backtest_stats)
|
||||||
from freqtrade.optimize.optimize_reports.bt_storage import store_backtest_market_change
|
|
||||||
from freqtrade.persistence import (CustomDataWrapper, LocalTrade, Order, PairLocks, Trade,
|
from freqtrade.persistence import (CustomDataWrapper, LocalTrade, Order, PairLocks, Trade,
|
||||||
disable_database_use, enable_database_use)
|
disable_database_use, enable_database_use)
|
||||||
from freqtrade.plugins.pairlistmanager import PairListManager
|
from freqtrade.plugins.pairlistmanager import PairListManager
|
||||||
@@ -1423,9 +1422,9 @@ class Backtesting:
|
|||||||
self.results = results
|
self.results = results
|
||||||
dt_appendix = datetime.now().strftime("%Y-%m-%d_%H-%M-%S")
|
dt_appendix = datetime.now().strftime("%Y-%m-%d_%H-%M-%S")
|
||||||
if self.config.get('export', 'none') in ('trades', 'signals'):
|
if self.config.get('export', 'none') in ('trades', 'signals'):
|
||||||
store_backtest_stats(self.config['exportfilename'], self.results, dt_appendix)
|
|
||||||
combined_res = combined_dataframes_with_rel_mean(data, min_date, max_date)
|
combined_res = combined_dataframes_with_rel_mean(data, min_date, max_date)
|
||||||
store_backtest_market_change(self.config['exportfilename'], combined_res, dt_appendix)
|
store_backtest_stats(self.config['exportfilename'], self.results, dt_appendix,
|
||||||
|
market_change_data=combined_res)
|
||||||
|
|
||||||
if (self.config.get('export', 'none') == 'signals' and
|
if (self.config.get('export', 'none') == 'signals' and
|
||||||
self.dataprovider.runmode == RunMode.BACKTEST):
|
self.dataprovider.runmode == RunMode.BACKTEST):
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
import logging
|
import logging
|
||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
from typing import Dict
|
from typing import Dict, Optional
|
||||||
|
|
||||||
from pandas import DataFrame
|
from pandas import DataFrame
|
||||||
|
|
||||||
@@ -31,7 +31,8 @@ def _generate_filename(recordfilename: Path, appendix: str, suffix: str) -> Path
|
|||||||
|
|
||||||
|
|
||||||
def store_backtest_stats(
|
def store_backtest_stats(
|
||||||
recordfilename: Path, stats: BacktestResultType, dtappendix: str) -> Path:
|
recordfilename: Path, stats: BacktestResultType, dtappendix: str, *,
|
||||||
|
market_change_data: Optional[DataFrame] = None) -> Path:
|
||||||
"""
|
"""
|
||||||
Stores backtest results
|
Stores backtest results
|
||||||
:param recordfilename: Path object, which can either be a filename or a directory.
|
:param recordfilename: Path object, which can either be a filename or a directory.
|
||||||
@@ -55,6 +56,10 @@ def store_backtest_stats(
|
|||||||
latest_filename = Path.joinpath(filename.parent, LAST_BT_RESULT_FN)
|
latest_filename = Path.joinpath(filename.parent, LAST_BT_RESULT_FN)
|
||||||
file_dump_json(latest_filename, {'latest_backtest': str(filename.name)})
|
file_dump_json(latest_filename, {'latest_backtest': str(filename.name)})
|
||||||
|
|
||||||
|
if market_change_data is not None:
|
||||||
|
filename_market_change = _generate_filename(recordfilename, f"{dtappendix}_market_change", '.feather')
|
||||||
|
market_change_data.reset_index().to_feather(filename_market_change, compression_level=9, compression='lz4')
|
||||||
|
|
||||||
return filename
|
return filename
|
||||||
|
|
||||||
|
|
||||||
@@ -83,20 +88,3 @@ def store_backtest_analysis_results(
|
|||||||
dtappendix: str) -> None:
|
dtappendix: str) -> None:
|
||||||
_store_backtest_analysis_data(recordfilename, candles, dtappendix, "signals")
|
_store_backtest_analysis_data(recordfilename, candles, dtappendix, "signals")
|
||||||
_store_backtest_analysis_data(recordfilename, trades, dtappendix, "rejected")
|
_store_backtest_analysis_data(recordfilename, trades, dtappendix, "rejected")
|
||||||
|
|
||||||
|
|
||||||
def store_backtest_market_change(
|
|
||||||
recordfilename: Path, data: DataFrame, dtappendix: str) -> Path:
|
|
||||||
"""
|
|
||||||
Stores backtest market change average
|
|
||||||
:param recordfilename: Path object, which can either be a filename or a directory.
|
|
||||||
Filenames will be appended with a timestamp right before the suffix
|
|
||||||
while for directories, <directory>/backtest-result-<datetime>_<name>.pkl will be used
|
|
||||||
as filename
|
|
||||||
:param candles: Dict containing the backtesting data for analysis
|
|
||||||
:param dtappendix: Datetime to use for the filename
|
|
||||||
"""
|
|
||||||
filename = _generate_filename(recordfilename, f"{dtappendix}_market_change", '.feather')
|
|
||||||
data.reset_index().to_feather(filename, compression_level=9, compression='lz4')
|
|
||||||
|
|
||||||
return filename
|
|
||||||
|
|||||||
Reference in New Issue
Block a user