盘中估值到底能多准:我如何把基金误差压进 ±0.3%
我有一套 13 支基金组合的实时跟踪面板,每 10 分钟采集一次盘中估值。有天我发现黄金基金整天的估值钉在 -1.49% 不动,第一反应是数据源卡了。查了一圈,其实是金价那天真的就横在那个位置。
但这件事逼我认真对了一次账:把每天 15:00 的盘中估值,跟当晚 22:00 基金公司公布的官方净值放在一起比,算偏差。结果发现,有的基金偏差 0.05%,有的能到 3.74%。
同样是估值,为什么差这么多,怎么把误差压下去,就是这篇要说的。
一、误差从哪来
把偏差数据摊开后,我归类出四个来源。
第一个是数据源映射错了。博时黄金ETF联接C 的底层是博时黄金ETF(159937),但我一开始把它的实时价映射到了华安黄金ETF(518880)。两个 ETF 都跟踪上海金,大多数时候涨跌幅几乎一样,可历史上某些天能差到 0.6%。这种错配平时看不出来,只有对账才暴露。
第二个是主动基金的持仓覆盖不够。信澳5G、金银珠宝这两支主动基金没有底层 ETF,得用「季报重仓股加权」来估。我一开始只取前 10 大重仓股,权重加起来只有 76%,剩下 24% 的持仓涨跌没算进去。这 24% 就是误差。
第三个是脏数据。7 月 30 号的收盘估值,7 支基金的涨跌幅全被写成了 -8.81%←,尾巴带了个箭头。float() 一解析就崩。这种污染麻烦在它静默存在,页面不报错,但那一整天的偏差算不出来。
第四个,也是天花板,是季报滞后。主动基金的持仓一个季度才披露一次。8 月 14 号我用的还是 6 月 30 号的季报,中间一个半月基金经理可能已经调过仓。这个误差没法靠代码消除。
二、四刀砍下去
对着这四个来源,我做了四件事。
第一刀,修映射。把黄金 002611 的实时价从 sh518880 换成 sz159937,跟底层对齐。改完当天,黄金的偏差从历史平均 0.3% 掉到 0.04%。
第二刀,扩持仓。主动基金的持仓从 top 10 提到 top 20,权重覆盖从 76% 提到 90% 以上。改法就一行:
url = f"https://fundf10.eastmoney.com/FundArchivesDatas.aspx?type=jjcc&code={code}&topline=20"
第三刀,清洗加防御。把历史数据里的箭头清掉,再把解析逻辑从简单 replace 改成正则提取数字:
_m = re.search(r'[-+]?\d+\.?\d*', str(e.get("pct", "0")))
ep = float(_m.group()) if _m else None
以后再来什么脏字符都不会崩。
第四刀,上监控。前三刀是「让估值更准」,这一刀是「持续发现不准」。写了个 demo18 页面,每天把 15:00 估值和官方净值逐日逐基金对账,算偏差矩阵。
三、监控闭环比一次性修复更重要
数据源会再错,持仓会再调,脏数据会再来。所以真正值钱的是那个每天自动对账的闭环。
demo18 的逻辑就一行话:每天 fundtracker 15:00 的预估涨跌幅,减去当天官方净值涨跌幅,得到偏差。正的是估值偏高,负的是偏低。

这个页面能告诉你两件事。ETF 联接基金偏差突然放大,说明数据源又出问题了,去查映射。主动基金偏差持续放大,说明季报持仓已经失真,该重新评估这支基金了。
我用 8 月 13 号的数据验证过:ETF 基金偏差全在 0.2% 以内,主动基金信澳5G 偏 0.31%、金银珠宝偏 0.22%。跟理论预期对得上。
四、做不到的那部分
诚实说,有两类误差我压不下去。
主动基金的季报滞后。只要基金公司不实时披露持仓,持仓加权法就永远有一层「用旧地图」的误差。能做的只有两点:尽量取最新季报,以及用偏差监控及时感知「地图已经过期」。
数据源的几秒延迟。盘中估值本质是「我采集那一刻的快照」,跟基金公司收盘后的精确计算,中间必然有时间差。但这个在 10 分钟采集间隔下可以忽略,不值得为它换更快的源。
结尾
把误差从「感觉挺准」变成「能说清差多少」,这件事本身比消除误差更有用。因为你知道哪些偏差是数据源的问题,能修;哪些是估值法的天花板,只能接受;哪些是数据污染,要防。
如果你也在做类似的实时估值,先别急着调参。先做一张偏差对账表,它会告诉你真正该修的是哪里。