问题描述
使用get_individual_transaction获取逐笔成交数据时,设置data_count=500返回的数据很少,为什么?
解决方案
根据 ptrade API 文档的规定,使用 get_individual_transaction 接口获取逐笔成交数据时,最多只能获取 200 条数据。
为什么设置 data_count=500 返回的数据很少?
在接口参数说明中,data_count(数据条数)的默认值为 50,最大限制为 200。当您在代码中设置 data_count=500 时,由于超过了底层接口允许的最大上限,系统通常会进行强制截断,或者按照默认/最大允许值返回,甚至可能导致底层查询异常,从而出现返回数据很少或不符合预期的情况。
正确获取大量逐笔数据的方法
如果您需要获取超过 200 条的逐笔成交数据,不能单次将 data_count 设置得很大,而应该利用分页机制。结合 start_pos(起始位置)和 search_direction(搜索方向)参数,通过循环多次请求来拼接数据。
参数说明:
data_count: 每次请求的数据条数,建议设置为最大值200。start_pos: 起始位置,默认为0。每次请求后,将其增加已获取的条数。search_direction: 搜索方向,1为向前(从最新到最旧),2为向后(从旧到新)。
示例代码:
def handle_data(context, data):
# 假设我们要获取 000001.SZ 的最近 400 条逐笔成交数据
security = '000001.SZ'
all_transactions = []
# 第一次请求,获取最新的 200 条
trans_part1 = get_individual_transaction([security], data_count=200, start_pos=0, is_dict=True)
if trans_part1 and security in trans_part1:
all_transactions.extend(trans_part1[security])
# 第二次请求,从第 200 条开始,再获取 200 条
trans_part2 = get_individual_transaction([security], data_count=200, start_pos=200, is_dict=True)
if trans_part2 and security in trans_part2:
all_transactions.extend(trans_part2[security])
log.info("共获取到逐笔成交数据条数:%s" % len(all_transactions))
注意事项:
- 逐笔数据需要开通 Level2 行情权限才能获取。
- 建议将
is_dict设置为True,返回字典类型数据的速度比 DataFrame/Panel 有大幅提升,特别是在处理大量数据时。