问题描述
使用get_individual_transaction获取逐笔成交数据时,返回的数据为空,是代码有问题吗?
解决方案
在使用 ptrade 量化平台调用 get_individual_transaction 接口获取逐笔成交数据时,如果返回空数据(如 None 或空字典/DataFrame),通常是由以下几个原因导致的。请按照以下步骤进行排查:
1. 核心原因:未开通 Level2 行情权限(最常见)
根据 ptrade API 文档的明确说明:逐笔委托、逐笔成交数据需开通 Level2 行情才能获取到数据,否则无数据返回。
- 解决方法:请联系您的券商客户经理,确认您的交易账户是否已经开通了 Level2 行情权限。如果没有开通,该接口将无法获取到任何逐笔数据。
2. 股票代码未在股票池中或参数错误
- 如果您没有通过
stocks参数显式传入股票代码,接口默认会获取当前股票池中的代码列表。 - 如果您在
initialize中没有使用set_universe设置股票池,或者传入的stocks列表为空/代码格式错误(如缺少.SS或.SZ后缀),也会导致获取不到数据。 - 解决方法:检查代码格式,确保股票池已正确设置。
3. 非交易时间或该股票当天无成交
- 逐笔成交数据是当日的实时数据。如果您在盘前(如 9:30 之前)调用该接口,或者该股票当天停牌、一字跌停/涨停导致没有任何成交记录,接口也会返回空数据。
- 解决方法:确保在盘中交易时间(9:30-15:00)调用,并确认标的处于正常交易状态。
4. 数据量过大导致获取失败(建议使用 dict 格式)
- 如果您一次性获取大量股票的逐笔数据,可能会因为数据量过大导致处理超时或返回异常。
- 优化建议:官方文档强烈建议,在获取逐笔数据时,将
is_dict参数设置为True。返回dict类型数据的速度比返回DataFrame或Panel类型数据有大幅提升,且能有效避免因股票数量过多(>200只)导致的返回None的问题。
正确的代码调用示例
def initialize(context):
# 设置正确的股票代码后缀
g.security = "000001.SZ"
set_universe(g.security)
def before_trading_start(context, data):
g.flag = False
def handle_data(context, data):
if not g.flag:
# 强烈建议:使用 is_dict=True 提升获取速度并防止数据丢失
transaction = get_individual_transaction([g.security], is_dict=True)
if transaction is not None and g.security in transaction:
log.info("成功获取逐笔成交数据:%s" % transaction[g.security][:2]) # 打印前两条
else:
log.warning("未获取到逐笔成交数据,请检查 Level2 权限或标的状态。")
g.flag = True
总结:遇到 get_individual_transaction 返回空数据,第一步永远是向券商确认 Level2 行情权限是否开通。确认权限无误后,再检查代码逻辑、时间段以及是否使用了 is_dict=True 来优化性能。