问题描述
解决方案
在聚宽(JoinQuant)平台进行科创板(股票代码以 688 开头)的市价单交易时,必须指定保护价(limit_price)。这是根据科创板交易规则要求的,旨在防止市场价格剧烈波动时产生超出预期的成交价格。
以下是具体的实现方法和代码示例。
核心要点
- 必须使用
MarketOrderStyle:不能仅传递None或省略样式参数。 - 必须传入
limit_price:- 买入时:
limit_price为保护限价上限,即成交价格不得高于此价格。若最优一档价格高于此价格,则无法成交。 - 卖出时:
limit_price为保护限价下限,即成交价格不得低于此价格。若最优一档价格低于此价格,则无法成交。
- 买入时:
代码示例
以下是一个完整的策略片段,展示了如何在 handle_data 中对科创板股票下达市价委托。
# -*- coding: utf-8 -*-
def initialize(context):
# 设置科创板股票代码,例如:华兴源创
g.security = '688001.XSHG'
# 设定基准
set_benchmark('000300.XSHG')
# 开启动态复权模式(真实价格)
set_option('use_real_price', True)
# 每天运行
run_daily(market_open, time='every_bar')
def market_open(context):
# 获取当前最新价格
current_data = get_current_data()
current_price = current_data[g.security].last_price
# --- 买入示例 ---
# 假设我们要买入200股(科创板单笔申报数量不小于200股)
# 设定保护价为当前价格的 102% (即最高能接受比当前价贵2%)
buy_protect_price = current_price * 1.02
# 下单:市价买入,指定保护价
# 如果不指定 MarketOrderStyle(buy_protect_price),订单会失败
order(g.security, 200, MarketOrderStyle(limit_price=buy_protect_price))
log.info("市价买入 %s, 保护价: %.2f" % (g.security, buy_protect_price))
# --- 卖出示例 ---
# 假设我们持仓中有该股票,现在要卖出
# 设定保护价为当前价格的 98% (即最低能接受比当前价便宜2%)
if context.portfolio.positions[g.security].closeable_amount >= 200:
sell_protect_price = current_price * 0.98
# 下单:市价卖出,指定保护价
order(g.security, -200, MarketOrderStyle(limit_price=sell_protect_price))
log.info("市价卖出 %s, 保护价: %.2f" % (g.security, sell_protect_price))
详细参数说明
在 order、order_target 或 order_value 函数中,style 参数需要设置为 MarketOrderStyle 对象:
- 语法:
MarketOrderStyle(limit_price) - 参数:
limit_price(float),即保护价。
常见错误提示
如果您在科创板交易中使用了市价单但未设置保护价(例如直接使用 order('688xxx.XSHG', 200) 或 MarketOrderStyle() 不带参数),系统通常会报错或提示:
"科创板市价单未指定保护价" 或 类似的验证失败信息。
Q&A
Q: 科创板市价单如果不设置保护价会怎样?
A: 在聚宽回测和模拟交易中,如果不设置保护价,订单创建会失败(返回 None),并在日志中出现错误提示。这是为了符合交易所关于科创板市价申报必须包含保护限价的规定。
Q: 保护价设置多少比较合适?
A: 这取决于您的策略对滑点的容忍度。通常策略会设置为当前价格的一定比例(如买入设为现价的 102% 或 105%,卖出设为 98% 或 95%)。如果保护价设置得过于苛刻(例如买入保护价低于当前卖一价),订单将无法成交。
Q: order_target 函数可以使用带保护价的市价单吗?
A: 可以。用法相同,例如:order_target(g.security, 1000, MarketOrderStyle(limit_price=50.0))。注意,如果是调仓(可能买也可能卖),您需要先判断是买还是卖,从而决定保护价是应该高于现价还是低于现价,否则可能导致保护价逻辑错误(例如卖出时保护价设得比现价高很多,导致无法成交)。
Q: 科创板的最小交易数量是多少?
A: 科创板股票通过限价申报买卖的,单笔申报数量应当不小于 200 股,且可以以 1 股为单位递增(如 201 股)。市价申报同理。在编写策略时请注意 amount 参数不要小于 200。