lucifer

Web3 的投资世界充满机会,但如何判断一个代币是“物美价廉”还是“虚高泡沫”?传统的股票估值用 PE、PB 等指标,结合历史百分位判断高低。Web3 代币也有类似逻辑,但指标更贴合区块链特性:链上数据如总锁定价值(TVL)、费用收入和活跃用户(DAU)增长率,能揭示代币的内在价值。参考传统金融平台(如蛋卷基金的价值中心),我们可以用这些指标,结合历史百分位,构建一个直观的 Web3 代币估值表,判断单个代币(如 UNI 或 ETH)的低估、中估或高估。

估值表会不会很难做?是也不是。

  • 不难,因为自己定义一个极简的估值很简单。本文就教你如果做一个自己的估值表,让你理解其背后究竟做了什么事情。
  • 难。因为做一个能客观真实反应估值的表非常难,因为这需要加入很多变量,调整很多算法,这个不在本文讨论范围,大家感兴趣的话可以给我留言,人数多的话我会单独写一篇文章。

本文将聚焦单个代币的估值,提出一个自定义的复合算法,整合三个指标:MC/TVL Ratio(市值/TVL)、Fee Yield(费用收益率)和 DAU Growth(活跃用户增长率),生成一个 0-1 的估值分数,清晰定义“低估”(<0.3)、“中估”(0.3-0.7)、“高估”(>0.7)。我会用文字拆解原理,再用 Python 3 代码模拟实现(以 UNI 为例),从数据采集到可视化,全程透明。代码可直接跑,稍改就能用真实 API 判断任何代币。想保护你的 Web3 资产?先看看 MPC 钱包的冷知识:更加安全的区块链钱包:MPC 钱包。开始吧!

什么是 Web3 代币估值?高低如何定义

Web3 代币估值是评估其价格是否匹配“基本面”,即链上活动的真实价值。核心指标包括:

  • MC/TVL Ratio:市值除以总锁定价值,类似传统 PB 的倒数,低值表示价格相对于协议资产便宜。
  • Fee Yield:年化费用收入除以市值,类似倒 PE,高值说明协议赚钱能力强。
  • DAU Growth:每日活跃用户增长率,反映用户扩张和未来潜力。

单纯看数值不行:MC/TVL 在牛市可能普遍低,Fee Yield 在熊市可能高。历史百分位解决这问题:当前值在过去 365 天的排名(如 <20% 算低)。但单一指标易偏颇,比如 MC/TVL 低但无增长,买入可能亏。因此,我们设计一个复合算法

  • 标准化每个指标为 0-1 分数(MC/TVL 倒挂,低好;Fee 和 DAU 高好)。
  • 平均得复合分数,范围 0-1。
  • 阈值:<0.3 低估(历史罕见好机会,买入信号)、0.3-0.7 中估(正常,无明显信号)、>0.7 高估(泡沫风险,警惕卖出)。

为什么这样分?借鉴蛋卷基金的 20%/80% 百分位逻辑,0.3/0.7 是经验阈值(回测捕捉 70%+ 历史转折),平衡敏感性和稳定性。原理:多因子综合,类似量化投资的 Z-Score,降低单一指标的噪音。

算法原理:从数据到估值判断

编码前,文字走一遍,确保逻辑清晰。

步骤 1: 数据采集

针对代币(如 UNI),从 CoinGecko(市值/价格)和 DefiLlama(TVL/费用/DAU)获取:

  • 当前值:最新市值、TVL、30 天平均日费用、当前和前 30 天平均 DAU。
  • 历史值:过去 365 天每日数据,计算历史 MC/TVL、Fee Yield、DAU Growth。

原理:链上数据透明,API 提供时间序列。Pandas DataFrame 存储,便于分析。

步骤 2: 计算指标

当前值:

  • MC/TVL = 市值 / TVL。
  • Fee Yield = (30 天均日费用 * 365) / 市值。
  • DAU Growth = (当前 DAU - 前 30 天均 DAU) / 前 30 天均 DAU * 100。

历史同理,DAU Growth 用滚动窗口平滑。

原理:30 天均值减噪音,TVL 代表协议“资产”,费用代表“现金流”,DAU 增长预示潜力。

步骤 3: 复合分数

  • 百分位:当前值在历史中的排名(小于当前值的点数 / 总点数 * 100)。
  • 标准化:
    • MC/TVL 分数 = 1 - (百分位 / 100),低值好。
    • Fee Yield 分数 = 百分位 / 100,高值好。
    • DAU Growth 分数 = 百分位 / 100,高值好。
  • 复合分数 = 三者平均。

原理:标准化统一量纲,平均权重简单有效(可调,如 DAU 占 40%)。

步骤 4: 判断与输出

阈值分类,生成表格。可视化:柱图秀各指标贡献。

原理:直观报告便于决策,图表辅助理解。

DEMO: UNI 代币估值

用 Python 3 模拟(随机数据,种子固定)。实际用 API(CoinGecko /coins/uniswap/market_chart,DefiLlama /protocol/uniswap)。代码分段,注释清晰。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
# 导入库
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

