问题描述
/
解决方案
澄清:并非所有上证股票都必传,主要针对科创板
在 ptrade 平台中使用 order_market(按市价进行委托)接口时,limit_price 参数并非对所有上证股票都是必传的。根据 ptrade API 文档,limit_price 是保护限价(仅限科创板代码)。
为什么科创板市价单必须传入保护限价?
这是由上海证券交易所的交易规则决定的。为了防范极端行情下的交易风险,保护投资者的利益,上交所规定:科创板股票的市价申报必须包含保护限价。
- 控制成交价格偏离风险:市价单的特点是“价格优先,快速成交”。在流动性不足或市场剧烈波动时,如果没有保护限价,市价单可能会以极其偏离预期的价格成交(例如直接打到涨跌停板)。
- 保护限价的作用:当投资者买入时,成交价格不会高于保护限价;当投资者卖出时,成交价格不会低于保护限价。如果市场上的最优价格超出了保护限价的范围,超出部分的订单将被撤销或转为限价单(取决于具体的市价单类型)。
ptrade 中 order_market 的参数说明
order_market(security, amount, market_type, limit_price=None)
security: 股票代码。amount: 交易数量,正数表示买入,负数表示卖出。market_type: 市价委托类型(必传参数)。- 上证非科创板股票:支持参数 1(最优五档即时成交剩余转限价)、4(最优五档即时成交剩余撤销)。
- 上证科创板股票:支持参数 0(对手方最优价格)、1、2(本方最优价格)、4。
- 深证股票:支持参数 0、2、3(即时成交剩余撤销)、4、5(全额成交或撤单)。
limit_price: 保护限价。当交易上证科创板股票时,此参数必须传入有效数值。
Python 代码示例
以下是在 ptrade 中对科创板股票使用市价单并传入保护限价的示例:
def initialize(context):
# 设置操作的科创板股票
g.security = '688001.SS'
set_universe(g.security)
def handle_data(context, data):
security = g.security
# 获取当前最新价作为参考
current_price = data[security]['close']
# 假设我们要买入 200 股科创板股票
# 使用 market_type=1 (最优五档即时成交剩余转限价)
# 为了防止买入价格过高,我们设置保护限价为当前价格上浮 2%
protect_price = round(current_price * 1.02, 2)
# 下市价单,必须传入 limit_price
order_market(security, 200, 1, limit_price=protect_price)
log.info(f"已下达科创板市价买入委托,保护限价: {protect_price}")
总结:在使用 ptrade 编写策略时,务必区分主板和科创板的交易规则差异。对于上证科创板股票,调用 order_market 时切记计算并传入合理的 limit_price,否则会导致委托失败。