From e2356c856d24e955f9eae419042417ad0e3eca54 Mon Sep 17 00:00:00 2001 From: Matthias Date: Sat, 2 Oct 2021 15:23:09 +0200 Subject: [PATCH] Improve outstanding balance --- freqtrade/data/btanalysis.py | 6 ++--- tests/optimize/test_hyperoptloss.py | 34 ++++++++++++++++++++--------- 2 files changed, 27 insertions(+), 13 deletions(-) diff --git a/freqtrade/data/btanalysis.py b/freqtrade/data/btanalysis.py index 79b0c2801..8ba61aeed 100644 --- a/freqtrade/data/btanalysis.py +++ b/freqtrade/data/btanalysis.py @@ -446,13 +446,13 @@ def calculate_outstanding_balance(results: pd.DataFrame, timeframe: str, from freqtrade.exchange import timeframe_to_minutes timeframe_min = timeframe_to_minutes(timeframe) - df3 = expand_trades_over_period(results, timeframe, timeframe_min) + trades_over_period = expand_trades_over_period(results, timeframe, timeframe_min) values = {} # Iterate over every pair for pair in hloc: ohlc = hloc[pair].set_index('date') - df_pair = df3.loc[df3['pair'] == pair] + df_pair = trades_over_period.loc[trades_over_period['pair'] == pair] # filter on pair and convert dateindex to utc # * Temporary workaround df_pair.index = pd.to_datetime(df_pair.index, utc=True) @@ -466,6 +466,6 @@ def calculate_outstanding_balance(results: pd.DataFrame, timeframe: str, values[pair] = df4 balance = pd.concat([df[['value']] for k, df in values.items()]) - # TODO: Does this resample make sense ... ? + # Combine multi-pair balances balance = balance.resample(f"{timeframe_min}min").agg({"value": sum}) return balance diff --git a/tests/optimize/test_hyperoptloss.py b/tests/optimize/test_hyperoptloss.py index 923e3fc32..d35b45e12 100644 --- a/tests/optimize/test_hyperoptloss.py +++ b/tests/optimize/test_hyperoptloss.py @@ -6,6 +6,7 @@ import pytest from freqtrade.exceptions import OperationalException from freqtrade.optimize.hyperopt_loss_short_trade_dur import ShortTradeDurHyperOptLoss from freqtrade.resolvers.hyperopt_resolver import HyperOptLossResolver +from tests.strategy.test_strategy_helpers import generate_test_data def test_hyperoptlossresolver_noname(default_conf): @@ -78,14 +79,16 @@ def test_loss_calculation_has_limited_profit(hyperopt_conf, hyperopt_results) -> assert under > correct -@pytest.mark.parametrize('lossfunction', [ - "OnlyProfitHyperOptLoss", - "SortinoHyperOptLoss", - "SortinoHyperOptLossDaily", - "SharpeHyperOptLoss", - "SharpeHyperOptLossDaily", +@pytest.mark.parametrize('lossfunction, needsdata', [ + ("OnlyProfitHyperOptLoss", False), + ("SortinoHyperOptLoss", False), + ("SortinoHyperOptLossDaily", False), + ("SharpeHyperOptLoss", False), + ("SharpeHyperOptLossDaily", False), + ("SortinoLossBalance", True), ]) -def test_loss_functions_better_profits(default_conf, hyperopt_results, lossfunction) -> None: +def test_loss_functions_better_profits(default_conf, hyperopt_results, + lossfunction, needsdata) -> None: results_over = hyperopt_results.copy() results_over['profit_abs'] = hyperopt_results['profit_abs'] * 2 results_over['profit_ratio'] = hyperopt_results['profit_ratio'] * 2 @@ -93,13 +96,24 @@ def test_loss_functions_better_profits(default_conf, hyperopt_results, lossfunct results_under['profit_abs'] = hyperopt_results['profit_abs'] / 2 results_under['profit_ratio'] = hyperopt_results['profit_ratio'] / 2 + if needsdata: + data = {'ETH/USDT': generate_test_data('5m', 1200, start='2019-01-01')} + else: + data = {} + default_conf.update({'hyperopt_loss': lossfunction}) hl = HyperOptLossResolver.load_hyperoptloss(default_conf) correct = hl.hyperopt_loss_function(hyperopt_results, len(hyperopt_results), - datetime(2019, 1, 1), datetime(2019, 5, 1)) + datetime(2019, 1, 1), datetime(2019, 5, 1), + config=default_conf, processed=data, + ) over = hl.hyperopt_loss_function(results_over, len(results_over), - datetime(2019, 1, 1), datetime(2019, 5, 1)) + datetime(2019, 1, 1), datetime(2019, 5, 1), + config=default_conf, processed=data, + ) under = hl.hyperopt_loss_function(results_under, len(results_under), - datetime(2019, 1, 1), datetime(2019, 5, 1)) + datetime(2019, 1, 1), datetime(2019, 5, 1), + config=default_conf, processed=data, + ) assert over < correct assert under > correct