问题描述
解决方案
在PTrade中,获取当日涨跌停价格的方法取决于您当前的运行环境(回测还是实盘交易)。
为了获取“最准确”的数据:
- 实盘交易:推荐使用
get_snapshot,直接获取交易所推送的实时快照数据,包含精准的up_px(涨停价) 和down_px(跌停价)。 - 回测模式:由于不支持快照函数,需使用
get_history获取日线级别的high_limit(涨停价) 和low_limit(跌停价)。
以下是详细的代码实现方案,包含了一个兼容两种模式的通用函数。
核心代码实现
def initialize(context):
# 设置股票池,以恒生电子为例
g.security = '600570.SS'
set_universe(g.security)
def handle_data(context, data):
# 调用获取涨跌停价格的函数
up_limit, down_limit = get_current_limit_price(g.security)
if up_limit and down_limit:
log.info("股票: %s, 今日涨停价: %s, 今日跌停价: %s" % (g.security, up_limit, down_limit))
else:
log.info("未能获取到 %s 的涨跌停价格" % g.security)
def get_current_limit_price(security):
"""
兼容回测和实盘的获取涨跌停价格函数
返回: (涨停价, 跌停价)
"""
# 1. 实盘交易模式 (最准确,实时快照)
if is_trade():
# 获取实时快照
snapshot = get_snapshot(security)
if snapshot and security in snapshot:
info = snapshot[security]
# up_px: 涨停价, down_px: 跌停价
return info.get('up_px'), info.get('down_px')
# 2. 回测模式 (使用历史日线数据)
else:
# 注意:涨跌停价格通常只存在于日线('1d')数据中
# 获取当天的日线数据,包含 high_limit 和 low_limit
hist = get_history(1, '1d', ['high_limit', 'low_limit'], security, fq=None, include=True)
if hist is not None and len(hist) > 0:
# 获取最后一行数据(即当天)
limit_up = hist['high_limit'][-1]
limit_down = hist['low_limit'][-1]
return limit_up, limit_down
return None, None
详细说明
1. 实盘交易 (get_snapshot)
在实盘中,get_snapshot(security) 返回的是交易所的实时行情快照。这是最准确的数据源,因为它直接反映了柜台/交易所当前的状态。
- 字段:
up_px: 涨停价格 (float)down_px: 跌停价格 (float)
- 注意:在盘前阶段(如9:15之前),快照数据可能尚未更新或为0,建议在开盘后或集合竞价阶段使用。
2. 回测模式 (get_history)
回测不支持 get_snapshot,必须通过历史行情接口获取。
- 函数:
get_history(count, frequency='1d', field=['high_limit', 'low_limit'], ...) - 关键点:
- 频率:必须使用
'1d'(日线)。分钟级别的历史数据通常不包含涨跌停字段。 - 字段:
high_limit: 涨停价low_limit: 跌停价
- include参数:建议设置
include=True以包含当前回测日的数据。
- 频率:必须使用
常见问题 Q&A
Q: 为什么在回测中不能用 get_snapshot?
A: get_snapshot 是设计用于获取实时行情的接口,回测环境是基于历史数据的模拟,系统底层不支持在回测中调用此接口。
Q: 创业板和科创板的涨跌幅限制会自动处理吗?
A: 是的。无论是 get_snapshot 还是 get_history,返回的都是交易所计算好的具体价格数值(如20%涨跌幅后的价格),您不需要自己去乘以1.1或1.2,直接使用返回的价格即可,这样能避免精度计算误差。
Q: get_price 可以用来获取涨跌停价吗?
A: 可以。get_price 与 get_history 类似,在日线频率下也支持 high_limit 和 low_limit 字段。但在策略编写中,get_history 通常用于获取截止到当前时刻的数据,使用起来更符合策略逻辑。