diff --git a/docs/freqai.md b/docs/freqai.md index 1493ac1b4..8cdd7063b 100644 --- a/docs/freqai.md +++ b/docs/freqai.md @@ -872,20 +872,3 @@ Users can then use these columns, concert with all their own additional indicato return df ``` - -The user does need to ensure their `informative_pairs()` contains the following (users can add their own `informative_pair` needs to the bottom of this template): - -```python - def informative_pairs(self): - whitelist_pairs = self.dp.current_whitelist() - corr_pairs = self.config["freqai"]["feature_parameters"]["include_corr_pairlist"] - informative_pairs = [] - for tf in self.config["freqai"]["feature_parameters"]["include_timeframes"]: - for pair in whitelist_pairs: - informative_pairs.append((pair, tf)) - for pair in corr_pairs: - if pair in whitelist_pairs: - continue # avoid duplication - informative_pairs.append((pair, tf)) - return informative_pairs -``` diff --git a/freqtrade/freqai/spice_rack/lightgbm_config.json b/freqtrade/freqai/spice_rack/lightgbm_config.json index aff28f037..89ec978db 100644 --- a/freqtrade/freqai/spice_rack/lightgbm_config.json +++ b/freqtrade/freqai/spice_rack/lightgbm_config.json @@ -8,18 +8,19 @@ "identifier": "spicy-id", "feature_parameters": { "include_timeframes": [ - "3m", - "15m", - "1h" + "30m", + "1h", + "4h" ], "include_corr_pairlist": [ - "BTC/USDT", - "ETH/USDT" + "BTC/USD", + "ETH/USD" ], "label_period_candles": 20, "include_shifted_candles": 2, "DI_threshold": 0.9, "weight_factor": 0.9, + "principal_component_analysis": true, "indicator_periods_candles": [ 10, 20 diff --git a/freqtrade/strategy/interface.py b/freqtrade/strategy/interface.py index d536968de..3c2f58dfc 100644 --- a/freqtrade/strategy/interface.py +++ b/freqtrade/strategy/interface.py @@ -157,7 +157,6 @@ class IStrategy(ABC, HyperStrategyMixin): if spice_rack: import types - from freqtrade.freqai.utils import auto_populate_any_indicators self.populate_any_indicators = types.MethodType( # type: ignore auto_populate_any_indicators, self) @@ -189,12 +188,44 @@ class IStrategy(ABC, HyperStrategyMixin): def setup_freqai_spice_rack(self, config: dict) -> Dict[str, Any]: import json from pathlib import Path + import difflib auto_config = config.get('freqai_config', 'lightgbm_config.json') with open(Path('freqtrade') / 'freqai' / 'spice_rack' / auto_config) as json_file: freqai_config = json.load(json_file) config['freqai'] = freqai_config['freqai'] config['freqai']['identifier'] = config['freqai_identifier'] + corr_pairs = config['freqai']['feature_parameters']['include_corr_pairlist'] + timeframes = config['freqai']['feature_parameters']['include_timeframes'] + new_corr_pairs = [] + new_tfs = [] + + # find the closest pairs to what the default config wants + for pair in corr_pairs: + closest_pair = difflib.get_close_matches( + pair, + self.dp._exchange.markets # type: ignore + )[0] + new_corr_pairs.append(closest_pair) + logger.info(f'Spice rack will use {closest_pair} as informative in FreqAI model.') + + # find the closest matching timeframes to what the default config wants + if timeframe_to_seconds(config['timeframe']) > timeframe_to_seconds('15m'): + logger.warning('Default spice rack is designed for lower base timeframes (e.g. > ' + f'15m). But user passed {config["timeframe"]}.') + new_tfs.append(config['timeframe']) + + list_tfs = [timeframe_to_seconds(tf) for tf + in self.dp._exchange.timeframes] # type: ignore + for tf in timeframes: + tf_secs = timeframe_to_seconds(tf) + closest_index = min(range(len(list_tfs)), key=lambda i: abs(list_tfs[i] - tf_secs)) + closest_tf = self.dp._exchange.timeframes[closest_index] # type: ignore + logger.info(f'Spice rack will use {closest_tf} as informative tf in FreqAI model.') + new_tfs.append(closest_tf) + + config['freqai']['feature_parameters'].update({'include_timeframes': new_tfs}) + config['freqai']['feature_parameters'].update({'include_corr_pairlist': new_corr_pairs}) config.update({"freqaimodel": 'LightGBMRegressorMultiTarget'}) return config