问题描述
解决方案
在PTrade量化交易平台中,判断一只股票当前是否处于涨停或跌停状态,主要有两种方法:一种是使用专门的交易状态查询函数 check_limit(推荐在实盘交易中使用),另一种是通过获取行情快照 get_snapshot 对比最新价与涨跌停价格(通用性更强)。
以下是具体的实现方式和代码示例。
方法一:使用 check_limit 函数(推荐实盘)
这是PTrade提供的原生接口,专门用于查询股票的涨跌停状态。它不仅能判断是否涨停,还能区分是“封死涨停”还是“触板涨停”(即价格到了涨停价但还有卖单)。
接口说明:
check_limit(security)
返回值说明(int类型):
2: 触板涨停(价格已达涨停价,但卖一档仍有挂单,未封死)1: 涨停(封死)0: 既不涨停也不跌停-1: 跌停(封死)-2: 触板跌停(价格已达跌停价,但买一档仍有挂单,未封死)
代码示例:
def initialize(context):
g.security = '600570.SS'
set_universe(g.security)
def handle_data(context, data):
# 获取涨跌停状态
# 返回的是一个字典,key是股票代码,value是状态码
limit_status_dict = check_limit(g.security)
# 容错处理,防止获取失败
if limit_status_dict:
status = limit_status_dict.get(g.security, 0)
if status == 1:
log.info("股票 %s 当前处于封死涨停状态" % g.security)
elif status == 2:
log.info("股票 %s 当前处于触板涨停状态(未封死)" % g.security)
elif status == -1:
log.info("股票 %s 当前处于封死跌停状态" % g.security)
elif status == -2:
log.info("股票 %s 当前处于触板跌停状态(未封死)" % g.security)
else:
log.info("股票 %s 当前状态正常" % g.security)
方法二:使用 get_snapshot 对比价格
通过获取行情的实时快照,直接比较“最新成交价”与“涨停价”或“跌停价”。这种方法逻辑直观,且可以在回测不支持 check_limit 的情况下作为替代方案(注意:get_snapshot 在部分回测模式下可能不可用,需根据具体环境选择)。
逻辑:
- 涨停:
last_px(最新价) >=up_px(涨停价) - 跌停:
last_px(最新价) <=down_px(跌停价)
代码示例:
def initialize(context):
g.security = '600570.SS'
set_universe(g.security)
def handle_data(context, data):
# 获取行情快照
snapshot = get_snapshot(g.security)
if snapshot and g.security in snapshot:
info = snapshot[g.security]
# 获取价格数据
last_price = info.get('last_px')
up_limit_price = info.get('up_px')
down_limit_price = info.get('down_px')
# 确保数据有效
if last_price and up_limit_price and down_limit_price:
# 判断涨停
# 注意:浮点数比较建议使用极小误差范围,但在PTrade中直接比较通常可行
if last_price >= up_limit_price:
log.info("股票 %s 价格达到涨停价: %s" % (g.security, last_price))
# 判断跌停
elif last_price <= down_limit_price:
log.info("股票 %s 价格达到跌停价: %s" % (g.security, last_price))
else:
log.info("股票 %s 价格正常: %s" % (g.security, last_price))
总结
- 实盘交易:首选
check_limit,因为它能区分“触板”和“封死”状态,对于打板策略或避险策略非常重要。 - 数据精度:PTrade后台已对价格精度做了处理,但在进行价格比较时(方法二),务必确保使用的是同一只股票的快照数据。
- 适用范围:
check_limit仅在交易模块可用。如果在研究或非tick级回测中需要判断历史涨跌停,通常使用get_history获取日线的high_limit和low_limit字段与收盘价进行对比。
Q&A
Q: check_limit 函数在回测中可以使用吗?
A: check_limit 主要设计用于交易模块(实盘或模拟盘)。在普通的回测模式下,建议通过对比价格的方式来判断,或者查阅文档确认当前回测环境是否支持该特定交易函数。
Q: 为什么 check_limit 返回的状态码有 2 和 -2?
A: 状态码 2 和 -2 代表“触板”状态。这意味着最新成交价已经达到了涨停或跌停板的价格,但在买一或卖一档位上仍有对手单,尚未形成“封单”。这对于高频交易或打板策略来说是捕捉市场强弱转换的关键信号。
Q: 如何在回测历史数据中判断某一天是否涨停?
A: 在回测历史数据时(非实时),可以使用 get_history 函数获取日线数据,其中包含 high_limit(涨停价)和 low_limit(跌停价)字段。如果当天的 close 等于 high_limit,则判定为当日收盘涨停。