问题描述
需要同时获取多只股票的实时行情,是否需要循环调用get_snapshot多次?
解决方案
可以同时获取多只股票的快照,不需要循环调用 get_snapshot 多次。
根据 ptrade API 文档,get_snapshot(security) 接口的 security 参数不仅支持单只股票代码(字符串),还支持多只股票代码组成的列表(list)。
为什么不建议循环调用?
在量化策略中,网络请求和接口调用通常是比较耗时的操作。如果您有一个包含 100 只股票的股票池,循环调用 100 次 get_snapshot 会极大地拖慢策略的执行速度。直接将这 100 只股票的代码作为一个列表传入 get_snapshot,底层只会进行一次批量查询,效率会高得多。
批量获取的代码示例
当您传入一个列表时,get_snapshot 会返回一个字典(dict),字典的键(key)是股票代码,值(value)是该股票对应的行情快照信息字典。
def initialize(context):
# 设置包含多只股票的股票池
g.security_list = ['600570.SS', '000001.SZ', '600000.SS']
set_universe(g.security_list)
def handle_data(context, data):
# 直接传入股票列表,一次性获取多只股票的快照
snapshots = get_snapshot(g.security_list)
# 遍历返回的字典
for stock_code in g.security_list:
# 安全地获取单只股票的快照信息,防止某些股票获取失败
stock_snapshot = snapshots.get(stock_code)
if stock_snapshot is not None:
# 获取最新价
last_price = stock_snapshot.get('last_px')
# 获取涨停价
up_limit = stock_snapshot.get('up_px')
log.info(f"股票 {stock_code} 的最新价为: {last_price}, 涨停价为: {up_limit}")
else:
log.warning(f"未能获取到股票 {stock_code} 的快照信息")
总结
为了保证策略的运行效率,当需要获取多只股票的实时行情时,请务必将股票代码组合成一个 list,然后一次性传入 get_snapshot 接口中。