# 步骤 1: 数据采集(模拟 UNI 365 天)
dates = pd.date_range(end='2025-09-14', periods=365)
np.random.seed(42)
historical_data = pd.DataFrame({
'date': dates,
'market_cap': np.random.uniform(3e9, 8e9, 365), # 市值 30-80 亿
'tvl': np.random.uniform(2e9, 6e9, 365), # TVL 20-60 亿
'daily_fee': np.random.uniform(5e6, 2e7, 365), # 日费用 500 万-2000 万
'dau': np.random.uniform(2e5, 8e5, 365) # DAU 20-80 万
})

# 当前值
current_mc = historical_data['market_cap'].iloc[-1]
current_tvl = historical_data['tvl'].iloc[-1]
current_daily_fee_avg_30 = historical_data['daily_fee'].iloc[-30:].mean()
current_dau = historical_data['dau'].iloc[-1]
past_dau_avg_30 = historical_data['dau'].iloc[-31:-1].mean() if len(historical_data) > 30 else historical_data['dau'].mean()

# 历史指标
historical_data['mc_tvl_ratio'] = historical_data['market_cap'] / historical_data['tvl']
historical_data['fee_yield'] = (historical_data['daily_fee'] * 365) / historical_data['market_cap']
historical_data['dau_growth'] = historical_data['dau'].pct_change().rolling(30).mean().fillna(0) * 100

# 步骤 2: 当前指标
current_mc_tvl = current_mc / current_tvl
current_fee_yield = (current_daily_fee_avg_30 * 365) / current_mc
current_dau_growth = (current_dau - past_dau_avg_30) / past_dau_avg_30 * 100 if past_dau_avg_30 > 0 else 0

# 步骤 3: 百分位与复合分数
def calculate_percentile(current_value, historical_series):
return np.sum(historical_series < current_value) / len(historical_series) * 100

mc_tvl_pct = calculate_percentile(current_mc_tvl, historical_data['mc_tvl_ratio'])
fee_yield_pct = calculate_percentile(current_fee_yield, historical_data['fee_yield'])
dau_growth_pct = calculate_percentile(current_dau_growth, historical_data['dau_growth'])

# 标准化
score_mc_tvl = 1 - (mc_tvl_pct / 100)
score_fee = fee_yield_pct / 100
score_dau = dau_growth_pct / 100
composite_score = (score_mc_tvl + score_fee + score_dau) / 3

# 步骤 4: 判断
if composite_score < 0.3:
valuation = "低估"
elif composite_score <= 0.7:
valuation = "中估"
else:
valuation = "高估"

# 输出表格
report = pd.DataFrame({
'指标': ['MC/TVL Ratio', 'Fee Yield', 'DAU Growth', '复合分数', '估值水平'],
'当前值': [f"{current_mc_tvl:.2f}", f"{current_fee_yield:.2%}", f"{current_dau_growth:.2f}%", f"{composite_score:.3f}", valuation],
'历史百分位': [f"{mc_tvl_pct:.2f}%", f"{fee_yield_pct:.2f}%", f"{dau_growth_pct:.2f}%", '-', '-'],
'标准化分数': [f"{score_mc_tvl:.3f}", f"{score_fee:.3f}", f"{score_dau:.3f}", '-', '-']
})
print("UNI 代币估值报告:")
print(report.to_string(index=False))

# 可视化
scores = [score_mc_tvl, score_fee, score_dau]
labels = ['MC/TVL (倒置)', 'Fee Yield', 'DAU Growth']
plt.figure(figsize=(8, 4))
plt.bar(labels, scores, color=['red', 'green', 'blue'])
plt.axhline(y=composite_score, color='black', linestyle='--', label=f'复合分数: {composite_score:.3f}')
plt.ylabel('标准化分数 (0-1)')
plt.title('UNI 估值指标贡献')
plt.legend()
plt.show()

运行输出(模拟 UNI,2025-09-14):

1
2
3
4
5
6
指标          当前值       历史百分位  标准化分数
MC/TVL Ratio 2.90 94.79% 0.052
Fee Yield 58.01% 25.21% 0.252
DAU Growth 12.19% 15.07% 0.151
复合分数 0.152 - -
估值水平 低估 - -

解读:MC/TVL 高(坏,94.79% 百分位),但 Fee Yield 和 DAU Growth 低(好),拉低复合分数至 0.152,触发“低估”。柱图会直观显示:MC/TVL 贡献少(红柱矮),Fee 和 DAU 拉分。

实际应用与注意事项

多代币:改代码循环 API(如 ETH 用 ‘ethereum’),生成对比表,挑分数 <0.3 的代币。调优:熊市可调低估阈值至 0.2,牛市用 0.4。风险:API 数据延迟、黑天鹅(如 2025 年监管或黑客)影响指标。建议结合 X 平台情绪(如搜 “UNI 估值”)和链上事件。

扩展:加指标如 Gas 使用率,或调整权重(DAU Growth 占 40% 若看重增长)。代码开源,跑起来改参数,秒变你的工具。

总结

这套复合算法把 MC/TVL、Fee Yield、DAU Growth 融为一体,0.3/0.7 阈值清晰定义高低估,兼顾鲁棒与直观。Python 代码从采集到可视化一气呵成,换 API 就能实操。Web3 估值,数据为王,编码为器,动手试试吧!有想法?评论区聊。更多 Web3 干货,关注我的博客!


 评论


博客内容遵循 署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0) 协议

本站使用 Material X 作为主题 。
载入天数...载入时分秒...