数据层¶
在数据层,我们使用统一的数据处理器来访问数据、清洗数据和提取特征。
数据访问¶
我们连接不同平台的数据API,并使用FinRL-Meta数据处理器统一它们。用户可以访问来自各种来源的数据,给定开始日期、结束日期、股票列表、时间间隔和kwargs。
数据清理¶
从不同数据源检索的原始数据通常具有各种格式,并且在不同程度上存在错误或NaN数据(缺失数据),这使得数据清理非常耗时。在FinRL-Meta中,我们自动化了数据清理过程。
NaN数据的清理过程通常因时间频率的不同而有所差异。对于低频数据,除了少数流动性极低的股票外,少量的NaN值通常意味着在该时间段内股票停牌。而对于高频数据,NaN值则普遍存在,通常意味着在该时间段内没有交易。为了减少模拟与现实的差距并考虑数据效率,我们为这两种情况提供了不同的解决方案。
在低频情况下,我们直接删除包含NaN值的行,这反映了模拟交易环境中的暂停。然而,在高频情况下,直接删除包含NaN值的行并不合适。
在我们从Alpaca下载2021年1月1日至2021年5月31日期间DJIA 30公司的1分钟OHLCV数据的测试中,原始数据有39736行。然而,在删除包含NaN值的行后,只剩下3361行。
丢弃方法的低数据效率是不可接受的。相反,我们采用了一种改进的前向填充方法。我们用最后一个有效的收盘价填充开盘价、最高价、最低价和收盘价列,并用0填充成交量列,这是实践中的标准方法。
尽管这种填充方法牺牲了模拟环境的真实性,但与显著提高的数据效率相比,这是可以接受的,特别是在高流动性的股票代码下。此外,这种填充方法可以通过使用买入价和卖出价来进一步改进,以减少模拟与现实的差距。
特征工程¶
特征工程是数据层的最后一部分。我们通过在数据处理器中连接Stockstats或TAlib库来自动化计算技术指标。支持常见的技术指标,包括移动平均收敛散度(MACD)、相对强弱指数(RSI)、平均方向指数(ADX)和商品通道指数(CCI)等。用户还可以快速添加来自其他库的指标,或直接添加用户自定义的特征。
用户可以通过两种方式添加他们的特征:1)直接编写用户定义的特征提取函数。返回的特征将被添加到特征数组中。2)将特征存储在文件中,并将其移动到指定的文件夹中。然后,这些特征将通过从指定文件中读取来获取。