问题描述
现在还不知道具体原因是什么, 但是应该不只我一个人碰到这个问题。感觉像是获取数据失败。希望聚宽的的技术人员能够尽快查清楚原因,并解释一下。不然以后都不敢用实盘了。
而且实盘的暂停功能也没有效果。我发现实盘有问题之后,立即就暂停了实盘策略,过了3分钟左右还是把我所有持有的股票全部清仓了。暂停的意思不应该是什么操作都不做了吗?难道是我理解错了。
解决方案
针对您在 JoinQuant 聚宽平台上遇到的模拟盘运行失败以及策略暂停后仍然发生交易的问题,根据官方 API 文档的说明,我们可以从以下几个方面进行排查和理解:
一、 关于“实盘”的特别说明
首先需要澄清的是,根据聚宽官方文档的最新说明:“聚宽目前没有提供任何形式的实盘及交易通道服务。一创聚宽已于2023-12-29停止维护。”
如果您使用的是早期的实盘通道或通过第三方工具进行的实盘绑定,其稳定性可能无法得到官方保障。以下排查主要针对模拟盘的运行机制。
二、 模拟盘运行失败的常见原因排查
如果您的模拟盘突然全部运行失败,通常与以下几个系统限制或代码逻辑有关,建议您查看策略的**运行日志(Log)**来精准定位:
- 资源占用超限被系统强杀:
- 内存超限:进程占用内存不能超过 3G。
- 超时:每个函数(如
handle_data或before_trading_start)运行时间不能超过 1800 秒。 - 序列化超限:模拟盘每天结束时会保存状态(序列化
g对象等),序列化之后的状态大小不能超过 30M。如果保存了大量不可序列化的对象(如数据库连接)或超大 DataFrame,会导致保存失败。
- 下单时间点不合理:
- 文档指出:“模拟盘中因尽量避免在距离开盘时间较早的时间点进行下单, 比如9点以前对股票下单,可能导致当时还没有拿到涨跌停价而产生比较异常的委托甚至委托失败。”
- 数据获取异常:
- 如果在非交易时段或集合竞价未完成时获取某些特定数据,可能会返回空值或引发异常。此外,官方偶尔的网络波动也可能导致短暂的数据获取失败,通常会在日志中抛出异常。
三、 为什么“暂停策略”后仍然发生了清仓交易?
这是许多量化交易者容易产生的误解。您提到“暂停了策略,过了3分钟左右还是把我所有持有的股票全部清仓了”,这其实是符合交易系统底层逻辑的。
-
“暂停策略”到底暂停了什么?
在聚宽中,暂停模拟交易意味着停止触发后续的策略事件。也就是说,系统不再定时调用您的handle_data、run_daily等函数,策略代码停止运行。 -
为什么还会成交?(订单撮合的独立性)
当您的策略代码执行了下单指令(例如order_target(security, 0)清仓指令)后,订单就已经被创建并发送到了撮合引擎。订单的处理流程是:订单创建 -> 订单检查 -> 报单 -> 确认委托 -> 撮合。- 暂停策略并不会自动撤销已经发送到撮合引擎的未完成订单(Open Orders)。
- 即使策略代码被暂停,撮合引擎依然在独立运行。只要市场行情达到了您订单的成交条件,撮合引擎就会执行成交。
- 您观察到的“过了3分钟清仓”,很可能是因为在您点击暂停之前,清仓的市价单或限价单就已经发出了,只是由于盘口流动性、滑点或分钟 Bar 撮合机制,花了3分钟才完全撮合成交。
四、 应对建议
- 查看日志:立即查看模拟盘的错误日志,寻找是否有
TimeoutError、MemoryError或FutureDataError等明确报错。 - 紧急撤单机制:如果您发现策略逻辑出错正在乱下单,单纯“暂停策略”是不够的。您需要确保已经发出的订单被撤销。在实盘或高级模拟中,通常需要手动登录交易终端撤销未成交的挂单,或者在策略中编写紧急熔断机制(如检测到异常连续调用
batch_cancel_orders(get_open_orders().values()))。 - 优化全局变量
g:检查是否在g中缓存了过大的历史数据,导致模拟盘休眠保存状态时崩溃。