pr review - refactoring backtesting freqai

This commit is contained in:
Wagner Costa Santos 2022-08-31 15:36:29 -03:00
parent df51da22ee
commit 7bed0450d2
3 changed files with 24 additions and 15 deletions

View File

@ -1,7 +1,6 @@
import copy import copy
import datetime import datetime
import logging import logging
import os
import shutil import shutil
from pathlib import Path from pathlib import Path
from typing import Any, Dict, List, Tuple from typing import Any, Dict, List, Tuple
@ -1108,15 +1107,25 @@ class FreqaiDataKitchen:
:param file_name: h5 file name :param file_name: h5 file name
:param root_folder: folder to save h5 file :param root_folder: folder to save h5 file
""" """
os.makedirs(root_folder, exist_ok=True) backtesting_root = Path(
append_df.to_hdf(file_name, key='append_df', mode='w') self.full_path
/ root_folder
)
if not backtesting_root.is_dir():
backtesting_root.mkdir(parents=True, exist_ok=True)
def get_backtesting_prediction(self, prediction_file_name: str) -> DataFrame: full_file_path = Path(self.full_path / root_folder / file_name)
append_df.to_hdf(full_file_path, key='append_df', mode='w')
def get_backtesting_prediction(
self, root_prediction: str, prediction_file_name: str
) -> DataFrame:
""" """
Retrive from disk the prediction dataframe Retrive from disk the prediction dataframe
:param prediction_file_name: prediction file full path :param prediction_file_name: prediction file full path
:return: :return:
:Dataframe: Backtesting prediction from current backtesting period :Dataframe: Backtesting prediction from current backtesting period
""" """
append_df = pd.read_hdf(prediction_file_name) prediction_path = Path(self.full_path / root_prediction / prediction_file_name)
append_df = pd.read_hdf(prediction_path)
return append_df return append_df

View File

@ -234,12 +234,12 @@ class IFreqaiModel(ABC):
if self.backtest_prediction_exists( if self.backtest_prediction_exists(
metadata["pair"], dk, trained_timestamp=trained_timestamp_int metadata["pair"], dk, trained_timestamp=trained_timestamp_int
): ):
prediction_filename, _ = self.get_backtesting_prediction_file_name( prediction_filename, root_prediction = self.get_backtesting_prediction_file_name(
metadata["pair"], metadata["pair"],
dk, dk,
trained_timestamp=int(trained_timestamp.stopts)) trained_timestamp=int(trained_timestamp.stopts))
append_df = dk.get_backtesting_prediction(prediction_filename) append_df = dk.get_backtesting_prediction(root_prediction, prediction_filename)
dk.append_predictions(append_df) dk.append_predictions(append_df)
else: else:
if not self.model_exists( if not self.model_exists(
@ -680,10 +680,10 @@ class IFreqaiModel(ABC):
:boolean: whether the prediction file exists or not. :boolean: whether the prediction file exists or not.
""" """
if not self.live: if not self.live:
prediction_file_name, _ = self.get_backtesting_prediction_file_name( prediction_file_name, root_prediction = self.get_backtesting_prediction_file_name(
pair, dk, trained_timestamp pair, dk, trained_timestamp
) )
path_to_predictionfile = Path(prediction_file_name) path_to_predictionfile = Path(dk.full_path / root_prediction / prediction_file_name)
file_exists = path_to_predictionfile.is_file() file_exists = path_to_predictionfile.is_file()
if file_exists and not scanning: if file_exists and not scanning:
@ -711,8 +711,8 @@ class IFreqaiModel(ABC):
""" """
coin, _ = pair.split("/") coin, _ = pair.split("/")
prediction_base_filename = f"{coin.lower()}_{trained_timestamp}" prediction_base_filename = f"{coin.lower()}_{trained_timestamp}"
root_prediction = f'{dk.full_path}/backtesting_predictions' root_prediction = 'backtesting_predictions'
prediction_file_name = f"{root_prediction}/{prediction_base_filename}_predictions.h5" prediction_file_name = f"{prediction_base_filename}_predictions.h5"
return prediction_file_name, root_prediction return prediction_file_name, root_prediction
# Following methods which are overridden by user made prediction models. # Following methods which are overridden by user made prediction models.

View File

@ -192,7 +192,7 @@ def test_start_backtesting(mocker, freqai_conf):
freqai.start_backtesting(df, metadata, freqai.dk) freqai.start_backtesting(df, metadata, freqai.dk)
model_folders = [x for x in freqai.dd.full_path.iterdir() if x.is_dir()] model_folders = [x for x in freqai.dd.full_path.iterdir() if x.is_dir()]
assert len(model_folders) == 5 assert len(model_folders) == 6
shutil.rmtree(Path(freqai.dk.full_path)) shutil.rmtree(Path(freqai.dk.full_path))
@ -217,7 +217,7 @@ def test_start_backtesting_subdaily_backtest_period(mocker, freqai_conf):
metadata = {"pair": "LTC/BTC"} metadata = {"pair": "LTC/BTC"}
freqai.start_backtesting(df, metadata, freqai.dk) freqai.start_backtesting(df, metadata, freqai.dk)
model_folders = [x for x in freqai.dd.full_path.iterdir() if x.is_dir()] model_folders = [x for x in freqai.dd.full_path.iterdir() if x.is_dir()]
assert len(model_folders) == 8 assert len(model_folders) == 9
shutil.rmtree(Path(freqai.dk.full_path)) shutil.rmtree(Path(freqai.dk.full_path))
@ -242,7 +242,7 @@ def test_start_backtesting_from_existing_folder(mocker, freqai_conf, caplog):
freqai.start_backtesting(df, metadata, freqai.dk) freqai.start_backtesting(df, metadata, freqai.dk)
model_folders = [x for x in freqai.dd.full_path.iterdir() if x.is_dir()] model_folders = [x for x in freqai.dd.full_path.iterdir() if x.is_dir()]
assert len(model_folders) == 5 assert len(model_folders) == 6
# without deleting the exiting folder structure, re-run # without deleting the exiting folder structure, re-run
@ -263,7 +263,7 @@ def test_start_backtesting_from_existing_folder(mocker, freqai_conf, caplog):
freqai.start_backtesting(df, metadata, freqai.dk) freqai.start_backtesting(df, metadata, freqai.dk)
assert log_has_re( assert log_has_re(
"Found model at ", "Found backtesting prediction ",
caplog, caplog,
) )