🚀 AI 一键生成 ptrade 策略代码
立即体验

ptrade 平台如何实现 ETF 瞬时折溢价套利?(附 etf_basket_order 与 etf_purchase_redemption 协同交易源码)

ptrade | 发布时间: 2026/8/11
以下内容由 EasyQuant 生成。

问题描述

ptrade ETF 申赎套利实战:etf_basket_order 与 etf_purchase_redemption 协同交易
我想编写一个 ETF 瞬时折溢价套利策略,如何利用 ptrade 的成分股篮子下单和申赎接口?

解决方案

ptrade ETF 瞬时折溢价套利实战指南

在量化交易中,ETF(交易型开放式指数基金)由于同时存在一级市场(申购赎回)二级市场(买卖交易),当两者出现瞬时价格偏差(折溢价)时,就产生了无风险套利机会。本文将详细介绍如何在 ptrade 平台利用 etf_basket_orderetf_purchase_redemption 接口实现协同套利交易。


一、 ETF 套利基本原理

1. 溢价套利(Premium Arbitrage)

ETF 二级市场价格 > 一级市场 IOPV(净值估值) 时:

  1. 买入成分股:使用 etf_basket_order 快速买入一篮子成分股。
  2. 申购 ETF:使用 etf_purchase_redemption 将成分股申购为 ETF 份额。
  3. 卖出 ETF:在二级市场卖出 ETF 份额,赚取差价。

2. 折价套利(Discount Arbitrage)

ETF 二级市场价格 < 一级市场 IOPV(净值估值) 时:

  1. 买入 ETF:在二级市场买入 ETF 份额。
  2. 赎回 ETF:使用 etf_purchase_redemption 赎回 ETF 份额,获得一篮子成分股。
  3. 卖出成分股:使用 etf_basket_order 快速卖出一篮子成分股,赚取差价。

二、 ptrade 核心接口解析

1. 成分股篮子下单:etf_basket_order

etf_basket_order(etf_code, amount, price_style=None, position=True, info=None)
  • etf_code: ETF 代码(如 '510050.SS')。
  • amount: 下单篮子份数。正数表示买入成分股,负数表示卖出成分股
  • price_style: 委托价位,如 'new'(最新价)、'S1'(卖一)等。

2. ETF 申赎接口:etf_purchase_redemption

etf_purchase_redemption(etf_code, amount, limit_price=None)
  • amount: 申赎数量。正数表示申购,负数表示赎回

三、 瞬时折溢价套利策略源码示例

以下是一个简化的 ETF 瞬时套利策略框架,展示了如何获取行情、计算折溢价并执行协同交易:

def initialize(context):
    # 设定套利目标 ETF(以 50ETF 为例)
    g.etf_code = '510050.SS'
    set_universe(g.etf_code)
    
    # 设定套利阈值(根据实际交易成本调整)
    g.arbitrage_threshold = 0.003  # 0.3% 的折溢价空间
    g.basket_unit = 1000000        # 最小申赎单位(100万份)

def handle_data(context, data):
    # 仅在交易模块运行
    if not is_trade():
        return
        
    # 1. 获取 ETF 实时行情快照
    snapshot = get_snapshot(g.etf_code)
    if not snapshot or g.etf_code not in snapshot:
        return
        
    etf_market_price = snapshot[g.etf_code]['last_px']  # 二级市场最新价
    
    # 2. 获取 ETF 基金基本信息(如 T-1日净值等)
    etf_info = get_etf_info(g.etf_code)
    if not etf_info or g.etf_code not in etf_info:
        return
    
    iopv = etf_info[g.etf_code]['nav_pre']  # 实际交易中应结合实时 IOPV 估算
    if iopv <= 0:
        return
        
    # 计算折溢价率
    premium_rate = (etf_market_price - iopv) / iopv
    
    # 3. 执行套利逻辑
    # 场景 A:溢价套利 (二级市场价格显著高于净值)
    if premium_rate > g.arbitrage_threshold:
        log.info(f"触发溢价套利,溢价率: {premium_rate:.4f}")
        
        # 第一步:一键买入成分股篮子
        basket_res = etf_basket_order(g.etf_code, 1, price_style='S1', position=True)
        
        if basket_res:
            # 第二步:申购 ETF 份额
            etf_purchase_redemption(g.etf_code, g.basket_unit)
            # 第三步:二级市场卖出 ETF 份额
            order(g.etf_code, -g.basket_unit)
            log.info("溢价套利指令发送完毕")
            
    # 场景 B:折价套利 (二级市场价格显著低于净值)
    elif premium_rate < -g.arbitrage_threshold:
        log.info(f"触发折价套利,折价率: {premium_rate:.4f}")
        
        # 第一步:二级市场买入 ETF 份额
        order_id = order(g.etf_code, g.basket_unit)
        
        if order_id:
            # 第二步:赎回 ETF 份额,获取成分股
            etf_purchase_redemption(g.etf_code, -g.basket_unit)
            # 第三步:一键卖出成分股篮子
            etf_basket_order(g.etf_code, -1, price_style='B1')
            log.info("折价套利指令发送完毕")

四、 实盘注意事项

  1. 资金与持仓要求:ETF 申赎套利通常需要极大的资金量(通常 1 个申赎单位在数百万人民币以上)。
  2. 成分股停牌处理:若成分股中存在停牌股票,需参考 get_etf_stock_info 获取现金替代标志(cash_replace_flag),并在 etf_basket_orderinfo 参数中传入相应的现金替代配置。
  3. 交易成本:套利阈值 arbitrage_threshold 必须覆盖双边佣金、过户费、申赎手续费及冲击成本,否则可能导致“套利变亏损”。