bring classifier/rl up to new paradigm. ensure tests pass. remove old code. add documentation, add new example transform

This commit is contained in:
robcaulk
2023-05-29 13:33:29 +02:00
parent 31e19add27
commit e572653616
18 changed files with 390 additions and 754 deletions
+2 -64
View File
@@ -10,8 +10,8 @@ from freqtrade.data.dataprovider import DataProvider
from freqtrade.exceptions import OperationalException
from freqtrade.freqai.data_kitchen import FreqaiDataKitchen
from tests.conftest import get_patched_exchange # , log_has_re
from tests.freqai.conftest import (get_patched_data_kitchen, get_patched_freqai_strategy,
make_unfiltered_dataframe) # make_data_dictionary,
from tests.freqai.conftest import make_unfiltered_dataframe # make_data_dictionary,
from tests.freqai.conftest import get_patched_data_kitchen, get_patched_freqai_strategy
from tests.freqai.test_freqai_interface import is_mac
@@ -72,68 +72,6 @@ def test_check_if_model_expired(mocker, freqai_conf):
shutil.rmtree(Path(dk.full_path))
# def test_use_DBSCAN_to_remove_outliers(mocker, freqai_conf, caplog):
# freqai = make_data_dictionary(mocker, freqai_conf)
# # freqai_conf['freqai']['feature_parameters'].update({"outlier_protection_percentage": 1})
# freqai.dk.use_DBSCAN_to_remove_outliers(predict=False)
# assert log_has_re(r"DBSCAN found eps of 1\.7\d\.", caplog)
# def test_compute_distances(mocker, freqai_conf):
# freqai = make_data_dictionary(mocker, freqai_conf)
# freqai_conf['freqai']['feature_parameters'].update({"DI_threshold": 1})
# avg_mean_dist = freqai.dk.compute_distances()
# assert round(avg_mean_dist, 2) == 1.98
# def test_use_SVM_to_remove_outliers_and_outlier_protection(mocker, freqai_conf, caplog):
# freqai = make_data_dictionary(mocker, freqai_conf)
# freqai_conf['freqai']['feature_parameters'].update({"outlier_protection_percentage": 0.1})
# freqai.dk.use_SVM_to_remove_outliers(predict=False)
# assert log_has_re(
# "SVM detected 7.83%",
# caplog,
# )
# def test_compute_inlier_metric(mocker, freqai_conf, caplog):
# freqai = make_data_dictionary(mocker, freqai_conf)
# freqai_conf['freqai']['feature_parameters'].update({"inlier_metric_window": 10})
# freqai.dk.compute_inlier_metric(set_='train')
# assert log_has_re(
# "Inlier metric computed and added to features.",
# caplog,
# )
# def test_add_noise_to_training_features(mocker, freqai_conf):
# freqai = make_data_dictionary(mocker, freqai_conf)
# freqai_conf['freqai']['feature_parameters'].update({"noise_standard_deviation": 0.1})
# freqai.dk.add_noise_to_training_features()
# def test_remove_beginning_points_from_data_dict(mocker, freqai_conf):
# freqai = make_data_dictionary(mocker, freqai_conf)
# freqai.dk.remove_beginning_points_from_data_dict(set_='train')
# def test_principal_component_analysis(mocker, freqai_conf, caplog):
# freqai = make_data_dictionary(mocker, freqai_conf)
# freqai.dk.principal_component_analysis()
# assert log_has_re(
# "reduced feature dimension by",
# caplog,
# )
# def test_normalize_data(mocker, freqai_conf):
# freqai = make_data_dictionary(mocker, freqai_conf)
# data_dict = freqai.dk.data_dictionary
# freqai.dk.normalize_data(data_dict)
# assert any('_max' in entry for entry in freqai.dk.data.keys())
# assert any('_min' in entry for entry in freqai.dk.data.keys())
def test_filter_features(mocker, freqai_conf):
freqai, unfiltered_dataframe = make_unfiltered_dataframe(mocker, freqai_conf)
freqai.dk.find_features(unfiltered_dataframe)
+1 -43
View File
@@ -74,6 +74,7 @@ def test_extract_data_and_train_model_Standard(mocker, freqai_conf, model, pca,
freqai_conf = make_rl_config(freqai_conf)
# test the RL guardrails
freqai_conf['freqai']['feature_parameters'].update({"use_SVM_to_remove_outliers": True})
freqai_conf['freqai']['feature_parameters'].update({"DI_threshold": 2})
freqai_conf['freqai']['data_split_parameters'].update({'shuffle': True})
if 'test_3ac' in model or 'test_4ac' in model:
@@ -162,7 +163,6 @@ def test_extract_data_and_train_model_MultiTargets(mocker, freqai_conf, model, s
assert Path(freqai.dk.data_path / f"{freqai.dk.model_filename}_model.joblib").is_file()
assert Path(freqai.dk.data_path / f"{freqai.dk.model_filename}_metadata.json").is_file()
assert Path(freqai.dk.data_path / f"{freqai.dk.model_filename}_trained_df.pkl").is_file()
assert Path(freqai.dk.data_path / f"{freqai.dk.model_filename}_svm_model.joblib").is_file()
assert len(freqai.dk.data['training_features_list']) == 14
shutil.rmtree(Path(freqai.dk.full_path))
@@ -218,7 +218,6 @@ def test_extract_data_and_train_model_Classifiers(mocker, freqai_conf, model):
f"{freqai.dk.model_filename}_model{model_file_extension}").exists()
assert Path(freqai.dk.data_path / f"{freqai.dk.model_filename}_metadata.json").exists()
assert Path(freqai.dk.data_path / f"{freqai.dk.model_filename}_trained_df.pkl").exists()
assert Path(freqai.dk.data_path / f"{freqai.dk.model_filename}_svm_model.joblib").exists()
shutil.rmtree(Path(freqai.dk.full_path))
@@ -283,9 +282,6 @@ def test_start_backtesting(mocker, freqai_conf, model, num_files, strat, caplog)
_, base_df = freqai.dd.get_base_and_corr_dataframes(sub_timerange, "LTC/BTC", freqai.dk)
df = base_df[freqai_conf["timeframe"]]
for i in range(5):
df[f'%-constant_{i}'] = i
metadata = {"pair": "LTC/BTC"}
freqai.dk.set_paths('LTC/BTC', None)
freqai.start_backtesting(df, metadata, freqai.dk, strategy)
@@ -293,14 +289,6 @@ def test_start_backtesting(mocker, freqai_conf, model, num_files, strat, caplog)
assert len(model_folders) == num_files
Trade.use_db = True
assert log_has_re(
"Removed features ",
caplog,
)
assert log_has_re(
"Removed 5 features from prediction features, ",
caplog,
)
Backtesting.cleanup()
shutil.rmtree(Path(freqai.dk.full_path))
@@ -425,36 +413,6 @@ def test_backtesting_fit_live_predictions(mocker, freqai_conf, caplog):
shutil.rmtree(Path(freqai.dk.full_path))
def test_principal_component_analysis(mocker, freqai_conf):
freqai_conf.update({"timerange": "20180110-20180130"})
freqai_conf.get("freqai", {}).get("feature_parameters", {}).update(
{"princpial_component_analysis": "true"})
strategy = get_patched_freqai_strategy(mocker, freqai_conf)
exchange = get_patched_exchange(mocker, freqai_conf)
strategy.dp = DataProvider(freqai_conf, exchange)
strategy.freqai_info = freqai_conf.get("freqai", {})
freqai = strategy.freqai
freqai.live = True
freqai.dk = FreqaiDataKitchen(freqai_conf)
freqai.dk.live = True
timerange = TimeRange.parse_timerange("20180110-20180130")
freqai.dd.load_all_pair_histories(timerange, freqai.dk)
freqai.dd.pair_dict = MagicMock()
data_load_timerange = TimeRange.parse_timerange("20180110-20180130")
new_timerange = TimeRange.parse_timerange("20180120-20180130")
freqai.dk.set_paths('ADA/BTC', None)
freqai.extract_data_and_train_model(
new_timerange, "ADA/BTC", strategy, freqai.dk, data_load_timerange)
assert Path(freqai.dk.data_path / f"{freqai.dk.model_filename}_pca_object.pkl")
shutil.rmtree(Path(freqai.dk.full_path))
def test_plot_feature_importance(mocker, freqai_conf):
from freqtrade.freqai.utils import plot_feature_importance