最近使用VeighNa做多品种大周期的强化学习机器人程序,发现如下问题:
1 如果使用sqllite本地库,很容易出现K线数据的混乱,特别是数据乱序下载插入的情况下,表现为哪怕单机读取K线图也会出现不明跳变,严重影响训练效果,因此换用了postgresql,这个问题解决
2 VeighNa3.1版本中的postgresql读写部分,有部分代码没有用批量方式,因此写入大量K线数据很缓慢,如下地方修改就好了
要在peewee导入这里,加入chunked
from peewee import (
AutoField,
chunked,
CharField,
DateTimeField,
FloatField, IntegerField,
Model,
PostgresqlDatabase as PeeweePostgresqlDatabase,
ModelSelect,
ModelDelete,
fn
)
在save_bar_data函数中的单条插入,改为批量,遇到索引冲突重复写入的时候,不能用类似在mysql的那种 on_conflict_replace 的简单方式,需要写明update字典,并使用chunked批量方式
with self.db.atomic():
for c in chunked(data, 50):
DbBarData.insert_many(c).on_conflict(
update={DbBarData.volume: DbBarData.volume,
DbBarData.turnover: DbBarData.turnover,
DbBarData.open_interest: DbBarData.open_interest,
DbBarData.open_price: DbBarData.open_price,
DbBarData.high_price: DbBarData.high_price,
DbBarData.low_price: DbBarData.low_price,
DbBarData.close_price: DbBarData.close_price
},
conflict_target=(
DbBarData.symbol,
DbBarData.exchange,
DbBarData.interval,
DbBarData.datetime,
),
).execute()
这样修改后,在多机上批量数据读写训练,不担心重复下载插入,postgresql本身也非常快。
谢谢VeighNa作者提供了非常方便于DIY的框架。