Skip to content

Commit 8e7de98

Browse files
committed
Merge upstream changes
2 parents 3f27a52 + 2953ca8 commit 8e7de98

File tree

6 files changed

+46
-39
lines changed

6 files changed

+46
-39
lines changed

README.md

+7-6
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,9 @@
33
[![Build Status](https://travis-ci.org/notadamking/RLTrader.svg?branch=master)](https://travis-ci.org/notadamking/RLTrader)
44
[![Contributions Welcome](https://img.shields.io/badge/contributions-welcome-brightgreen.svg)](http://makeapullrequest.com)
55
[![GPL License](https://img.shields.io/github/license/notadamking/RLTrader.svg?color=brightgreen)](https://opensource.org/licenses/GPL-3.0/)
6+
[![Discord](https://img.shields.io/discord/592446624882491402.svg?color=brightgreen)](https://discord.gg/ZZ7BGWh)
67
[![Python 3.6](https://img.shields.io/badge/python-3.6-blue.svg)](https://www.python.org/downloads/release/python-360/)
7-
[![Github Stars](https://img.shields.io/github/stars/notadamking/RLTrader.svg)](https://github.com/notadamking/RLTrader)
8+
[![Github Release](https://img.shields.io/github/release/notadamking/RLTrader.svg)](https://github.com/notadamking/RLTrader)
89

910
In this series of articles, we've created and optimized a Bitcoin trading agent to be highly profitable using deep reinforcement learning.
1011

@@ -63,17 +64,17 @@ python ./cli.py --help
6364
or simply run the project with default options:
6465

6566
```bash
66-
python ./cli.py optimize-train-test
67+
python ./cli.py optimize
6768
```
6869

6970
If you have a standard set of configs you want to run the trader against, you can specify a config file to load configuration from. Rename config/config.ini.dist to config/config.ini and run
7071

7172
```bash
72-
python ./cli.py --from-config config/config.ini optimize-train-test
73+
python ./cli.py --from-config config/config.ini optimize
7374
```
7475

7576
```bash
76-
python ./cli.py optimize-train-test
77+
python ./cli.py optimize
7778
```
7879

7980
### Testing with vagrant
@@ -92,7 +93,7 @@ Note: With vagrant you cannot take full advantage of your GPU, so is mainly for
9293
If you want to run everything within a docker container, then just use:
9394

9495
```bash
95-
./run-with-docker (cpu|gpu) (yes|no) optimize-train-test
96+
./run-with-docker (cpu|gpu) (yes|no) optimize
9697
```
9798

9899
- cpu - start the container using CPU requirements
@@ -101,7 +102,7 @@ If you want to run everything within a docker container, then just use:
101102
Note: in case using yes as second argument, use
102103

103104
```bash
104-
python ./ cli.py --params-db-path "postgres://rl_trader:rl_trader@localhost" optimize-train-test
105+
python ./ cli.py --params-db-path "postgres://rl_trader:rl_trader@localhost" optimize
105106
```
106107

107108
The database and it's data are pesisted under `data/postgres` locally.

cli.py

+19-13
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
import numpy as np
2-
3-
from deco import concurrent
2+
import multiprocessing
43

54
from lib.RLTrader import RLTrader
65
from lib.cli.RLTraderCLI import RLTraderCLI
@@ -12,27 +11,34 @@
1211
args = trader_cli.get_args()
1312

1413

15-
@concurrent(processes=args.parallel_jobs)
16-
def run_concurrent_optimize(trader: RLTrader, args):
17-
trader.optimize(args.trials, args.trials, args.parallel_jobs)
14+
def run_concurrent_optimize():
15+
trader = RLTrader(**vars(args))
16+
trader.optimize(args.trials)
17+
18+
19+
def concurrent_optimize():
20+
processes = []
21+
for i in range(args.parallel_jobs):
22+
processes.append(multiprocessing.Process(target=run_concurrent_optimize, args=()))
23+
24+
print(processes)
25+
26+
for p in processes:
27+
p.start()
28+
29+
for p in processes:
30+
p.join()
1831

1932

2033
if __name__ == '__main__':
2134
logger = init_logger(__name__, show_debug=args.debug)
2235
trader = RLTrader(**vars(args), logger=logger)
2336

2437
if args.command == 'optimize':
25-
run_concurrent_optimize(trader, args)
38+
concurrent_optimize()
2639
elif args.command == 'train':
2740
trader.train(n_epochs=args.epochs)
2841
elif args.command == 'test':
2942
trader.test(model_epoch=args.model_epoch, should_render=args.no_render)
30-
elif args.command == 'optimize-train-test':
31-
run_concurrent_optimize(trader, args)
32-
trader.train(
33-
n_epochs=args.train_epochs,
34-
test_trained_model=args.no_test,
35-
render_trained_model=args.no_render
36-
)
3743
elif args.command == 'update-static-data':
3844
download_data_async()

lib/RLTrader.py

+10-5
Original file line numberDiff line numberDiff line change
@@ -230,23 +230,28 @@ def test(self, model_epoch: int = 0, should_render: bool = True):
230230

231231
del train_provider
232232

233-
test_env = SubprocVecEnv([make_env(test_provider, i) for i in range(self.n_envs)])
233+
test_env = DummyVecEnv([make_env(test_provider, i) for i in range(1)])
234234

235235
model_path = path.join('data', 'agents', f'{self.study_name}__{model_epoch}.pkl')
236236
model = self.Model.load(model_path, env=test_env)
237237

238238
self.logger.info(f'Testing model ({self.study_name}__{model_epoch})')
239239

240+
zero_completed_obs = np.zeros((self.n_envs,) + test_env.observation_space.shape)
241+
zero_completed_obs[0, :] = test_env.reset()
242+
240243
state = None
241-
obs, rewards = test_env.reset(), []
244+
rewards = []
242245

243246
for _ in range(len(test_provider.data_frame)):
244-
action, state = model.predict(obs, state=state)
245-
obs, reward, _, __ = test_env.step(action)
247+
action, state = model.predict(zero_completed_obs, state=state)
248+
obs, reward, _, __ = test_env.step([action])
249+
250+
zero_completed_obs[0, :] = obs
246251

247252
rewards.append(reward)
248253

249-
if should_render and self.n_envs == 1:
254+
if should_render:
250255
test_env.render(mode='human')
251256

252257
self.logger.info(

lib/cli/RLTraderCLI.py

-6
Original file line numberDiff line numberDiff line change
@@ -44,12 +44,6 @@ def __init__(self):
4444

4545
subparsers = self.parser.add_subparsers(help='Command', dest="command")
4646

47-
opt_train_test_parser = subparsers.add_parser('optimize-train-test', description='Optimize train and test')
48-
opt_train_test_parser.add_argument('--trials', type=int, default=20, help='Number of trials')
49-
opt_train_test_parser.add_argument('--train-epochs', type=int, default=10, help='Train for how many epochs')
50-
opt_train_test_parser.add_argument('--no-render', action='store_false', help='Should render the model')
51-
opt_train_test_parser.add_argument('--no-test', action='store_false', help='Should test the model')
52-
5347
optimize_parser = subparsers.add_parser('optimize', description='Optimize model parameters')
5448
optimize_parser.add_argument('--trials', type=int, default=1, help='Number of trials')
5549

optimize.py

+10-8
Original file line numberDiff line numberDiff line change
@@ -15,15 +15,17 @@ def optimize_code(params):
1515
n_process = multiprocessing.cpu_count()
1616
params = {'n_cpu': n_process}
1717

18-
processes = []
19-
for i in range(n_process):
20-
processes.append(multiprocessing.Process(target=optimize_code, args=(params,)))
18+
# processes = []
19+
# for i in range(n_process):
20+
# processes.append(multiprocessing.Process(target=optimize_code, args=(params,)))
2121

22-
for p in processes:
23-
p.start()
22+
# for p in processes:
23+
# p.start()
2424

25-
for p in processes:
26-
p.join()
25+
# for p in processes:
26+
# p.join()
2727

2828
trader = RLTrader(**params)
29-
trader.train(test_trained_model=True, render_trained_model=True)
29+
# trader.train(test_trained_model=True, render_trained_model=True)
30+
31+
trader.test(model_epoch=10)

requirements.base.txt

-1
Original file line numberDiff line numberDiff line change
@@ -10,5 +10,4 @@ statsmodels==0.10.0rc2
1010
empyrical
1111
ccxt
1212
psycopg2
13-
deco
1413
configparser

0 commit comments

Comments
 (0)