tushare 按照查询参数的不同,一般可以分为按时间轮询和按股票轮询的方式。为了尽可能减少请求次数、缩短请求时间、减轻 tushare 服务器查询压力,我们可以按照这两种方式对数据进行初始化和更新。

按时间轮询

按时间轮询主要用于刚建立数据库后,批量下载历史数据的情况,以及每日的更新。按时间轮询的前提,需要先调用 交易日历 接口,将交易日历数据保存在本地。假设已经将数据保存在本地,再进行以下步骤。

以更新 日线行情 为例,当提供trade_date参数而不指定ts_code参数时,会将trade_date日的所有股票日线全部获取。单次请求条数限制为 5000 条,对单日内数据获取绰绰有余。

我们根据获取的交易日历,轮询需要的时间范围的所有开市日,将其循环传给trade_date参数,按日获取当日的所有股票日线,存入数据库中即可。

按股票轮询

当需要更新的股票属于个别大范围缺失日线行情的股票时,或需要初始化个股分钟数据时,可以采用该方式对股票行情进行更新。

日线

当行情接口提供了ts_codestart_dateend_date以后,则可以查询单支股票在指定交易日范围内的所有行情。

按范围轮询的前提是已经将交易日历数据和 股票列表 保存在本地,而后获取当前股票的上市日期list_date和退市日期delist_date,作为start_dateend_date。若delist_date为 null 则说明该股票还未退市,end_date取最新一个交易日。

得到初始的start_dateend_date以后,需要计算两者之间交易日个数。因为日线行情接口单次请求条数为 5000 条,若范围内交易日个数大于 5000 的,需要进行交易日范围的切割,进行单次请求后,再将请求参数调整至下一个 5000 条范围,直至更新到end_date为止。

分钟线

tushare 高级版提供了分钟线接口(参考 通用行情接口分钟权限说明 )。当调用分钟线数据时,上述的按股票轮询方式要进行一定的修改。

沪深 A 股分钟线请求限制为单次 8000 条数据,对于可能的freq为 1、5、15、30、60分钟,单股单日内最大数据量分别为max = 240/freq + 1,则切割范围时,需要保证指定范围内的条数小于 8000 条,并将end_date向下取整。

如对于freq为 1 分钟的情况,8000 / 241 ≈ 33.195,向下取整即为 33 个交易日,即单股单次 1 分钟行情最大可请求 33 个交易日,而非上文日线数据中的 5000 个交易日。再按照上文的逻辑进行轮询即可。

其他

呃,没有考虑到每次查询时has_more字段(见 返回结构 ),因为按照目前上面提到的方式,已经确保了每次请求的数据总量不会超过单次请求的最大数据量,所以has_more应该不会为true,除非哪天 A 股上市超过 5000 家了,不过到时候 tushare 接口的单次请求权限应该也会超过 5000 吧(逃)。