Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
Show all changes
105 commits
Select commit Hold shift + click to select a range
f09af43
rl init
ultmaster Feb 28, 2022
65e775e
aux info
ultmaster Feb 28, 2022
f761e35
Reward config
ultmaster Mar 1, 2022
78f6662
update
ultmaster Mar 1, 2022
0eaea69
simple
ultmaster Mar 2, 2022
cb6dd9b
update saoe init
ultmaster Mar 2, 2022
7ae01ea
update simulator and seed
ultmaster Mar 15, 2022
7693bed
minor
ultmaster Mar 21, 2022
2613919
minor
ultmaster Mar 22, 2022
3a88e61
update sim
ultmaster Mar 25, 2022
7a79b7f
checkpoint
ultmaster Mar 25, 2022
c5fd45c
obs
ultmaster Mar 29, 2022
f86e664
Update interpreter
ultmaster Mar 29, 2022
736993a
init qlib simulator
ultmaster Mar 29, 2022
ac57fa0
checkpoint
ultmaster Apr 1, 2022
fd3a9b3
Refine codebase
ultmaster Apr 19, 2022
fe17bb3
Merge branch 'main' of https://github.com/microsoft/qlib into rl-simple
ultmaster Apr 19, 2022
2bfb979
checkpoint
ultmaster Apr 19, 2022
587dd70
checkpoint
ultmaster Apr 20, 2022
80e8181
Add one test
ultmaster Apr 20, 2022
f915aa8
More tests
ultmaster Apr 20, 2022
71ddc95
Simulator checkpoint
ultmaster Apr 21, 2022
d41c68f
checkpoint
ultmaster Apr 21, 2022
99fa4f0
First-step tested
ultmaster Apr 22, 2022
f245ab8
Checkpoint
ultmaster Apr 22, 2022
e035f3b
Update data_queue API
ultmaster Apr 22, 2022
0d3055b
Checkpoint
ultmaster Apr 22, 2022
0848b15
Update test
ultmaster Apr 22, 2022
4b89907
Move files
ultmaster Apr 23, 2022
b1997cc
Checkpoint
ultmaster Apr 23, 2022
bd80eec
Single-quote -> double-quote
ultmaster Apr 23, 2022
d7a2b78
Fix finite env tests
ultmaster Apr 23, 2022
9a31e49
Tested with mypy
ultmaster Apr 24, 2022
eb162d1
pep-574
ultmaster Apr 24, 2022
c01e161
No call for env done
ultmaster Apr 24, 2022
9a05916
Update finite env docs
ultmaster Apr 25, 2022
14ef3de
Fix csv writer
ultmaster Apr 25, 2022
924b2c4
Refine tester
ultmaster Apr 25, 2022
79384ae
Update logger
ultmaster Apr 25, 2022
d9124c7
Add another logger test
ultmaster Apr 25, 2022
18b29da
Checkpoint
ultmaster Apr 25, 2022
40951ba
Add network sanity test
ultmaster Apr 25, 2022
32fd1ce
steps per episode is not correct
ultmaster Apr 25, 2022
be31192
Cleanup code, ready for PR
ultmaster Apr 25, 2022
c2795d2
Merge branch 'main' of https://github.com/microsoft/qlib into rl-simple
ultmaster Apr 25, 2022
3a92b56
Reformat with black
ultmaster Apr 25, 2022
d9bc048
Fix pylint for py37
ultmaster Apr 25, 2022
bf9973a
Fix lint
ultmaster Apr 25, 2022
6d11d45
Fix lint
ultmaster Apr 25, 2022
9db85a1
Fix flake
ultmaster Apr 25, 2022
40b40a5
update mypy command
ultmaster Apr 25, 2022
80f4db7
mypy
ultmaster Apr 25, 2022
571b262
Update exclude pattern
ultmaster Apr 25, 2022
c69e70d
Use pyproject.toml
ultmaster Apr 25, 2022
d2e6758
test
ultmaster Apr 25, 2022
a45e217
.
ultmaster Apr 25, 2022
303025e
.
ultmaster Apr 25, 2022
424b164
Refactor pipeline
ultmaster Apr 26, 2022
29e4ab9
.
ultmaster Apr 26, 2022
0caf2c5
defaults run bash
ultmaster Apr 26, 2022
3dc1b73
.
ultmaster Apr 26, 2022
4f24094
Revert and skip follow_imports
ultmaster Apr 26, 2022
fb930a0
Fix toml issue
ultmaster Apr 26, 2022
61faf62
fix mypy
ultmaster Apr 26, 2022
f9d6d2f
.
ultmaster Apr 26, 2022
fcc5592
.
ultmaster Apr 26, 2022
2821ab3
.
ultmaster Apr 26, 2022
9c19c74
Fix install
ultmaster Apr 26, 2022
7ba3653
Minor fix
ultmaster May 6, 2022
54ee6c0
Fix test
ultmaster May 7, 2022
a6e01c0
Fix test
ultmaster May 7, 2022
b27daa6
Merge branch 'main' of https://github.com/microsoft/qlib into rl-simple
ultmaster May 7, 2022
e5a5381
Remove requirements
ultmaster May 7, 2022
354d4c9
Revert
ultmaster May 7, 2022
5e481f0
fix tests
ultmaster May 7, 2022
508e407
Fix lint
ultmaster May 7, 2022
60f8703
.
ultmaster May 7, 2022
e22f9e8
.
ultmaster May 7, 2022
a951cc9
.
ultmaster May 7, 2022
b4815e6
.
ultmaster May 7, 2022
9fe59a3
.
ultmaster May 7, 2022
f37f526
update install from source command
ultmaster May 7, 2022
4c4c0b6
.
ultmaster May 7, 2022
fb8cd1d
Fix data download
ultmaster May 7, 2022
0c17122
.
ultmaster May 7, 2022
06769dc
.
ultmaster May 8, 2022
37e8e37
.
ultmaster May 8, 2022
bae7c9f
.
ultmaster May 8, 2022
33cf405
.
ultmaster May 8, 2022
4ffd5c9
.
ultmaster May 8, 2022
aba6640
Fix py37
ultmaster May 8, 2022
a27f338
Ignore tests on non-linux
ultmaster May 8, 2022
6be74a6
resolve comments
ultmaster May 12, 2022
2958c77
fix tests
ultmaster May 12, 2022
38bcf7e
resolve comments
ultmaster May 13, 2022
267cb67
some typo
you-n-g May 15, 2022
4063f78
style updates
ultmaster May 16, 2022
daa510f
More comments
ultmaster May 16, 2022
60157a9
fix dummy
ultmaster May 16, 2022
68a88bb
add warning
ultmaster May 18, 2022
25a26c0
Align precision in some system
you-n-g May 19, 2022
a3ece1c
Merge pull request #2 from you-n-g/rl-simple
ultmaster May 20, 2022
6292958
Added some impl notes
ultmaster May 20, 2022
d649c2e
Merge branch 'rl-simple' of github.com:ultmaster/qlib into rl-simple
ultmaster May 20, 2022
5da6adb
Merge pull request #1 from you-n-g/rl-simple-typo
ultmaster May 20, 2022
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
37 changes: 27 additions & 10 deletions qlib/rl/entries/test.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@

