3. 价差计算:实时净值估算、IOPV计算、折溢价率公式、价差阈值设定
各位同学,欢迎来到价差计算这一节。说实话,这是整个套利策略的「心脏」。你前面把行情数据接得再快,订单系统再稳定,如果价差算错了,一切都是白搭。我在早期做ETF套利的时候,就吃过这个亏——当时IOPV算错了一个小数点,直接导致一笔交易亏了六位数。嗯,从那以后,我对价差计算就格外较真。
3.1 实时净值估算:为什么不能直接看基金公司公布的净值?
很多新手会问:ETF的净值不是每天收盘后基金公司都公布吗?为什么还要自己算?
原因很简单:收盘后的净值是「过去式」。套利捕捉的是盘中瞬间的价差,你需要的是「现在式」——也就是此时此刻,这个ETF到底值多少钱。
我个人习惯把实时净值估算叫做「影子净值」。它基于一个核心逻辑:ETF的净值 = 持仓组合的实时市值。
具体怎么算?我们来看公式:
实时净值 = Σ(成分股最新价 × 权重) + 现金部分
但这里有个坑:权重数据是T-1日的。基金公司每天公布申购赎回清单(PCF),里面包含了成分股名单和数量。你拿这个清单,乘以实时股价,就能算出净值。
3.2 IOPV计算:交易所的官方参考值
IOPV,全称是Indicative Optimized Portfolio Value,中文叫「参考净值」。交易所每15秒发布一次,很多散户直接拿它当实时净值用。
但我要告诉你:IOPV有延迟,而且精度有限。
为什么?因为IOPV的计算逻辑是:
IOPV = (最新PCF清单 × 成分股最新价) / 基金份额
问题出在「最新价」上。如果某只成分股在15秒内剧烈波动,IOPV可能还没反应过来。我在做高频套利时,从来不用IOPV作为唯一依据,而是自己算一套更快的净值。
3.3 折溢价率公式:套利的核心指标
折溢价率,说白了就是回答一个问题:ETF现在卖贵了还是卖便宜了?
公式很简单:
折溢价率 = (ETF市价 - 实时净值) / 实时净值 × 100%
- 折价(负值):市价 < 净值,ETF被低估。这时候你应该买入ETF,赎回成分股卖出。
- 溢价(正值):市价 > 净值,ETF被高估。这时候你应该买入成分股,申购ETF卖出。
你想想看,如果折溢价率超过你的交易成本,套利空间就出现了。但这里有个细节:折溢价率是动态的。我见过有人盯着一个0.3%的溢价等成交,结果等单子成交时溢价已经缩到0.1%了,反而亏了手续费。
3.4 价差阈值设定:不是拍脑袋定的
阈值怎么设?很多人直接拍个0.5%或者1%。这太粗糙了。阈值应该是一个动态计算的结果。
我一般用这个公式:
最小套利阈值 = 交易成本 + 滑点成本 + 风险溢价
其中:
| 成本项 | 说明 | 典型值(A股ETF) |
|---|---|---|
| 交易成本 | 佣金、印花税、过户费 | 0.05% - 0.1% |
| 滑点成本 | 买卖价差、冲击成本 | 0.03% - 0.08% |
| 风险溢价 | 净值估算误差、流动性风险 | 0.02% - 0.05% |
举个例子:如果交易成本0.08%,滑点0.05%,风险溢价0.03%,那最小阈值就是0.16%。低于这个数,你做了就是给券商打工。
3.5 知识体系总览
下面这张图,是我自己整理的一套价差计算流程。你可以把它当作一个检查清单:
这张图把整个流程串起来了。你从数据源开始,先算实时净值,再用IOPV做校验,然后算折溢价率,最后跟阈值做比较。每一步都有坑,但每一步也都有对应的解法。
3.6 代码实现:一个简单的价差计算器
光说不练假把式。我写了一个简化的Python函数,你可以直接拿去用:
def calculate_spread(etf_price, pcf_data, cash_component, shares_outstanding, threshold):
"""
计算ETF折溢价率
参数:
etf_price: ETF当前市价
pcf_data: 成分股列表,格式为[(股票代码, 最新价, 数量), ...]
cash_component: 现金部分(元)
shares_outstanding: 基金总份额
threshold: 最小套利阈值(小数形式,如0.002表示0.2%)
返回:
spread: 折溢价率
nav: 实时净值
signal: 交易信号('buy', 'sell', 'hold')
"""
# 1. 计算实时净值
portfolio_value = sum(price * qty for _, price, qty in pcf_data)
nav = (portfolio_value + cash_component) / shares_outstanding
# 2. 计算折溢价率
spread = (etf_price - nav) / nav
# 3. 判断交易信号
if spread > threshold:
signal = 'sell' # 溢价,卖出ETF
elif spread < -threshold:
signal = 'buy' # 折价,买入ETF
else:
signal = 'hold' # 无套利空间
return spread, nav, signal
这个函数虽然简单,但已经包含了核心逻辑。你在实际项目中,还需要加上数据源接入、实时更新、风控检查等模块。嗯,那些内容我们后面会讲到。
公众号:蓝海数据掘金营,微信deep3321