Store and load backtest-market-change data
This commit is contained in:
@@ -238,6 +238,16 @@ def update_backtest_metadata(filename: Path, strategy: str, content: Dict[str, A
|
|||||||
file_dump_json(get_backtest_metadata_filename(filename), metadata)
|
file_dump_json(get_backtest_metadata_filename(filename), metadata)
|
||||||
|
|
||||||
|
|
||||||
|
def get_backtest_market_change(filename: Path, include_ts: bool = True) -> pd.DataFrame:
|
||||||
|
"""
|
||||||
|
Read backtest market change file.
|
||||||
|
"""
|
||||||
|
df = pd.read_feather(filename)
|
||||||
|
if include_ts:
|
||||||
|
df.loc[:, '__date_ts'] = df.loc[:, 'date'].astype(np.int64) // 1000 // 1000
|
||||||
|
return df
|
||||||
|
|
||||||
|
|
||||||
def find_existing_backtest_stats(dirname: Union[Path, str], run_ids: Dict[str, str],
|
def find_existing_backtest_stats(dirname: Union[Path, str], run_ids: Dict[str, str],
|
||||||
min_backtest_date: Optional[datetime] = None) -> Dict[str, Any]:
|
min_backtest_date: Optional[datetime] = None) -> Dict[str, Any]:
|
||||||
"""
|
"""
|
||||||
|
|||||||
@@ -19,6 +19,7 @@ from freqtrade.data import history
|
|||||||
from freqtrade.data.btanalysis import find_existing_backtest_stats, trade_list_to_dataframe
|
from freqtrade.data.btanalysis import find_existing_backtest_stats, trade_list_to_dataframe
|
||||||
from freqtrade.data.converter import trim_dataframe, trim_dataframes
|
from freqtrade.data.converter import trim_dataframe, trim_dataframes
|
||||||
from freqtrade.data.dataprovider import DataProvider
|
from freqtrade.data.dataprovider import DataProvider
|
||||||
|
from freqtrade.data.metrics import combined_dataframes_with_rel_mean
|
||||||
from freqtrade.enums import (BacktestState, CandleType, ExitCheckTuple, ExitType, RunMode,
|
from freqtrade.enums import (BacktestState, CandleType, ExitCheckTuple, ExitType, RunMode,
|
||||||
TradingMode)
|
TradingMode)
|
||||||
from freqtrade.exceptions import DependencyException, OperationalException
|
from freqtrade.exceptions import DependencyException, OperationalException
|
||||||
@@ -33,6 +34,7 @@ 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
|
||||||
@@ -1422,6 +1424,8 @@ class Backtesting:
|
|||||||
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)
|
store_backtest_stats(self.config['exportfilename'], self.results, dt_appendix)
|
||||||
|
combined_res = combined_dataframes_with_rel_mean(data, min_date, max_date)
|
||||||
|
store_backtest_market_change(self.config['exportfilename'], combined_res, dt_appendix)
|
||||||
|
|
||||||
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):
|
||||||
|
|||||||
@@ -2,6 +2,8 @@ import logging
|
|||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
from typing import Dict
|
from typing import Dict
|
||||||
|
|
||||||
|
from pandas import DataFrame
|
||||||
|
|
||||||
from freqtrade.constants import LAST_BT_RESULT_FN
|
from freqtrade.constants import LAST_BT_RESULT_FN
|
||||||
from freqtrade.misc import file_dump_joblib, file_dump_json
|
from freqtrade.misc import file_dump_joblib, file_dump_json
|
||||||
from freqtrade.optimize.backtest_caching import get_backtest_metadata_filename
|
from freqtrade.optimize.backtest_caching import get_backtest_metadata_filename
|
||||||
@@ -81,3 +83,20 @@ 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