快速开始
QlibRL提供了一个单资产订单执行任务的实现示例,以下是使用QlibRL进行训练的配置文件示例。
simulator:
# 每个步骤包含30分钟
time_per_step: 30
# 交易量的上限,应为null或者0到1之间的浮点数,如果是浮点数,表示上限以市场交易量的百分比计算
vol_limit: null
env:
# 并发环境的工作者数量。
concurrency: 1
# dummy或subproc或shmem。对应于tianshou中的`parallelism <https://tianshou.readthedocs.io/en/master/api/tianshou.env.html#vectorenv>`_。
parallel_mode: dummy
action_interpreter:
class: CategoricalActionInterpreter
kwargs:
# 候选操作,可以是一个长度为L的列表:[a_1, a_2,..., a_L],也可以是一个整数n,此时会自动生成长度为n+1的列表,即[0, 1/n, 2/n,..., n/n]。
values: 14
# 总步数(上限估计)
max_step: 8
module_path: qlib.rl.order_execution.interpreter
state_interpreter:
class: FullHistoryStateInterpreter
kwargs:
# 数据的维度数。
data_dim: 6
# 数据的总记录数。例如,在每分钟的单资产订单执行中,data_ticks是一天的分钟数。
data_ticks: 240
# 总步数(上限估计)。例如,390分钟 / 30分钟每步 = 13步。
max_step: 8
# 经过处理的数据的提供者。
processed_data_provider:
class: PickleProcessedDataProvider
module_path: qlib.rl.data.pickle_styled
kwargs:
data_dir: ./data/pickle_dataframe/feature
module_path: qlib.rl.order_execution.interpreter
reward:
class: PAPenaltyReward
kwargs:
# 在短时间内大量交易的惩罚。
penalty: 100.0
module_path: qlib.rl.order_execution.reward
data:
source:
order_dir: ./data/training_order_split
data_dir: ./data/pickle_dataframe/backtest
# 时间索引的数量
total_time: 240
# 起始时间索引
default_start_time: 0
# 结束时间索引
default_end_time: 240
proc_data_dim: 6
num_workers: 0
queue_size: 20
network:
class: Recurrent
module_path: qlib.rl.order_execution.network
policy:
class: PPO
kwargs:
lr: 0.0001
module_path: qlib.rl.order_execution.policy
runtime:
seed: 42
use_cuda: false
trainer:
max_epoch: 2
# 每次训练迭代收集的剧集数
repeat_per_collect: 5
earlystop_patience: 2
# 每次训练时收集的剧集数。
episode_per_collect: 20
batch_size: 16
# 每隔n个迭代执行一次验证
val_every_n_epoch: 1
checkpoint_path: ./checkpoints
checkpoint_every_n_iters: 1
还有用于回测的配置文件:
order_file: ./data/backtest_orders.csv
start_time: "9:45"
end_time: "14:44"
qlib:
provider_uri_1min: ./data/bin
feature_root_dir: ./data/pickle
# 由今天信息生成的特征
feature_columns_today: [
"$open", "$high", "$low", "$close", "$vwap", "$volume",
]
# 由昨天信息生成的特征
feature_columns_yesterday: [
"$open_v1", "$high_v1", "$low_v1", "$close_v1", "$vwap_v1", "$volume_v1",
]
exchange:
# 买入和卖出股票限制的表达式
limit_threshold: ['$close == 0', '$close == 0']
# 买入和卖出的交易价格
deal_price: ["If($close == 0, $vwap, $close)", "If($close == 0, $vwap, $close)"]
volume_threshold:
# 买入和卖出的交易量限制,"cum"表示这是一个累积值
all: ["cum", "0.2 * DayCumsum($volume, '9:45', '14:44')"]
# 买入的交易量限制
buy: ["current", "$close"]
# 卖出的交易量限制,"current"表示这是实时值,不会随时间累积
sell: ["current", "$close"]
strategies:
30min:
class: TWAPStrategy
module_path: qlib.contrib.strategy.rule_strategy
kwargs: {}
1day:
class: SAOEIntStrategy
module_path: qlib.rl.order_execution.strategy
kwargs:
state_interpreter:
class: FullHistoryStateInterpreter
module_path: qlib.rl.order_execution.interpreter
kwargs:
max_step: 8
data_ticks: 240
data_dim: 6
processed_data_provider:
class: PickleProcessedDataProvider
module_path: qlib.rl.data.pickle_styled
kwargs:
data_dir: ./data/pickle_dataframe/feature
action_interpreter:
class: CategoricalActionInterpreter
module_path: qlib.rl.order_execution.interpreter
kwargs:
values: 14
max_step: 8
network:
class: Recurrent
module_path: qlib.rl.order_execution.network
kwargs: {}
policy:
class: PPO
module_path: qlib.rl.order_execution.policy
kwargs:
lr: 1.0e-4
# 最新模型的本地路径。模型是在训练过程中生成的,所以如果要使用训练过的策略进行回测,请先运行训练。您也可以删除此参数,并使用随机初始化的策略进行回测。
weight_file: ./checkpoints/latest.pth
# 并发环境的工作者数量。
concurrency: 5
使用上述配置文件,您可以通过以下命令开始训练代理程序:
$ python -m qlib.rl.contrib.train_onpolicy.py --config_path train_config.yml
训练完成后,您可以使用以下命令进行回测:
$ python -m qlib.rl.contrib.backtest.py --config_path backtest_config.yml
在这种情况下,SingleAssetOrderExecution
和 SingleAssetOrderExecutionSimple
是模拟器的示例,qlib.rl.order_execution.interpreter.FullHistoryStateInterpreter
和 qlib.rl.order_execution.interpreter.CategoricalActionInterpreter
是解释器的示例,qlib.rl.order_execution.policy.PPO
是策略的示例,以及 qlib.rl.order_execution.reward.PAPenaltyReward
是奖励的示例。
对于单资产订单执行任务,如果开发者已经定义了他们的模拟器/解释器/奖励函数/策略,他们可以通过简单修改配置文件中相应的设置来启动训练和回测流程。
有关示例的详细信息可以在 这里 找到。
在未来,我们将提供更多不同场景的示例,例如基于强化学习的投资组合构建。