3 分钟快速生成代码
输入想法,AI 即刻生成可运行代码
在 ETF 交易与套利策略中,折溢价率是衡量 ETF 二级市场交易价格与一级市场净值(IOPV)偏离程度的核心指标。
$$\text{折溢价率 (%)} = \frac{\text{最新成交价} - \text{IOPV}}{\text{IOPV}} \times 100%$$
注:某些场景下也可使用买一/卖一档位价格代替最新成交价进行实时计算。
get_snapshot(security):获取实时行情快照,包括最新价(last_px)、委买/委卖档位等。get_etf_info(etf_code):获取 ETF 的基础数据,包括最小申赎单位净值、T-1日净值等。在 PTrade 的 handle_data 或 run_interval 函数中,可以通过以下 Python 代码实时计算 ETF 的折溢价率:
def initialize(context):
# 设置目标 ETF 代码(以华夏上证50ETF为例)
g.etf_code = '510050.SS'
set_universe(g.etf_code)
# 每 3 秒定时运行计算(仅交易模块支持 run_interval)
run_interval(context, calculate_etf_premium, seconds=3)
def calculate_etf_premium(context):
etf_code = g.etf_code
# 1. 获取 ETF 行情快照
snapshot = get_snapshot(etf_code)
if not snapshot or etf_code not in snapshot:
log.error("获取行情快照失败")
return
# 获取最新成交价与买卖一档价格
last_px = snapshot[etf_code].get('last_px', 0)
bid_px1 = snapshot[etf_code]['bid_grp'][1][0] if snapshot[etf_code]['bid_grp'] else 0
offer_px1 = snapshot[etf_code]['offer_grp'][1][0] if snapshot[etf_code]['offer_grp'] else 0
# 2. 获取 ETF 基础信息/IOPV
# 注:快照中部分柜台包含 IOPV 字段;若无直接字段,通常结合 IOPV 或参考基金单位净值
etf_info = get_etf_info(etf_code)
if not etf_info or etf_code not in etf_info:
log.error("获取 ETF 基础信息失败")
return
# 假设使用 T-1 日净值或实时 IOPV 进行参考计算
# 部分柜台快照中包含 iopv/nav,这里展示基于最新成交价与 IOPV 的计算
iopv = snapshot[etf_code].get('wavg_px', 0) # 如果行情提供实时 IOPV,可直接提取对应字段
# 如果快照中未直接返回 IOPV,可通过 T-1 净值做基本估算(或使用 IOPV 专属行情字段)
if iopv == 0:
iopv = etf_info[etf_code].get('nav_pre', 0)
if iopv <= 0 or last_px <= 0:
log.warning("数据不全,无法计算折溢价率")
return
# 3. 计算折溢价率
premium_rate = ((last_px - iopv) / iopv) * 100
log.info("[%s] 最新价: %.3f, 参考IOPV/净值: %.3f, 折溢价率: %.2f%%" % (
etf_code, last_px, iopv, premium_rate
))
# 4. 交易逻辑判断触发(示例)
if premium_rate > 0.5: # 溢价大于 0.5%
log.info("触发溢价,可执行套利策略逻辑")
elif premium_rate < -0.5: # 折价大于 0.5%
log.info("触发折价,可执行买入套利逻辑")
def handle_data(context, data):
pass
order 或 order_tick)时需保护好价格精度。get_snapshot 与 get_etf_info 接口在 PTrade 交易模块 中可用,且要求具备相应的行情与柜台权限。before_trading_start 盘前阶段获取 get_snapshot 时,大部分成交数据可能为 0,建议在盘中连续竞价阶段执行计算。