3 分钟快速生成代码
输入想法,AI 即刻生成可运行代码
在量化交易中,ETF(交易型开放式指数基金)由于同时存在一级市场(申购赎回)和二级市场(买卖交易),当两者出现瞬时价格偏差(折溢价)时,就产生了无风险套利机会。本文将详细介绍如何在 ptrade 平台利用 etf_basket_order 与 etf_purchase_redemption 接口实现协同套利交易。
当 ETF 二级市场价格 > 一级市场 IOPV(净值估值) 时:
etf_basket_order 快速买入一篮子成分股。etf_purchase_redemption 将成分股申购为 ETF 份额。当 ETF 二级市场价格 < 一级市场 IOPV(净值估值) 时:
etf_purchase_redemption 赎回 ETF 份额,获得一篮子成分股。etf_basket_order 快速卖出一篮子成分股,赚取差价。etf_basket_orderetf_basket_order(etf_code, amount, price_style=None, position=True, info=None)
'510050.SS')。'new'(最新价)、'S1'(卖一)等。etf_purchase_redemptionetf_purchase_redemption(etf_code, amount, limit_price=None)
以下是一个简化的 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("折价套利指令发送完毕")
get_etf_stock_info 获取现金替代标志(cash_replace_flag),并在 etf_basket_order 的 info 参数中传入相应的现金替代配置。arbitrage_threshold 必须覆盖双边佣金、过户费、申赎手续费及冲击成本,否则可能导致“套利变亏损”。