|
|
|
|
@ -60,32 +60,35 @@ def test_generate_backtest_stats(default_conf, testdatadir):
|
|
|
|
|
default_conf.update({'strategy': 'DefaultStrategy'})
|
|
|
|
|
StrategyResolver.load_strategy(default_conf)
|
|
|
|
|
|
|
|
|
|
results = {'DefStrat': pd.DataFrame({"pair": ["UNITTEST/BTC", "UNITTEST/BTC",
|
|
|
|
|
"UNITTEST/BTC", "UNITTEST/BTC"],
|
|
|
|
|
"profit_percent": [0.003312, 0.010801, 0.013803, 0.002780],
|
|
|
|
|
"profit_abs": [0.000003, 0.000011, 0.000014, 0.000003],
|
|
|
|
|
"open_date": [Arrow(2017, 11, 14, 19, 32, 00).datetime,
|
|
|
|
|
Arrow(2017, 11, 14, 21, 36, 00).datetime,
|
|
|
|
|
Arrow(2017, 11, 14, 22, 12, 00).datetime,
|
|
|
|
|
Arrow(2017, 11, 14, 22, 44, 00).datetime],
|
|
|
|
|
"close_date": [Arrow(2017, 11, 14, 21, 35, 00).datetime,
|
|
|
|
|
Arrow(2017, 11, 14, 22, 10, 00).datetime,
|
|
|
|
|
Arrow(2017, 11, 14, 22, 43, 00).datetime,
|
|
|
|
|
Arrow(2017, 11, 14, 22, 58, 00).datetime],
|
|
|
|
|
"open_rate": [0.002543, 0.003003, 0.003089, 0.003214],
|
|
|
|
|
"close_rate": [0.002546, 0.003014, 0.003103, 0.003217],
|
|
|
|
|
"trade_duration": [123, 34, 31, 14],
|
|
|
|
|
"open_at_end": [False, False, False, True],
|
|
|
|
|
"sell_reason": [SellType.ROI, SellType.STOP_LOSS,
|
|
|
|
|
SellType.ROI, SellType.FORCE_SELL]
|
|
|
|
|
})}
|
|
|
|
|
results = {'DefStrat': {
|
|
|
|
|
'results': pd.DataFrame({"pair": ["UNITTEST/BTC", "UNITTEST/BTC",
|
|
|
|
|
"UNITTEST/BTC", "UNITTEST/BTC"],
|
|
|
|
|
"profit_percent": [0.003312, 0.010801, 0.013803, 0.002780],
|
|
|
|
|
"profit_abs": [0.000003, 0.000011, 0.000014, 0.000003],
|
|
|
|
|
"open_date": [Arrow(2017, 11, 14, 19, 32, 00).datetime,
|
|
|
|
|
Arrow(2017, 11, 14, 21, 36, 00).datetime,
|
|
|
|
|
Arrow(2017, 11, 14, 22, 12, 00).datetime,
|
|
|
|
|
Arrow(2017, 11, 14, 22, 44, 00).datetime],
|
|
|
|
|
"close_date": [Arrow(2017, 11, 14, 21, 35, 00).datetime,
|
|
|
|
|
Arrow(2017, 11, 14, 22, 10, 00).datetime,
|
|
|
|
|
Arrow(2017, 11, 14, 22, 43, 00).datetime,
|
|
|
|
|
Arrow(2017, 11, 14, 22, 58, 00).datetime],
|
|
|
|
|
"open_rate": [0.002543, 0.003003, 0.003089, 0.003214],
|
|
|
|
|
"close_rate": [0.002546, 0.003014, 0.003103, 0.003217],
|
|
|
|
|
"trade_duration": [123, 34, 31, 14],
|
|
|
|
|
"open_at_end": [False, False, False, True],
|
|
|
|
|
"sell_reason": [SellType.ROI, SellType.STOP_LOSS,
|
|
|
|
|
SellType.ROI, SellType.FORCE_SELL]
|
|
|
|
|
}),
|
|
|
|
|
'config': default_conf}
|
|
|
|
|
}
|
|
|
|
|
timerange = TimeRange.parse_timerange('1510688220-1510700340')
|
|
|
|
|
min_date = Arrow.fromtimestamp(1510688220)
|
|
|
|
|
max_date = Arrow.fromtimestamp(1510700340)
|
|
|
|
|
btdata = history.load_data(testdatadir, '1m', ['UNITTEST/BTC'], timerange=timerange,
|
|
|
|
|
fill_up_missing=True)
|
|
|
|
|
|
|
|
|
|
stats = generate_backtest_stats(default_conf, btdata, results, min_date, max_date)
|
|
|
|
|
stats = generate_backtest_stats(btdata, results, min_date, max_date)
|
|
|
|
|
assert isinstance(stats, dict)
|
|
|
|
|
assert 'strategy' in stats
|
|
|
|
|
assert 'DefStrat' in stats['strategy']
|
|
|
|
|
@ -93,29 +96,32 @@ def test_generate_backtest_stats(default_conf, testdatadir):
|
|
|
|
|
strat_stats = stats['strategy']['DefStrat']
|
|
|
|
|
assert strat_stats['backtest_start'] == min_date.datetime
|
|
|
|
|
assert strat_stats['backtest_end'] == max_date.datetime
|
|
|
|
|
assert strat_stats['total_trades'] == len(results['DefStrat'])
|
|
|
|
|
assert strat_stats['total_trades'] == len(results['DefStrat']['results'])
|
|
|
|
|
# Above sample had no loosing trade
|
|
|
|
|
assert strat_stats['max_drawdown'] == 0.0
|
|
|
|
|
|
|
|
|
|
results = {'DefStrat': pd.DataFrame(
|
|
|
|
|
{"pair": ["UNITTEST/BTC", "UNITTEST/BTC", "UNITTEST/BTC", "UNITTEST/BTC"],
|
|
|
|
|
"profit_percent": [0.003312, 0.010801, -0.013803, 0.002780],
|
|
|
|
|
"profit_abs": [0.000003, 0.000011, -0.000014, 0.000003],
|
|
|
|
|
"open_date": [Arrow(2017, 11, 14, 19, 32, 00).datetime,
|
|
|
|
|
Arrow(2017, 11, 14, 21, 36, 00).datetime,
|
|
|
|
|
Arrow(2017, 11, 14, 22, 12, 00).datetime,
|
|
|
|
|
Arrow(2017, 11, 14, 22, 44, 00).datetime],
|
|
|
|
|
"close_date": [Arrow(2017, 11, 14, 21, 35, 00).datetime,
|
|
|
|
|
Arrow(2017, 11, 14, 22, 10, 00).datetime,
|
|
|
|
|
Arrow(2017, 11, 14, 22, 43, 00).datetime,
|
|
|
|
|
Arrow(2017, 11, 14, 22, 58, 00).datetime],
|
|
|
|
|
"open_rate": [0.002543, 0.003003, 0.003089, 0.003214],
|
|
|
|
|
"close_rate": [0.002546, 0.003014, 0.0032903, 0.003217],
|
|
|
|
|
"trade_duration": [123, 34, 31, 14],
|
|
|
|
|
"open_at_end": [False, False, False, True],
|
|
|
|
|
"sell_reason": [SellType.ROI, SellType.STOP_LOSS,
|
|
|
|
|
SellType.ROI, SellType.FORCE_SELL]
|
|
|
|
|
})}
|
|
|
|
|
results = {'DefStrat': {
|
|
|
|
|
'results': pd.DataFrame(
|
|
|
|
|
{"pair": ["UNITTEST/BTC", "UNITTEST/BTC", "UNITTEST/BTC", "UNITTEST/BTC"],
|
|
|
|
|
"profit_percent": [0.003312, 0.010801, -0.013803, 0.002780],
|
|
|
|
|
"profit_abs": [0.000003, 0.000011, -0.000014, 0.000003],
|
|
|
|
|
"open_date": [Arrow(2017, 11, 14, 19, 32, 00).datetime,
|
|
|
|
|
Arrow(2017, 11, 14, 21, 36, 00).datetime,
|
|
|
|
|
Arrow(2017, 11, 14, 22, 12, 00).datetime,
|
|
|
|
|
Arrow(2017, 11, 14, 22, 44, 00).datetime],
|
|
|
|
|
"close_date": [Arrow(2017, 11, 14, 21, 35, 00).datetime,
|
|
|
|
|
Arrow(2017, 11, 14, 22, 10, 00).datetime,
|
|
|
|
|
Arrow(2017, 11, 14, 22, 43, 00).datetime,
|
|
|
|
|
Arrow(2017, 11, 14, 22, 58, 00).datetime],
|
|
|
|
|
"open_rate": [0.002543, 0.003003, 0.003089, 0.003214],
|
|
|
|
|
"close_rate": [0.002546, 0.003014, 0.0032903, 0.003217],
|
|
|
|
|
"trade_duration": [123, 34, 31, 14],
|
|
|
|
|
"open_at_end": [False, False, False, True],
|
|
|
|
|
"sell_reason": [SellType.ROI, SellType.STOP_LOSS,
|
|
|
|
|
SellType.ROI, SellType.FORCE_SELL]
|
|
|
|
|
}),
|
|
|
|
|
'config': default_conf}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
assert strat_stats['max_drawdown'] == 0.0
|
|
|
|
|
assert strat_stats['drawdown_start'] == Arrow.fromtimestamp(0).datetime
|
|
|
|
|
@ -283,9 +289,10 @@ def test_generate_sell_reason_stats(default_conf):
|
|
|
|
|
assert stop_result['profit_mean_pct'] == round(stop_result['profit_mean'] * 100, 2)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def test_text_table_strategy(default_conf, mocker):
|
|
|
|
|
def test_text_table_strategy(default_conf):
|
|
|
|
|
default_conf['max_open_trades'] = 2
|
|
|
|
|
results = {}
|
|
|
|
|
results['TestStrategy1'] = pd.DataFrame(
|
|
|
|
|
results['TestStrategy1'] = {'results': pd.DataFrame(
|
|
|
|
|
{
|
|
|
|
|
'pair': ['ETH/BTC', 'ETH/BTC', 'ETH/BTC'],
|
|
|
|
|
'profit_percent': [0.1, 0.2, 0.3],
|
|
|
|
|
@ -296,8 +303,8 @@ def test_text_table_strategy(default_conf, mocker):
|
|
|
|
|
'losses': [0, 0, 1],
|
|
|
|
|
'sell_reason': [SellType.ROI, SellType.ROI, SellType.STOP_LOSS]
|
|
|
|
|
}
|
|
|
|
|
)
|
|
|
|
|
results['TestStrategy2'] = pd.DataFrame(
|
|
|
|
|
), 'config': default_conf}
|
|
|
|
|
results['TestStrategy2'] = {'results': pd.DataFrame(
|
|
|
|
|
{
|
|
|
|
|
'pair': ['LTC/BTC', 'LTC/BTC', 'LTC/BTC'],
|
|
|
|
|
'profit_percent': [0.4, 0.2, 0.3],
|
|
|
|
|
@ -308,7 +315,7 @@ def test_text_table_strategy(default_conf, mocker):
|
|
|
|
|
'losses': [0, 0, 1],
|
|
|
|
|
'sell_reason': [SellType.ROI, SellType.ROI, SellType.STOP_LOSS]
|
|
|
|
|
}
|
|
|
|
|
)
|
|
|
|
|
), 'config': default_conf}
|
|
|
|
|
|
|
|
|
|
result_str = (
|
|
|
|
|
'| Strategy | Buys | Avg Profit % | Cum Profit % | Tot'
|
|
|
|
|
@ -321,9 +328,7 @@ def test_text_table_strategy(default_conf, mocker):
|
|
|
|
|
' 45.00 | 0:20:00 | 3 | 0 | 0 |'
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
strategy_results = generate_strategy_metrics(stake_currency='BTC',
|
|
|
|
|
max_open_trades=2,
|
|
|
|
|
all_results=results)
|
|
|
|
|
strategy_results = generate_strategy_metrics(all_results=results)
|
|
|
|
|
|
|
|
|
|
assert text_table_strategy(strategy_results, 'BTC') == result_str
|
|
|
|
|
|
|
|
|
|
|