mapicccy / funcat

Using very simple code to compute indicator of stock\crytocurrency. For example, MA(C, 5) means average closed-price for last 5 days.
Apache License 2.0
29 stars 14 forks source link

tushare_backend本地化存储在获取历史K线行情存在数据丢失的bug #4

Open mapicccy opened 2 years ago

mapicccy commented 2 years ago

背景: tushare pro有很多访问次数限制,为了绕过限制当前采取了本地化存储的方式。并且tushare pro没办法盘中获取当天的行情(大概下午4点钟才会刷新),所以通过tencent api获取实时行情,堆叠在Dataframe上。实时行情不做持久化处理。

问题: 由于实时行情不做持久化处理,为了在下一天(包括非交易日)强制更新本地持久化数据,持久化数据的文件名通过today (%Y%m%d)来索引。问题的引入就是由于today的索引,回溯历史数据的时候,本地的持久化文件名称包含current day但是数据本身是上一个trading_date(不等于current day),如果current day是交易日,则获取current day的行情数据时会拿到上一个交易日的数据。

解决办法: 删除工作目录用于存放持久化数据的data文件夹,这只是一个workaround。

mapicccy commented 2 years ago

这个问题目前没有想到很好的处理办法,如果修改持久化的逻辑可能会引入其他的问题。所以为了repo相对稳定,当前仅提供workaround。

mapicccy commented 2 years ago

commit 4faa857724b3 (tushare: A mitigation for data corrupt) 针对当前问题提供了一个缓解措施。 在策略选股或者回测历史数据时,如果本地存在当天的持久化交易数据(工作目录存在data/文件夹),则交易数据是历史上的那一天最后一次get_price时获取的数据。如果“最后一次”发生在盘后,则数据是正确的;如果发生在盘中,则数据非当天的收盘结果。

这样修改是合理的。 tushare不能提供实时数据、tushare有非常严格的次数限制、从tencent获取实时数据拼接,这三个方面决定了当前的方案