问题描述
get_individual_entrust接口单次最多返回200条数据,多股票查询时需分批次调用。
解决方案
在 Ptrade 量化交易平台中,获取 Level 2 逐笔委托数据是高频和微观结构策略的核心。然而,get_individual_entrust 接口存在单次调用返回数据条数的限制(最大200条)。当策略需要监控庞大的股票池时,必须采用分批次调用的方案。
一、 接口限制解析
根据 Ptrade API 文档,get_individual_entrust 的参数 data_count 默认值为 50,最大允许值为 200。
如果直接传入包含数百只股票的列表,接口可能无法返回完整的盘口委托信息,甚至导致请求超时或截断。
二、 多股票分批查询解决方案
为了稳定、高效地获取多只股票的逐笔委托数据,我们可以将股票池(Universe)切分为多个小批次(Chunk),通过循环遍历的方式进行请求。
Python 实现源码
以下是一个在 handle_data 或 tick_data 中实现分批查询的示例代码:
def initialize(context):
# 设置一个较大的股票池
g.security = ['600570.SS', '000001.SZ', '000002.SZ', '000032.SZ', '600000.SS', '600036.SS']
set_universe(g.security)
# 定义每批次查询的股票数量
g.batch_size = 2
def handle_data(context, data):
all_entrust_data = {}
# 将股票池按 batch_size 切分为多个批次
for i in range(0, len(g.security), g.batch_size):
batch_stocks = g.security[i : i + g.batch_size]
# 建议开启 is_dict=True 以大幅提升数据解析速度
batch_entrust = get_individual_entrust(
stocks=batch_stocks,
data_count=200,
is_dict=True
)
if batch_entrust:
# 将分批获取的数据合并到总字典中
# 注意:返回的字典中包含 'fields' 键,合并时需注意处理或直接 update
for k, v in batch_entrust.items():
if k != 'fields':
all_entrust_data[k] = v
# 打印合并后的逐笔委托数据
log.info("成功获取 %d 只股票的逐笔委托数据" % len(all_entrust_data))
# 示例:处理某只股票的委托量
if "600570.SS" in all_entrust_data:
# 字典格式返回的数据结构:{股票代码: [[时间戳, 价格, 委托数量, 委托编号, 委托方向, 委托类型], ...]}
entrust_list = all_entrust_data["600570.SS"]
if len(entrust_list) > 0:
latest_entrust_amount = entrust_list[-1][2] # 获取最新一笔的委托数量
log.info("恒生电子最新一笔委托量: %s" % latest_entrust_amount)
三、 性能优化与注意事项
- 开启字典格式返回 (
is_dict=True):
官方文档明确指出,当入参is_dict=True时,返回dict类型数据的速度比默认的DataFrame或Panel类型有大幅提升。在处理高频逐笔数据时,强烈建议开启此选项。 - Level 2 行情权限:
逐笔委托(get_individual_entrust)和逐笔成交(get_individual_transaction)均需要券商端开通 Level 2 行情权限,否则接口将返回None。 - 控制调用频率:
虽然分批可以解决单次条数限制,但在tick_data(每3秒触发) 中循环调用时,需注意整体耗时不能超过 Tick 间隔,以免造成策略阻塞。建议根据实际算力合理设置batch_size。