sunnyswag / StockRL

在A股(股票)市场上训练强化学习交易智能体
GNU General Public License v3.0
190 stars 81 forks source link

回测数据发生“时间穿越” #6

Closed zlxwl closed 5 months ago

zlxwl commented 2 years ago

看了你的训练集合(2009-2019)和验证集合(2019-2021)。 强化学习在训练的时候部分使用了验证集合,这是由于强化学习本身的性质决定的。实际能取得100%+的年化收益是发生了“时间穿越”。 我用20210101-20211031范围内的真正测试集合,跑出来收益数据为负。所以用验证集合来跑回测没有意义。

sunnyswag commented 2 years ago

1、 不太清楚你说的 强化学习在训练的时候部分使用了验证集合 是什么意思,这个 repo 的 训练数据验证数据 使用的是不相同的数据集 2、交易有赚有亏本来就是正常的现象,具体的你得和 β 收益进行比较,同时还得考虑 Omega比率、Sharpe比率,得出这个模型的稳定性以及持续获利的能力。收益率只是衡量这个模型好坏的一个方面

Zero1366166516 commented 2 years ago

我刚开始的时候用2011-2020年10只股票跑的训练,2021测试的确是负的。 但是,当我加到100只股票的时候就变成105%了,应该跟股票池有关。另外,我刚刚做了一个数据整理降噪,看看能不能提高回报率。

zlxwl commented 1 year ago
    env_train, env_trade = self.get_env(train_data, trade_data)

    agent = DRL_Agent(env=env_train)

    model = agent.get_model(self.model_name,
                            model_kwargs=config.__dict__["{}_PARAMS".format(self.model_name.upper())],
                            verbose=0)

    model.learn(total_timesteps=self.total_timesteps,
                eval_env=env_trade,
                eval_freq=500,
                log_interval=1,
                tb_log_name='env_cashpenalty_highlr',
                n_eval_episodes=1)

注意看你在learn的时候使用了“验证数据” 即env_trade中的数据作为agent权重调整的"方向". 我的理解是: 实际应该是有三个数据集 a, b, c. 你现在用的是 (a+b)和 c 做训练,用c 做评估。实际应该使用a和b做训练,c做评估

sunnyswag commented 5 months ago

参数是 eval_env,具体的可以自己再去瞅瞅,是验证环境,不是训练环境