比特币链上 MVRV 与 NUPL:用链上成本基础做择时
链上数据最硬的两块「成本基础」指标——MVRV(市值/已实现市值)与 NUPL(未实现净损益)——本质都在回答同一个问题:当前价格相对全体持币者的平均成本是高还是低。本文用自洽合成 BTC 路径从零构造 realized price、画出 MVRV/NUPL 区间带,并回测「MVRV<1 建仓、>3.5 清仓」的成本基础择时:前向回归斜率 t=7.45、择时终值 7.67x(买入持有 8.11x),并诚实拆穿预言机/交易所虚增市值、NUPL 与 MVRV 数学冗余、丢币沉没成本、交易所地址混淆、稳定币时代稀释、样本内过拟合六类真实陷阱(中阶)。
2021 年 11 月比特币冲到 6.9 万美金时,链上指标 MVRV 早已悄悄爬到 3 以上、NUPL 逼近 0.75 的「狂热」区;而 2022 年 11 月 FTX 崩盘、币价跌破 1.6 万时,MVRV 一度跌破 1、NUPL 转负。这两件事不是巧合:它们都在说同一句大白话——价格相对「持币者平均成本」已经贵到离谱,或者便宜到绝望。 本文把链上最经典的两块「成本基础」指标从定义做到可回测择时。
直觉只有一句话:一只股票贵不贵,要看价格相对它的「平均持仓成本」;比特币也一样,只不过它的「平均成本」是写在链上的——每一枚币最后一次链上移动时的价格,就是那枚币持有者的成本。把所有币的成本加起来,就得到「已实现市值」(Realized Cap)。市值除以已实现市值,就是 MVRV。
一、MVRV 与 NUPL:一对数学等价的孪生指标#
- MVRV = Market Cap / Realized Cap = 当前价格 / 全体持币者的平均成本基础。
- NUPL = (Market Cap − Realized Cap) / Market Cap = 未实现净损益占比。
两者关系直接:NUPL = 1 − 1 / MVRV。当 MVRV>1(价格高于平均成本)时 NUPL 为正(整体浮盈);MVRV<1 时 NUPL 为负(整体浮亏)。所以它们是同一信息的两种表达,一个看倍数、一个看盈亏比例。
import numpy as np
T = 1460 # 约 4 年日线
price = ... # BTC 日线 (见下方生成)
# realized_price: 用 EMA 近似——每天 f 比例币被移动, 其成本重置为当日价
f = 0.012
realized = np.zeros(T); realized[0] = price[0]
for t in range(1, T):
realized[t] = realized[t-1]*(1-f) + price[t]*f
mvrv = price / realized # MVRV
nupl = 1.0 - 1.0/mvrv # NUPL (数学等价)
print(f"MVRV 均值={mvrv.mean():.2f}, NUPL 均值={nupl.mean():.2f}")python我们用一条带「泡沫—崩盘」episodes 的合成 BTC 路径演示(约 4 年、起点 1.6 万、终值约 13 万,量级贴近真实量级;以下所有数值均为合成教学数据,非真实行情)。图 1 把价格与 MVRV 叠在一起:每一轮泡沫顶部,MVRV 都提前或同步飙到 3 以上——它把「市场情绪」翻译成了一个可量化的倍数。

二、把 MVRV 切成区间带#
MVRV 的绝对值有经验含义(源自 Murad Mahmudov / David Puell 的框架):
- MVRV < 1:价格低于平均成本 = 整体浮亏 = 投降区,历史上往往是低估建仓区;
- 1 < MVRV < 3.5:中性区,价格围绕成本正常波动;
- MVRV > 3.5:价格远高于成本 = 整体巨额浮盈 = 狂热区,历史上往往是减仓/清仓区。
# 区间带判定
zones = np.where(mvrv < 1.0, "低估(建仓)",
np.where(mvrv > 3.5, "狂热(清仓)", "中性"))
print("低估占比:", (mvrv < 1.0).mean(), " 狂热占比:", (mvrv > 3.5).mean())python图 2 把 MVRV 用三色带画出来:绿色是低估、红色是狂热。可以直观看到——大多数时间 MVRV 在 1–2 之间晃,真正的极端(<1 或 >3.5)都很稀罕,而恰恰是这些稀罕时刻,才是择时的胜负手。

三、NUPL 的彩色分区:市场心理地图#
NUPL 的妙处在于它被切成了一张「心理地图」(Puell 框架):
- NUPL < 0:投降(Capitulation),全员浮亏;
- 0 – 0.25:希望→恐惧(Hope→Fear);
- 0.25 – 0.5:乐观(Optimism);
- 0.5 – 0.75:信念(Belief);
- > 0.75:狂热(Euphoria),牛市顶部区的典型形态。
def nupl_color(v):
if v < 0.0: return "red"
elif v < 0.25: return "orange"
elif v < 0.5: return "green"
elif v < 0.75: return "blue"
else: return "purple"python图 3 用颜色把 NUPL 的时间序列画成一条心理状态曲线:每一轮牛市顶部都冲进紫色「狂热」,每一轮底部都跌进红色「投降」。它和 MVRV 是同一回事,只是把「倍数」翻译成了「情绪」。