from __future__ import annotations

import copy
from typing import Callable, Sequence

from tianshou.data import Collector
Expand All @@ -13,7 +14,7 @@
from qlib.rl.simulator import InitialStateType, Simulator
from qlib.rl.interpreter import StateInterpreter, ActionInterpreter
from qlib.rl.reward import Reward
from qlib.rl.utils import DataQueue, EnvWrapper, FiniteEnvType, LogCollector, LogWriter, finite_env_factory
from qlib.rl.utils import DataQueue, EnvWrapper, FiniteEnvType, LogCollector, LogWriter, vectorize_env


_logger = get_module_logger(__name__)
Expand Down Expand Up @@ -59,16 +60,32 @@ def backtest(
# To save bandwidth
min_loglevel = min(lg.loglevel for lg in logger) if isinstance(logger, list) else logger.loglevel

def env_factory():
# FIXME: state_interpreter and action_interpreter are stateful (having a weakref of env),
# and could be thread unsafe.
# I'm not sure whether it's a design flaw.
# I'll rethink about this when designing the trainer.

if finite_env_type == "dummy":
# We could only experience the "threading-unsafe" problem in dummy.
state = copy.deepcopy(state_interpreter)
action = copy.deepcopy(action_interpreter)
rew = copy.deepcopy(reward)
else:
state, action, rew = state_interpreter, action_interpreter, reward

return EnvWrapper(
simulator_fn,
state,
action,
seed_iterator,
rew,
logger=LogCollector(min_loglevel=min_loglevel),
)

with DataQueue(initial_states) as seed_iterator:
vector_env = finite_env_factory(
lambda: EnvWrapper(
simulator_fn,
state_interpreter,
action_interpreter,
seed_iterator,
reward,
logger=LogCollector(min_loglevel=min_loglevel),
),
vector_env = vectorize_env(
env_factory,
finite_env_type,
concurrency,
logger,
Expand Down
17 changes: 15 additions & 2 deletions qlib/rl/utils/finite_env.py
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@
"FiniteSubprocVectorEnv",
"FiniteShmemVectorEnv",
"FiniteEnvType",
"finite_env_factory",
"vectorize_env",
]


Expand Down Expand Up @@ -292,7 +292,7 @@ class FiniteShmemVectorEnv(FiniteVectorEnv, ShmemVectorEnv):
pass


def finite_env_factory(
def vectorize_env(
env_factory: Callable[..., gym.Env],
env_type: FiniteEnvType,
concurrency: int,
Expand All @@ -312,6 +312,19 @@ def finite_env_factory(
Concurrent environment workers.
logger
Log writers.

Warnings
--------
Please do not use lambda expression here for ``env_factory`` as it may create incorrectly-shared instances.

Don't do: ::

vectorize_env(lambda: EnvWrapper(...), ...)

Please do: ::

def env_factory(): ...
vectorize_env(env_factory, ...)
"""
env_type_cls_mapping: dict[str, Type[FiniteVectorEnv]] = {
"dummy": FiniteDummyVectorEnv,
Expand Down
6 changes: 3 additions & 3 deletions tests/rl/test_logger.py
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@
from qlib.rl.utils.data_queue import DataQueue
from qlib.rl.utils.env_wrapper import InfoDict, EnvWrapper
from qlib.rl.utils.log import LogLevel, LogCollector, CsvWriter, ConsoleWriter
from qlib.rl.utils.finite_env import finite_env_factory
from qlib.rl.utils.finite_env import vectorize_env


class SimpleEnv(gym.Env[int, int]):
Expand Down Expand Up @@ -67,7 +67,7 @@ def test_simple_env_logger(caplog):
for venv_cls_name in ["dummy", "shmem", "subproc"]:
writer = ConsoleWriter()
csv_writer = CsvWriter(Path(__file__).parent / ".output")
venv = finite_env_factory(lambda: SimpleEnv(), venv_cls_name, 4, [writer, csv_writer])
venv = vectorize_env(lambda: SimpleEnv(), venv_cls_name, 4, [writer, csv_writer])
with venv.collector_guard():
collector = Collector(AnyPolicy(), venv)
collector.collect(n_episode=30)
Expand Down Expand Up @@ -142,7 +142,7 @@ def test_logger_with_env_wrapper():
# loglevel can be debug here because metrics can all dump into csv
# otherwise, csv writer might crash
csv_writer = CsvWriter(Path(__file__).parent / ".output", loglevel=LogLevel.DEBUG)
venv = finite_env_factory(env_wrapper_factory, "shmem", 4, csv_writer)
venv = vectorize_env(env_wrapper_factory, "shmem", 4, csv_writer)
with venv.collector_guard():
collector = Collector(RandomFivePolicy(), venv)
collector.collect(n_episode=INF * len(venv))
Expand Down
4 changes: 3 additions & 1 deletion tests/rl/test_saoe_simple.py
Original file line number Diff line number Diff line change
Expand Up @@ -248,7 +248,8 @@ class EmulateEnvWrapper(NamedTuple):
assert obs["position_history"][-1] == 3


def test_twap_strategy():
@pytest.mark.parametrize("finite_env_type", ["dummy", "subproc", "shmem"])
def test_twap_strategy(finite_env_type):
set_log_with_config(C.logging_config)
orders = pickle_styled.load_orders(ORDER_DIR)
assert len(orders) == 248
Expand All @@ -266,6 +267,7 @@ def test_twap_strategy():
policy,
[ConsoleWriter(total_episodes=len(orders)), csv_writer],
concurrency=4,
finite_env_type=finite_env_type,
)

metrics = pd.read_csv(Path(__file__).parent / ".output" / "result.csv")
Expand Down