问题描述
解决方案
是的,在 PTrade 中进行 ETF 一篮子股票下单时,您可以对篮子内的特定股票设置特殊的交易指令。
这主要通过 etf_basket_order 函数中的 info 参数来实现。
实现方式
info 参数接收一个字典(dict),其结构如下:
- Key(键):成分股代码(例如
'600000.SS')。 - Value(值):一个包含具体指令的字典。
支持的特殊指令字段
在 info 参数的 Value 字典中,支持以下字段的自定义设置:
limit_price(float): 设定该特定成分股的委托价格。如果不传,则默认按照etf_basket_order函数主参数price_style的设定进行计算。cash_replace_flag(int): 设定现金替代标志。1: 替代(强制使用现金替代该股票)。0: 不替代。- 注意:此设置仅在标的本身允许替代的状态下有效。
position_replace_flag(int): 设定持仓替代标志。1: 替代(优先使用持仓)。0: 不替代。- 注意:如果不传入,则按主参数
position的设定进行计算。
策略代码示例
以下代码展示了如何买入一篮子 ETF(以 510050.SS 为例),并对其中的 浦发银行 (600000.SS) 设置特定的限价,对 招商银行 (600036.SS) 强制开启现金替代。
def initialize(context):
# 设置 ETF 代码
g.etf_code = '510050.SS'
# 设置股票池
set_universe(g.etf_code)
# 设置一个标志位,防止重复下单
g.traded = False
def handle_data(context, data):
# 仅运行一次演示
if g.traded:
return
# 定义特殊指令字典
# key为成分股代码,value为具体的指令配置
special_stock_info = {
'600000.SS': {
'limit_price': 9.50, # 对浦发银行设置特定限价 9.50 元
'position_replace_flag': 0 # 该股票不使用持仓替代
},
'600036.SS': {
'cash_replace_flag': 1, # 对招商银行强制使用现金替代
'limit_price': 32.00 # 同时设置限价
}
}
# 下单买入 1 篮子
# price_style='new' 表示默认其他股票按最新价委托
# position=True 表示默认开启持仓替代
# info=special_stock_info 传入特殊股票的配置
etf_basket_order(
g.etf_code,
1,
price_style='new',
position=True,
info=special_stock_info
)
log.info("已发送 ETF 篮子委托,包含特殊成分股指令。")
g.traded = True
注意事项
- 代码后缀:
info字典中的 Key(股票代码)必须包含后缀(如.SS或.SZ),需与系统中的代码格式保持一致。 - 现金替代限制:
cash_replace_flag设置为 1 时,前提是该成分股在交易所的 ETF 清单中被标记为“允许现金替代”。如果该股票本身禁止替代,设置此标志可能无效。 - 优先级:
info中的设置优先级高于etf_basket_order函数的通用参数(price_style和position)。
Q&A
Q: 如果我在 info 中设置了 limit_price,主参数 price_style 还会对该股票生效吗?
A: 不会。info 中针对特定股票设置的 limit_price 优先级更高,该股票将按照您指定的具体价格下单,而篮子里的其他股票仍会遵循 price_style(如最新价、买一价等)进行委托。
Q: cash_replace_flag 设置为 1 后,还需要持有该股票的底仓吗?
A: 不需要。设置为 1 表示使用现金替代该股票,系统会计算所需的现金金额并冻结相应的资金,而不是使用股票持仓或买入股票。这通常用于该股票停牌或您不想持有该特定股票的情况。
Q: etf_basket_order 函数支持回测吗?
A: 该函数仅支持 Ptrade 客户端 的 股票交易模块(实盘或仿真交易),不支持回测环境。在回测中请使用普通的 order 系列函数模拟。