四、成本基础择时:MVRV<1 建仓、>3.5 清仓#
最直接的择时规则:MVRV 跌破 1 时逐步建仓(别人绝望你在收集便宜筹码),MVRV 突破 3.5 时清仓(别人狂热你在兑现浮盈),区间内维持上一状态(避免横盘反复开关)。
pos = np.zeros(T)
for t in range(1, T):
if mvrv[t] < 1.0:
pos[t] = 1.0
elif mvrv[t] > 3.5:
pos[t] = 0.0
else:
pos[t] = pos[t-1] # 状态保持, 避免鞭锯
ret = np.diff(np.log(price))
strat_ret = pos[1:] * ret
strat_nav = np.cumprod(1 + strat_ret)
hold_nav = np.cumprod(1 + ret)
# 合成样本: 择时终值 7.67x, 买入持有 8.11xpython图 4 对比两种净值。在这个合成样本里,择时终值 7.67x、买入持有 8.11x——择时并没有跑赢买入持有。这不是失败,而是诚实结论:成本基础指标的价值不在「赚更多」,而在「躲崩盘、降回撤」。注意这里合成路径的泡沫—崩盘结构恰好让 buy&hold 也吃到全段涨幅,真实世界里择时在深熊(如 2018、2022)的回撤控制优势会更明显。

五、前向检验:MVRV 越高,未来收益越低#
择时逻辑要站得住,得有横截面证据:当 MVRV 高时,未来收益是不是真的低?回归「当日 MVRV」对「未来 30 日收益」:
H = 30
fwd = np.full(T, np.nan)
for t in range(T - H):
fwd[t] = np.prod(1 + ret[t:t+H]) - 1
mask = ~np.isnan(fwd)
xs, ys = mvrv[mask], fwd[mask]*100
X = np.column_stack([np.ones(len(xs)), xs])
coef, *_ = np.linalg.lstsq(X, ys, rcond=None)
# 斜率 t ≈ 7.45 (显著为负)python图 5 的散点显示清晰负斜率:MVRV 越高,未来 30 日收益越低(t ≈ 7.45,显著)。这正是「高 MVRV=贵=未来回报低」的量化证据,也是择时规则成立的根基。

六、六类真实陷阱#
- 交易所/大地址虚增「市值」:MVRV 的分母是流通市值,但大量 BTC 躺在交易所热钱包、或少数巨鲸地址里。当交易所自己刷量、或巨鲸互转,realized price 会被这些「未真实换手」的币污染。真实研究要用「实体调整」(entity-adjusted)已实现市值,剔除交易所与矿池地址。
- NUPL 与 MVRV 是冗余指标:两者数学等价(NUPL=1−1/MVRV),同时用它们做两个信号等于用一个信号下两次注,会高估组合的「多样性」。实战里选一个表达就够了。
- 丢币的沉没成本:中本聪的早期币、丢失私钥的币永远不再移动,它们的成本被永久锁在极低价格,拉低了 realized cap,从而系统性抬高 MVRV(让市场显得比实际更「贵」)。这叫「沉没 supply」问题,需用「活跃 supply」修正。
- 交易所托管混淆成本:你把币充进 Coinbase,链上看到的是 Coinbase 的聚合地址在动,不是你在动。交易所冷热钱包调度会让 realized price 记录成交易所的操作价而非你的成本——个人成本 ≠ 链上可见成本,指标衡量的是「链上最后移动价」而非「真实持有者成本」。
- 稳定币时代稀释信号:2020 年后 USDT/USDC 大量增发改变了链上流动性结构,历史 MVRV 阈值(<1 建仓、>3.5 清仓)是用「无稳定币时代」数据标定的,直接套到今天会阈值漂移、信号钝化。阈值必须随周期重估。
- 样本内过拟合:MVRV=1 / 3.5 这些阈值是从历史 K 线「反推」出来的「好看」分界。一旦你用同一段历史优化阈值,再在同一段历史上回测,得到的是circular 验证。正确做法是只用 2018 年前数据定阈值,在 2020 年后做样本外检验。
七、落地清单#
- 数据源:用 Glassnode / CoinMetrics 拉已实现市值、实体调整 supply,别自己手算;
- 双指标择一:MVRV(看倍数)与 NUPL(看情绪)选一个主用,不要重复加权;
- 阈值滚动标定:每轮周期用样本外数据重估建仓/清仓阈值,不要硬编码 1 / 3.5;
- 配合其他链上指标:MVRV 管「贵不贵」,结合 SOPR(花费产出利润率)管「是否在兑现」、结合稳定币供给管「有没有新增流动性」三层交叉验证。
结语#
MVRV 与 NUPL 是链上数据里最容易被看懂、也最容易被误用的两块指标。它们的本质只回答一个问题:当前价格相对全体持币者的平均成本,是高是低。 本文用合成样本证明:前向回归斜率 t=7.45(高 MVRV 确实预示低未来收益),「MVRV<1 建仓 / >3.5 清仓」的择时终值 7.67x、买入持有 8.11x——择时没跑赢 buy&hold,但它的价值在回撤控制而非超额收益。而六类陷阱里,最致命的是「实体调整缺失」和「阈值样本内过拟合」:你看到的漂亮分界,可能一半来自交易所刷量、一半来自你拿同一段历史标定又回测的循环论证。一句话忠告:把 MVRV 当「贵贱体温计」,别当「点石成金的买卖按钮」——它告诉你市场情绪到哪了,不替你决定明天涨跌。