Merge pull request #7428 from freqtrade/informative_freqai
Informative freqai
This commit is contained in:
commit
93237efc15
@ -190,19 +190,6 @@ The FreqAI strategy requires the user to include the following lines of code in
|
|||||||
# passed to any single indicator)
|
# passed to any single indicator)
|
||||||
startup_candle_count: int = 20
|
startup_candle_count: int = 20
|
||||||
|
|
||||||
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
|
|
||||||
|
|
||||||
def populate_indicators(self, dataframe: DataFrame, metadata: dict) -> DataFrame:
|
def populate_indicators(self, dataframe: DataFrame, metadata: dict) -> DataFrame:
|
||||||
|
|
||||||
# the model will return all labels created by user in `populate_any_indicators`
|
# the model will return all labels created by user in `populate_any_indicators`
|
||||||
|
@ -613,6 +613,22 @@ class IStrategy(ABC, HyperStrategyMixin):
|
|||||||
# END - Intended to be overridden by strategy
|
# END - Intended to be overridden by strategy
|
||||||
###
|
###
|
||||||
|
|
||||||
|
def __informative_pairs_freqai(self) -> ListPairsWithTimeframes:
|
||||||
|
"""
|
||||||
|
Create informative-pairs needed for FreqAI
|
||||||
|
"""
|
||||||
|
if self.config.get('freqai', {}).get('enabled', False):
|
||||||
|
whitelist_pairs = self.dp.current_whitelist()
|
||||||
|
candle_type = self.config.get('candle_type_def', CandleType.SPOT)
|
||||||
|
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 set(whitelist_pairs + corr_pairs):
|
||||||
|
informative_pairs.append((pair, tf, candle_type))
|
||||||
|
return informative_pairs
|
||||||
|
|
||||||
|
return []
|
||||||
|
|
||||||
def gather_informative_pairs(self) -> ListPairsWithTimeframes:
|
def gather_informative_pairs(self) -> ListPairsWithTimeframes:
|
||||||
"""
|
"""
|
||||||
Internal method which gathers all informative pairs (user or automatically defined).
|
Internal method which gathers all informative pairs (user or automatically defined).
|
||||||
@ -637,6 +653,7 @@ class IStrategy(ABC, HyperStrategyMixin):
|
|||||||
else:
|
else:
|
||||||
for pair in self.dp.current_whitelist():
|
for pair in self.dp.current_whitelist():
|
||||||
informative_pairs.append((pair, inf_data.timeframe, candle_type))
|
informative_pairs.append((pair, inf_data.timeframe, candle_type))
|
||||||
|
informative_pairs.extend(self.__informative_pairs_freqai())
|
||||||
return list(set(informative_pairs))
|
return list(set(informative_pairs))
|
||||||
|
|
||||||
def get_strategy_name(self) -> str:
|
def get_strategy_name(self) -> str:
|
||||||
|
@ -47,19 +47,6 @@ class FreqaiExampleStrategy(IStrategy):
|
|||||||
std_dev_multiplier_sell = CategoricalParameter(
|
std_dev_multiplier_sell = CategoricalParameter(
|
||||||
[0.1, 0.25, 0.4], space="sell", default=0.2, optimize=True)
|
[0.1, 0.25, 0.4], space="sell", default=0.2, optimize=True)
|
||||||
|
|
||||||
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
|
|
||||||
|
|
||||||
def populate_any_indicators(
|
def populate_any_indicators(
|
||||||
self, pair, df, tf, informative=None, set_generalized_indicators=False
|
self, pair, df, tf, informative=None, set_generalized_indicators=False
|
||||||
):
|
):
|
||||||
|
@ -95,20 +95,6 @@ class FreqaiExampleHybridStrategy(IStrategy):
|
|||||||
short_rsi = IntParameter(low=51, high=100, default=70, space='sell', optimize=True, load=True)
|
short_rsi = IntParameter(low=51, high=100, default=70, space='sell', optimize=True, load=True)
|
||||||
exit_short_rsi = IntParameter(low=1, high=50, default=30, space='buy', optimize=True, load=True)
|
exit_short_rsi = IntParameter(low=1, high=50, default=30, space='buy', optimize=True, load=True)
|
||||||
|
|
||||||
# FreqAI required function, leave as is or add additional informatives to existing structure.
|
|
||||||
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
|
|
||||||
|
|
||||||
# FreqAI required function, user can add or remove indicators, but general structure
|
# FreqAI required function, user can add or remove indicators, but general structure
|
||||||
# must stay the same.
|
# must stay the same.
|
||||||
def populate_any_indicators(
|
def populate_any_indicators(
|
||||||
|
@ -8,6 +8,7 @@ import pytest
|
|||||||
from freqtrade.configuration import TimeRange
|
from freqtrade.configuration import TimeRange
|
||||||
from freqtrade.data.dataprovider import DataProvider
|
from freqtrade.data.dataprovider import DataProvider
|
||||||
from freqtrade.freqai.data_kitchen import FreqaiDataKitchen
|
from freqtrade.freqai.data_kitchen import FreqaiDataKitchen
|
||||||
|
from freqtrade.plugins.pairlistmanager import PairListManager
|
||||||
from tests.conftest import get_patched_exchange, log_has_re
|
from tests.conftest import get_patched_exchange, log_has_re
|
||||||
from tests.freqai.conftest import get_patched_freqai_strategy
|
from tests.freqai.conftest import get_patched_freqai_strategy
|
||||||
|
|
||||||
@ -315,3 +316,27 @@ def test_principal_component_analysis(mocker, freqai_conf):
|
|||||||
assert Path(freqai.dk.data_path / f"{freqai.dk.model_filename}_pca_object.pkl")
|
assert Path(freqai.dk.data_path / f"{freqai.dk.model_filename}_pca_object.pkl")
|
||||||
|
|
||||||
shutil.rmtree(Path(freqai.dk.full_path))
|
shutil.rmtree(Path(freqai.dk.full_path))
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.mark.parametrize('timeframes,corr_pairs', [
|
||||||
|
(['5m'], ['ADA/BTC', 'DASH/BTC']),
|
||||||
|
(['5m'], ['ADA/BTC', 'DASH/BTC', 'ETH/USDT']),
|
||||||
|
(['5m', '15m'], ['ADA/BTC', 'DASH/BTC', 'ETH/USDT']),
|
||||||
|
])
|
||||||
|
def test_freqai_informative_pairs(mocker, freqai_conf, timeframes, corr_pairs):
|
||||||
|
freqai_conf['freqai']['feature_parameters'].update({
|
||||||
|
'include_timeframes': timeframes,
|
||||||
|
'include_corr_pairlist': corr_pairs,
|
||||||
|
|
||||||
|
})
|
||||||
|
strategy = get_patched_freqai_strategy(mocker, freqai_conf)
|
||||||
|
exchange = get_patched_exchange(mocker, freqai_conf)
|
||||||
|
pairlists = PairListManager(exchange, freqai_conf)
|
||||||
|
strategy.dp = DataProvider(freqai_conf, exchange, pairlists)
|
||||||
|
pairlist = strategy.dp.current_whitelist()
|
||||||
|
|
||||||
|
pairs_a = strategy.informative_pairs()
|
||||||
|
assert len(pairs_a) == 0
|
||||||
|
pairs_b = strategy.gather_informative_pairs()
|
||||||
|
# we expect unique pairs * timeframes
|
||||||
|
assert len(pairs_b) == len(set(pairlist + corr_pairs)) * len(timeframes)
|
||||||
|
@ -43,19 +43,6 @@ class freqai_test_multimodel_strat(IStrategy):
|
|||||||
)
|
)
|
||||||
max_roi_time_long = IntParameter(0, 800, default=400, space="sell", optimize=False, load=True)
|
max_roi_time_long = IntParameter(0, 800, default=400, space="sell", optimize=False, load=True)
|
||||||
|
|
||||||
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
|
|
||||||
|
|
||||||
def populate_any_indicators(
|
def populate_any_indicators(
|
||||||
self, pair, df, tf, informative=None, set_generalized_indicators=False
|
self, pair, df, tf, informative=None, set_generalized_indicators=False
|
||||||
):
|
):
|
||||||
|
@ -43,19 +43,6 @@ class freqai_test_strat(IStrategy):
|
|||||||
)
|
)
|
||||||
max_roi_time_long = IntParameter(0, 800, default=400, space="sell", optimize=False, load=True)
|
max_roi_time_long = IntParameter(0, 800, default=400, space="sell", optimize=False, load=True)
|
||||||
|
|
||||||
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
|
|
||||||
|
|
||||||
def populate_any_indicators(
|
def populate_any_indicators(
|
||||||
self, pair, df, tf, informative=None, set_generalized_indicators=False
|
self, pair, df, tf, informative=None, set_generalized_indicators=False
|
||||||
):
|
):
|
||||||
|
Loading…
Reference in New Issue
Block a user