3 分钟快速生成代码
输入想法,AI 即刻生成可运行代码
你好!这是一个非常好的问题,涉及到量化回测与真实市场交易规则的差异。针对你的疑惑,我们从API默认行为、限价单的意义以及科创板保护价的背景三个方面来详细解答。
首先,需要澄清一个常见的误解:在聚宽中,order 函数默认就是市价单,并非必须使用限价单。
根据 API 文档:
order(security, amount, style=None, side='long', pindex=0, close_today=False)
当 style=None 时,系统默认使用的是 市价单(MarketOrder)。也就是说,对于绝大多数主板股票,你只需要写 order('000001.XSHE', 100),系统就会以当前市场的最优价格(最新价+滑点)进行撮合成交,完全不需要去动态计算涨跌停价并设置 LimitOrderStyle。
如果你在回测时发现“必须设置 LimitOrderStyle 才能跑起来”,那很可能是因为你交易了**科创板(688开头)或创业板(300开头,注册制后)**的股票,并且没有正确理解“保护限价”的规则。
虽然很多初学者在回测时喜欢用市价单(因为一定能成交,代码简单),但在真实的量化交易中,限价单(Limit Order)是必不可少的,原因如下:
你提到的“科创板保护价逻辑”,其实不是聚宽平台故意刁难用户,而是上海证券交易所的硬性交易规则。
order('688001.XSHG', 100, MarketOrderStyle(10))。如果你不传保护价,实盘中这笔订单会被券商直接拒单,为了防止回测与实盘产生巨大差异,回测引擎也会要求你遵守这一规则。如果你只是想做一个简单的趋势策略,希望“不管什么价格,只要能买到就行”,你可以这样写代码来兼容主板和科创板:
def buy_stock(context, security, amount):
# 获取当前数据
current_data = get_current_data()
# 判断是否是科创板或创业板(简单以代码前缀区分)
if security.startswith('688') or security.startswith('300'):
# 获取当天的涨停价作为保护价,确保市价单能以最高容忍度成交
high_limit = current_data[security].high_limit
order(security, amount, MarketOrderStyle(high_limit))
else:
# 主板股票,直接下市价单
order(security, amount)
LimitOrderStyle。理解了交易所的底层规则,你就会发现这些 API 的设计不仅不是“增加复杂性”,反而是为了保护你的策略在实盘中不会因为规则差异而遭遇惨重损失。