问题描述
解决方案
在 ptrade 量化交易平台中,get_snapshot 接口是完全支持获取 ETF 实时行情快照的。如果您在使用时遇到报错,通常是由以下几个常见原因引起的。请对照检查您的代码:
常见报错原因及排查方法
1. 运行环境不支持(最常见)
根据 ptrade API 文档,get_snapshot 函数仅在交易模块可用。如果您在回测模块中调用该函数,系统会直接报错。在回测中,您应该使用 get_price 或 get_history 来获取历史 K 线数据,或者通过 data[security]['close'] 获取当前周期的价格。
2. ETF 代码缺少市场后缀
ptrade 中的标的代码必须包含市场后缀。对于 ETF,上海市场后缀为 .SS,深圳市场后缀为 .SZ。如果直接传入纯数字代码(如 '510050'),会提示找不到标的或报错。
- 错误写法:
get_snapshot('510050') - 正确写法:
get_snapshot('510050.SS')
3. 参数数据类型错误
get_snapshot 的入参 security 必须是单只股票/ETF代码的字符串,或者是多只代码组成的列表 (list)。
4. 盘前调用数据为空
虽然不会直接导致程序崩溃报错,但需要注意:如果在盘前阶段(如 before_trading_start 函数中)调用 get_snapshot,返回的数据字典中大部分字段(如成交量、当前价格等)可能为 0。
正确的获取 ETF 快照代码示例
以下是一个在交易模块中正确获取 ETF 实时快照的完整示例:
def initialize(context):
# 设置要操作的 ETF 代码,注意必须带后缀
g.etf_code = '510050.SS'
set_universe(g.etf_code)
def handle_data(context, data):
# 仅在交易环境中调用 get_snapshot
if is_trade():
try:
# 获取 ETF 行情快照
snapshot = get_snapshot(g.etf_code)
# 检查是否成功获取到数据
if snapshot and g.etf_code in snapshot:
etf_data = snapshot[g.etf_code]
last_price = etf_data.get('last_px', 0) # 最新成交价
buy_one = etf_data.get('bid_grp', {}).get(1, [0])[0] # 买一价
log.info(f"ETF {g.etf_code} 最新价: {last_price}, 买一价: {buy_one}")
else:
log.warning(f"未能获取到 {g.etf_code} 的快照数据")
except Exception as e:
log.error(f"获取快照发生异常: {e}")
else:
# 回测环境下的替代方案
current_price = data[g.etf_code]['close']
log.info(f"回测环境当前价格: {current_price}")
总结建议
- 确认您当前是在实盘/模拟盘交易环境下运行策略,而不是回测环境。
- 检查传入的 ETF 代码是否为
'510050.SS'或'159915.SZ'这种带后缀的标准格式。 - 建议在调用时加上
try...except异常处理,防止因偶尔的网络或行情源波动导致策略意外终止。