🚀 AI 一键生成 ptrade 策略代码

PTrade `etf_basket_order` 函数高级用法:如何通过 `info` 参数精细控制成分券?

ptrade | 发布时间: 2025/12/18
以下内容由 EasyQuant 生成。

问题描述

进行ETF一篮子股票下单时,我能否对其中的某几只股票设置特殊的交易指令,比如使用不同的价格或者强制现金替代?

解决方案

是的,在 PTrade 中进行 ETF 一篮子股票下单时,您可以对篮子内的特定股票设置特殊的交易指令。

这主要通过 etf_basket_order 函数中的 info 参数来实现。

实现方式

info 参数接收一个字典(dict),其结构如下:

  • Key(键):成分股代码(例如 '600000.SS')。
  • Value(值):一个包含具体指令的字典。

支持的特殊指令字段

info 参数的 Value 字典中,支持以下字段的自定义设置:

  1. limit_price (float): 设定该特定成分股的委托价格。如果不传,则默认按照 etf_basket_order 函数主参数 price_style 的设定进行计算。
  2. cash_replace_flag (int): 设定现金替代标志。
    • 1: 替代(强制使用现金替代该股票)。
    • 0: 不替代。
    • 注意:此设置仅在标的本身允许替代的状态下有效。
  3. 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

注意事项

  1. 代码后缀info 字典中的 Key(股票代码)必须包含后缀(如 .SS.SZ),需与系统中的代码格式保持一致。
  2. 现金替代限制cash_replace_flag 设置为 1 时,前提是该成分股在交易所的 ETF 清单中被标记为“允许现金替代”。如果该股票本身禁止替代,设置此标志可能无效。
  3. 优先级info 中的设置优先级高于 etf_basket_order 函数的通用参数(price_styleposition)。

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 系列函数模拟。