Extract tests for backtest_reports to their own test module
This commit is contained in:
parent
904e1647e1
commit
10ee23622a
96
tests/optimize/test_backtest_reports.py
Normal file
96
tests/optimize/test_backtest_reports.py
Normal file
@ -0,0 +1,96 @@
|
|||||||
|
import pandas as pd
|
||||||
|
|
||||||
|
from freqtrade.optimize.backtest_reports import (
|
||||||
|
generate_text_table, generate_text_table_sell_reason,
|
||||||
|
generate_text_table_strategy)
|
||||||
|
from freqtrade.strategy.interface import SellType
|
||||||
|
|
||||||
|
|
||||||
|
def test_generate_text_table(default_conf, mocker):
|
||||||
|
|
||||||
|
results = pd.DataFrame(
|
||||||
|
{
|
||||||
|
'pair': ['ETH/BTC', 'ETH/BTC'],
|
||||||
|
'profit_percent': [0.1, 0.2],
|
||||||
|
'profit_abs': [0.2, 0.4],
|
||||||
|
'trade_duration': [10, 30],
|
||||||
|
'profit': [2, 0],
|
||||||
|
'loss': [0, 0]
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
result_str = (
|
||||||
|
'| pair | buy count | avg profit % | cum profit % | '
|
||||||
|
'tot profit BTC | tot profit % | avg duration | profit | loss |\n'
|
||||||
|
'|:--------|------------:|---------------:|---------------:|'
|
||||||
|
'-----------------:|---------------:|:---------------|---------:|-------:|\n'
|
||||||
|
'| ETH/BTC | 2 | 15.00 | 30.00 | '
|
||||||
|
'0.60000000 | 15.00 | 0:20:00 | 2 | 0 |\n'
|
||||||
|
'| TOTAL | 2 | 15.00 | 30.00 | '
|
||||||
|
'0.60000000 | 15.00 | 0:20:00 | 2 | 0 |'
|
||||||
|
)
|
||||||
|
assert generate_text_table(data={'ETH/BTC': {}},
|
||||||
|
stake_currency='BTC', max_open_trades=2,
|
||||||
|
results=results) == result_str
|
||||||
|
|
||||||
|
|
||||||
|
def test_generate_text_table_sell_reason(default_conf, mocker):
|
||||||
|
|
||||||
|
results = pd.DataFrame(
|
||||||
|
{
|
||||||
|
'pair': ['ETH/BTC', 'ETH/BTC', 'ETH/BTC'],
|
||||||
|
'profit_percent': [0.1, 0.2, -0.3],
|
||||||
|
'profit_abs': [0.2, 0.4, -0.5],
|
||||||
|
'trade_duration': [10, 30, 10],
|
||||||
|
'profit': [2, 0, 0],
|
||||||
|
'loss': [0, 0, 1],
|
||||||
|
'sell_reason': [SellType.ROI, SellType.ROI, SellType.STOP_LOSS]
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
result_str = (
|
||||||
|
'| Sell Reason | Count | Profit | Loss |\n'
|
||||||
|
'|:--------------|--------:|---------:|-------:|\n'
|
||||||
|
'| roi | 2 | 2 | 0 |\n'
|
||||||
|
'| stop_loss | 1 | 0 | 1 |'
|
||||||
|
)
|
||||||
|
assert generate_text_table_sell_reason(
|
||||||
|
data={'ETH/BTC': {}}, results=results) == result_str
|
||||||
|
|
||||||
|
|
||||||
|
def test_generate_text_table_strategy(default_conf, mocker):
|
||||||
|
results = {}
|
||||||
|
results['ETH/BTC'] = pd.DataFrame(
|
||||||
|
{
|
||||||
|
'pair': ['ETH/BTC', 'ETH/BTC', 'ETH/BTC'],
|
||||||
|
'profit_percent': [0.1, 0.2, 0.3],
|
||||||
|
'profit_abs': [0.2, 0.4, 0.5],
|
||||||
|
'trade_duration': [10, 30, 10],
|
||||||
|
'profit': [2, 0, 0],
|
||||||
|
'loss': [0, 0, 1],
|
||||||
|
'sell_reason': [SellType.ROI, SellType.ROI, SellType.STOP_LOSS]
|
||||||
|
}
|
||||||
|
)
|
||||||
|
results['LTC/BTC'] = pd.DataFrame(
|
||||||
|
{
|
||||||
|
'pair': ['LTC/BTC', 'LTC/BTC', 'LTC/BTC'],
|
||||||
|
'profit_percent': [0.4, 0.2, 0.3],
|
||||||
|
'profit_abs': [0.4, 0.4, 0.5],
|
||||||
|
'trade_duration': [15, 30, 15],
|
||||||
|
'profit': [4, 1, 0],
|
||||||
|
'loss': [0, 0, 1],
|
||||||
|
'sell_reason': [SellType.ROI, SellType.ROI, SellType.STOP_LOSS]
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
result_str = (
|
||||||
|
'| Strategy | buy count | avg profit % | cum profit % '
|
||||||
|
'| tot profit BTC | tot profit % | avg duration | profit | loss |\n'
|
||||||
|
'|:-----------|------------:|---------------:|---------------:'
|
||||||
|
'|-----------------:|---------------:|:---------------|---------:|-------:|\n'
|
||||||
|
'| ETH/BTC | 3 | 20.00 | 60.00 '
|
||||||
|
'| 1.10000000 | 30.00 | 0:17:00 | 3 | 0 |\n'
|
||||||
|
'| LTC/BTC | 3 | 30.00 | 90.00 '
|
||||||
|
'| 1.30000000 | 45.00 | 0:20:00 | 3 | 0 |'
|
||||||
|
)
|
||||||
|
assert generate_text_table_strategy('BTC', 2, all_results=results) == result_str
|
@ -19,9 +19,6 @@ from freqtrade.data.dataprovider import DataProvider
|
|||||||
from freqtrade.data.history import get_timerange
|
from freqtrade.data.history import get_timerange
|
||||||
from freqtrade.exceptions import DependencyException, OperationalException
|
from freqtrade.exceptions import DependencyException, OperationalException
|
||||||
from freqtrade.optimize import setup_configuration, start_backtesting
|
from freqtrade.optimize import setup_configuration, start_backtesting
|
||||||
from freqtrade.optimize.backtest_reports import (
|
|
||||||
generate_text_table, generate_text_table_sell_reason,
|
|
||||||
generate_text_table_strategy)
|
|
||||||
from freqtrade.optimize.backtesting import Backtesting
|
from freqtrade.optimize.backtesting import Backtesting
|
||||||
from freqtrade.state import RunMode
|
from freqtrade.state import RunMode
|
||||||
from freqtrade.strategy.default_strategy import DefaultStrategy
|
from freqtrade.strategy.default_strategy import DefaultStrategy
|
||||||
@ -361,96 +358,6 @@ def test_tickerdata_to_dataframe_bt(default_conf, mocker, testdatadir) -> None:
|
|||||||
assert data['UNITTEST/BTC'].equals(data2['UNITTEST/BTC'])
|
assert data['UNITTEST/BTC'].equals(data2['UNITTEST/BTC'])
|
||||||
|
|
||||||
|
|
||||||
def test_generate_text_table(default_conf, mocker):
|
|
||||||
|
|
||||||
results = pd.DataFrame(
|
|
||||||
{
|
|
||||||
'pair': ['ETH/BTC', 'ETH/BTC'],
|
|
||||||
'profit_percent': [0.1, 0.2],
|
|
||||||
'profit_abs': [0.2, 0.4],
|
|
||||||
'trade_duration': [10, 30],
|
|
||||||
'profit': [2, 0],
|
|
||||||
'loss': [0, 0]
|
|
||||||
}
|
|
||||||
)
|
|
||||||
|
|
||||||
result_str = (
|
|
||||||
'| pair | buy count | avg profit % | cum profit % | '
|
|
||||||
'tot profit BTC | tot profit % | avg duration | profit | loss |\n'
|
|
||||||
'|:--------|------------:|---------------:|---------------:|'
|
|
||||||
'-----------------:|---------------:|:---------------|---------:|-------:|\n'
|
|
||||||
'| ETH/BTC | 2 | 15.00 | 30.00 | '
|
|
||||||
'0.60000000 | 15.00 | 0:20:00 | 2 | 0 |\n'
|
|
||||||
'| TOTAL | 2 | 15.00 | 30.00 | '
|
|
||||||
'0.60000000 | 15.00 | 0:20:00 | 2 | 0 |'
|
|
||||||
)
|
|
||||||
assert generate_text_table(data={'ETH/BTC': {}},
|
|
||||||
stake_currency='BTC', max_open_trades=2,
|
|
||||||
results=results) == result_str
|
|
||||||
|
|
||||||
|
|
||||||
def test_generate_text_table_sell_reason(default_conf, mocker):
|
|
||||||
|
|
||||||
results = pd.DataFrame(
|
|
||||||
{
|
|
||||||
'pair': ['ETH/BTC', 'ETH/BTC', 'ETH/BTC'],
|
|
||||||
'profit_percent': [0.1, 0.2, -0.3],
|
|
||||||
'profit_abs': [0.2, 0.4, -0.5],
|
|
||||||
'trade_duration': [10, 30, 10],
|
|
||||||
'profit': [2, 0, 0],
|
|
||||||
'loss': [0, 0, 1],
|
|
||||||
'sell_reason': [SellType.ROI, SellType.ROI, SellType.STOP_LOSS]
|
|
||||||
}
|
|
||||||
)
|
|
||||||
|
|
||||||
result_str = (
|
|
||||||
'| Sell Reason | Count | Profit | Loss |\n'
|
|
||||||
'|:--------------|--------:|---------:|-------:|\n'
|
|
||||||
'| roi | 2 | 2 | 0 |\n'
|
|
||||||
'| stop_loss | 1 | 0 | 1 |'
|
|
||||||
)
|
|
||||||
assert generate_text_table_sell_reason(
|
|
||||||
data={'ETH/BTC': {}}, results=results) == result_str
|
|
||||||
|
|
||||||
|
|
||||||
def test_generate_text_table_strategy(default_conf, mocker):
|
|
||||||
results = {}
|
|
||||||
results['ETH/BTC'] = pd.DataFrame(
|
|
||||||
{
|
|
||||||
'pair': ['ETH/BTC', 'ETH/BTC', 'ETH/BTC'],
|
|
||||||
'profit_percent': [0.1, 0.2, 0.3],
|
|
||||||
'profit_abs': [0.2, 0.4, 0.5],
|
|
||||||
'trade_duration': [10, 30, 10],
|
|
||||||
'profit': [2, 0, 0],
|
|
||||||
'loss': [0, 0, 1],
|
|
||||||
'sell_reason': [SellType.ROI, SellType.ROI, SellType.STOP_LOSS]
|
|
||||||
}
|
|
||||||
)
|
|
||||||
results['LTC/BTC'] = pd.DataFrame(
|
|
||||||
{
|
|
||||||
'pair': ['LTC/BTC', 'LTC/BTC', 'LTC/BTC'],
|
|
||||||
'profit_percent': [0.4, 0.2, 0.3],
|
|
||||||
'profit_abs': [0.4, 0.4, 0.5],
|
|
||||||
'trade_duration': [15, 30, 15],
|
|
||||||
'profit': [4, 1, 0],
|
|
||||||
'loss': [0, 0, 1],
|
|
||||||
'sell_reason': [SellType.ROI, SellType.ROI, SellType.STOP_LOSS]
|
|
||||||
}
|
|
||||||
)
|
|
||||||
|
|
||||||
result_str = (
|
|
||||||
'| Strategy | buy count | avg profit % | cum profit % '
|
|
||||||
'| tot profit BTC | tot profit % | avg duration | profit | loss |\n'
|
|
||||||
'|:-----------|------------:|---------------:|---------------:'
|
|
||||||
'|-----------------:|---------------:|:---------------|---------:|-------:|\n'
|
|
||||||
'| ETH/BTC | 3 | 20.00 | 60.00 '
|
|
||||||
'| 1.10000000 | 30.00 | 0:17:00 | 3 | 0 |\n'
|
|
||||||
'| LTC/BTC | 3 | 30.00 | 90.00 '
|
|
||||||
'| 1.30000000 | 45.00 | 0:20:00 | 3 | 0 |'
|
|
||||||
)
|
|
||||||
assert generate_text_table_strategy('BTC', 2, all_results=results) == result_str
|
|
||||||
|
|
||||||
|
|
||||||
def test_backtesting_start(default_conf, mocker, testdatadir, caplog) -> None:
|
def test_backtesting_start(default_conf, mocker, testdatadir, caplog) -> None:
|
||||||
def get_timerange(input1):
|
def get_timerange(input1):
|
||||||
return Arrow(2017, 11, 14, 21, 17), Arrow(2017, 11, 14, 22, 59)
|
return Arrow(2017, 11, 14, 21, 17), Arrow(2017, 11, 14, 22, 59)
|
||||||
|
Loading…
Reference in New Issue
Block a user