如何在 PTrade 中实现开盘集合竞价追涨停策略?
本文将详细介绍如何借助 PTrade 平台的 API 功能,在 A 股市场集合竞价阶段(如 09:23 至 09:25)捕捉潜在涨停股票,并通过量化方式自动执行买入操作。该策略适用于希望在开盘前完成布局、抢占先机的投资者。
run_daily
策略核心逻辑概述
本策略聚焦于交易日早盘集合竞价末期,利用高精度行情数据判断个股是否已触及涨停价,并在价格确认后立即挂单参与成交。其主要运行机制如下:
- 运行时间设定:策略通过定时任务函数在每个交易日的 09:24 触发执行。此时处于集合竞价不可撤单阶段(09:20–09:25),系统撮合价格稳定,接近最终开盘价,具备较高参考价值。
- 行情数据获取:使用实时快照接口获取目标股票的关键行情字段,包括最新虚拟成交价与当日涨停价。
- 触发条件判断:若当前撮合价等于或非常接近涨停价,则视为满足买入条件。
- 交易执行方式:以涨停价进行限价委托下单,确保进入买一队列,提升成交概率。
- 资金分配方案:示例中采用均等资金分配法,即将账户可用现金平均分配至各候选股票;实际应用中可根据风险偏好或策略模型优化仓位配置。
get_snapshot
PTrade 策略代码实现
def initialize(context):
"""
初始化函数:设置股票池并注册每日定时任务
"""
# 定义监控和交易的股票列表(示例选用恒生电子和平安银行)
g.security_list = ['600570.SS', '000001.SZ']
set_universe(g.security_list)
# 注册每日运行函数,指定时间为 09:24
run_daily(context, aggregate_auction_trade, time='09:24')
def aggregate_auction_trade(context):
"""
集合竞价阶段的交易处理逻辑
"""
# 获取当前可用资金
cash = context.portfolio.cash
# 若无有效股票池或资金不足,则终止执行
if not g.security_list or cash <= 0:
return
# 计算每只股票可投入金额(简单均分)
cash_per_stock = cash / len(g.security_list)
# 批量拉取行情快照,提高效率
snapshots = get_snapshot(g.security_list)
for stock in g.security_list:
stock_data = snapshots.get(stock)
if not stock_data:
continue
# 提取关键字段
current_price = stock_data.get('last_px') # 最新撮合价
limit_up_price = stock_data.get('up_px') # 涨停价
status = stock_data.get('trade_status') # 交易状态
# 数据完整性校验
if current_price is None or limit_up_price is None:
continue
# 排除停牌或非正常交易状态的股票
if status in ['HALT', 'SUSP', 'STOPT']:
log.info("股票 %s 当前不可交易,已跳过" % stock)
continue
# —— 核心策略判断 ——
# 判断当前价格是否达到或超过涨停价(考虑浮点误差)
if float(current_price) >= float(limit_up_price):
log.info("股票 %s 在集合竞价中触及涨停,准备买入。当前价: %s, 涨停价: %s" % (stock, current_price, limit_up_price))
# 发起买入指令,按金额下单,指定限价为涨停价
order_id = order_value(stock, cash_per_stock, limit_price=limit_up_price)
if order_id:
log.info("股票 %s 下单成功,订单ID: %s" % (stock, order_id))
else:
log.error("股票 %s 下单失败" % stock)
def handle_data(context, data):
"""
盘中持续运行函数(本策略主要依赖集合竞价时点,此函数可留空)
可用于后续扩展止盈止损或其他日内逻辑
"""
pass
注意事项与回测说明
在实盘部署或历史回测过程中需注意以下几点:
- 集合竞价期间的行情快照频率和数据准确性可能受平台限制,真实撮合结果以交易所公布为准。
- 回测环境通常无法完全还原集合竞价的真实撮合机制,因此回测表现可能存在偏差,建议结合模拟盘验证。
- 由于涨停板上委托量巨大,即使按时下单也未必能保证成交,尤其对于大资金账户应谨慎评估冲击成本。
- 代码中使用的
get_snapshot接口需确保在目标时间段内支持调用,且返回字段包含last_px和up_px。
last_px
策略在满足条件时会输出日志信息,便于跟踪执行过程。例如当某只股票价格触及涨停,系统将记录相关信息并尝试下单。
up_px该策略主要适用于实盘或仿真交易环境,因为在普通的回测模式下,函数可能无法获取到精确的集合竞价tick数据,具体取决于所使用回测数据的精度。
风险提示:追涨停是一种高风险操作方式。在集合竞价阶段以涨停价挂单买入,若开盘后出现炸板(即涨停被打开),可能导致当日出现较大亏损,请谨慎使用。
API调用说明:代码中采用了
get_snapshot的方式获取盘口实时信息,包括涨跌停价格和当前交易状态等,这是目前获取此类数据最为高效的方法之一。
Python版本兼容性:本代码已适配 Python 3.5 的语法标准,未使用如 f-string 等高版本特性,确保在较早版本环境中也可正常运行。
get_snapshot在回测中的准确性如何?在 PTrade 的回测环境下,对
get_snapshot的支持较为有限,通常只能获取当日的开盘价、收盘价等静态字段,无法还原真实的逐笔竞价过程。因此,此策略的设计初衷是面向实盘场景。
为何选择在 09:24 执行而非 09:15 或 09:30?
09:15 至 09:20 为可撤单时段,市场中存在较多虚假申报行为,价格波动剧烈;而 09:20 至 09:25 为不可撤单阶段,此时的撮合结果更接近真实开盘价。选择在 09:24 下单,可以在最终撮合前完成委托,从而尽早进入排队序列,提升成交优先级。
如何防止买入处于停牌状态的股票?
代码中已加入
trade_status的状态判断逻辑。当股票处于HALT(暂停交易)或SUSP(停盘)状态时,系统将自动跳过该标的,避免产生无效订单或引发异常。

雷达卡


京公网安备 11010802022788号







