shape=(len(self.config.universe), self.config.state_space))
三、回报函数
reward也比较简单,就是组合净值的增量,当然这个还可以进一步设计。
reward = new_portfolio - self.last_portfolio
四、环境状态
从跑通模型的角度,我们先取OHLCV这些数据,大部分的技术指标都是从这些数据里衍生出来的。当然,我们把经验做一些“特征工程”有助于模型收敛。
observation = self.env_data.get_data(self.calendar[self.i],self.config.universe,cols=['open','high','low','close','vol'])
print(observation)
open high low close vol
510300.SH 2.158 2.162 2.15 2.158 3.21844e+06
510500.SH 1.075 1.08 1.072 1.08 237570
某一天的数据如上,就是一个Nx5的矩阵
一个数据查询服务需要优化的点,涉及到多个市场,取指数的日期到某一支证券上查询的时候,可能会存在数据缺失,这时候需要用前一期的数据来填充这个数据点。
dataframe的reindex正好派好用场。
先把两个index取并集作为新索引,然后用这个并集的index来reindex,method=ffill,就是用前面的值来填充。
#根据benchmark填充数据
def fill_data(self,codes,index):
for code in codes:
df = self.get_df_by_code(code)
if df is not None:
new_index = list(set(df.index).union(set(index)))
new_index.sort()
df = df.reindex(new_index,method='ffill')
self.dfs_dict[code] = df
这里仍有一个todo,就是把rate也填充成了前1期的数,填充的字段rate应该等于0。
完成了这些接口之后,可以使用baseline框架提供的环境验证工具可以看下环境是否正常。
env_data = EnvQuery(all_codes, start=None)
env = MarketEnv(env_data, config)
from stable_baselines3.common.env_checker import check_env
# It will check your custom environment and output additional warnings if needed
check_env(env)
后面走通就简单了:选择一个模型,配置参数直接走1万轮。
from stable_baselines3 import A2Cmodel = A2C('MlpPolicy', env, verbose=1)
model.learn(total_timesteps=10000)
(公众号:七年实现财富自由(ailabx),用数字说基金,用基金做投资组合,践行财富自由之路)