diff --git a/test/test_backtesting.py b/test/test_backtesting.py index ab2bff712..7f663481f 100644 --- a/test/test_backtesting.py +++ b/test/test_backtesting.py @@ -3,14 +3,62 @@ import unittest from unittest.mock import patch import json import arrow +from pandas import DataFrame from analyze import analyze_ticker +from persistence import Trade +from main import should_sell + +def print_results(results): + print('Made {} buys. Average profit of a deal was {:.1f}%. Total profit was {:.3f}. Average trade lasted {:.1f} minutes.'.format( + len(results.index), + results.profit.mean() * 100.0, + results.profit.sum(), + results.duration.mean()*5 + )) class TestMain(unittest.TestCase): + pairs = ['btc-neo', 'btc-eth', 'btc-omg', 'btc-edg', 'btc-pay', 'btc-pivx', 'btc-qtum'] + conf = { + "minimal_roi": { + "2880": 0.005, + "720": 0.01, + "0": 0.02 + }, + "stoploss": -0.10 + } - def test_1_create_trade(self): - with open('test/testdata/btc-neo.json') as data_file: - data = json.load(data_file) + def test_backtest(self): + trades = [] + with patch.dict('main._CONF', self.conf): + for pair in self.pairs: + with open('test/testdata/'+pair+'.json') as data_file: + data = json.load(data_file) - with patch('analyze.get_ticker', return_value=data): - with patch('arrow.utcnow', return_value=arrow.get('2017-08-20T14:50:00')): - print(analyze_ticker('BTC-NEO')) + with patch('analyze.get_ticker', return_value=data): + with patch('arrow.utcnow', return_value=arrow.get('2017-08-20T14:50:00')): + ticker = analyze_ticker(pair) + # for each buy point + for index, row in ticker[ticker.buy == 1].iterrows(): + trade = Trade( + open_rate=row['close'], + open_date=arrow.get(row['date']).datetime, + amount=1, + ) + # calculate win/lose forwards from buy point + for index2, row2 in ticker[index:].iterrows(): + if should_sell(trade, row2['close'], arrow.get(row2['date']).datetime): + current_profit = (row2['close'] - trade.open_rate) / trade.open_rate + + trades.append((pair, current_profit, index2 - index)) + break + + labels = ['currency', 'profit', 'duration'] + results = DataFrame.from_records(trades, columns=labels) + + print('====================== BACKTESTING REPORT ================================') + + for pair in self.pairs: + print('For currency {}:'.format(pair)) + print_results(results[results.currency == pair]) + print('TOTAL OVER ALL TRADES:') + print_results(results)