主题切换
13.1 链上数据分析
链上数据源
区块链的公开透明特性使得链上数据分析成为加密货币量化交易中独特且强大的信息来源。与股票市场不同,链上数据是结构化的、实时的、且无需通过中介获取。
名词解释:链上数据(On-chain Data)
直接记录在区块链上的交易数据,包括转账记录、合约调用、地址余额等。每笔交易都被永久记录,不可篡改。
主流数据获取渠道:
| 数据源 | 特点 | 适用场景 |
|---|---|---|
| Etherscan API | 基础链上数据,免费额度有限 | 交易追踪、合约验证 |
| Dune Analytics | SQL查询,社区数据看板 | 自定义分析、Dashboard |
| Glassnode | 专业级指标库 | 机构级研究 |
| Nansen | 地址标签+聪明钱追踪 | 鲸鱼行为分析 |
| The Graph | 去中心化索引协议 | DApp 数据查询 |
此处有展示代码展开 ▼
python
import requests
import pandas as pd
# 使用 Etherscan API 获取链上数据
def fetch_eth_transactions(address, api_key):
"""
从 Etherscan 获取指定地址的交易记录
"""
url = "https://api.etherscan.io/api"
params = {
'module': 'account',
'action': 'txlist',
'address': address,
'startblock': 0,
'endblock': 99999999,
'sort': 'asc',
'apikey': api_key
}
response = requests.get(url, params=params)
data = response.json()
if data['status'] == '1':
df = pd.DataFrame(data['result'])
df['value_eth'] = df['value'].astype(float) / 1e18
df['timeStamp'] = pd.to_datetime(df['timeStamp'].astype(int), unit='s')
return df
else:
raise Exception(f"API Error: {data.get('message', 'Unknown error')}")
# 使用 Dune 进行 SQL 分析(示例查询)
dune_query_example = """
-- 每日活跃地址数
SELECT
date_trunc('day', block_time) AS day,
COUNT(DISTINCT "from") AS active_senders,
COUNT(DISTINCT "to") AS active_receivers
FROM ethereum.transactions
WHERE block_time > NOW() - INTERVAL '30' DAY
GROUP BY 1
ORDER BY 1 DESC
"""点击展开可浏览运行结果
--- 结果 --- dune_query_example = '\n -- 每日活跃地址数\n SELECT\n date_trunc(\'day\', block_time) AS day,\n COUNT(DISTINCT "from") AS active_senders,\n COUNT(DISTINCT "to") AS active_receivers\n FROM ethereum.t --- fetch_eth_transactions(...) ---
核心链上指标
活跃地址与交易量
活跃地址数是衡量网络使用强度的最基本指标。细分维度包括:
- 日活发送地址:发起交易的唯一地址数
- 日活接收地址:接收交易的唯一地址数
- 新地址创建数:首次出现在链上的地址数(反映新用户增长)
此处有展示代码展开 ▼
python
def calculate_network_activity_metrics(tx_df):
"""
从交易数据计算网络活跃度指标
"""
tx_df['date'] = tx_df['timeStamp'].dt.date
daily_stats = tx_df.groupby('date').agg(
active_senders=('from', 'nunique'),
active_receivers=('to', 'nunique'),
tx_count=('hash', 'count'),
total_volume_eth=('value_eth', 'sum'),
avg_tx_value_eth=('value_eth', 'mean'),
median_gas_price=('gasPrice', 'median')
).reset_index()
# 计算趋势
daily_stats['senders_ma7'] = daily_stats['active_senders'].rolling(7).mean()
daily_stats['volume_ma7'] = daily_stats['total_volume_eth'].rolling(7).mean()
return daily_stats点击展开可浏览运行结果
📘 本段代码定义了 1 个函数/类:函数 `calculate_network_activity_metrics`(从交易数据计算网络活跃度指标)。该片段为教学展示(未包含独立运行的输入数据),可在实战练习中结合真实数据调用。
NVT 比率
NVT比率(Network Value to Transactions Ratio)相当于加密世界的"市盈率":
$$NVT = \frac{\text{Market Cap}}{\text{Daily Transaction Volume (on-chain)}}$$
- 高 NVT:网络价值相对于其经济活动被高估
- 低 NVT:网络被低估,交易活跃度支撑更高估值
Willy Woo 提出的改进版 NVT Signal 使用交易量的90日移动平均来平滑:当 NVT 高于历史均值+2倍标准差时,通常预示着价格顶部。
此处有展示代码展开 ▼
python
def calculate_nvt_ratio(market_cap, daily_tx_volume, window=90):
"""
计算 NVT 比率和 NVT Signal
market_cap: Series, 每日市值
daily_tx_volume: Series, 每日链上交易量(USD计)
"""
tx_volume_ma = daily_tx_volume.rolling(window).mean()
nvt = market_cap / tx_volume_ma
# NVT Signal(标准化)
nvt_ma = nvt.rolling(window).mean()
nvt_std = nvt.rolling(window).std()
nvt_zscore = (nvt - nvt_ma) / nvt_std
return pd.DataFrame({
'nvt': nvt,
'nvt_ma': nvt_ma,
'nvt_zscore': nvt_zscore,
'overvalued': nvt_zscore > 2.0,
'undervalued': nvt_zscore < -2.0
})点击展开可浏览运行结果
📘 本段代码定义了 1 个函数/类:函数 `calculate_nvt_ratio`(计算 NVT 比率和 NVT Signal)。该片段为教学展示(未包含独立运行的输入数据),可在实战练习中结合真实数据调用。
MVRV 比率
MVRV(Market Value to Realized Value)衡量市场价值相对于"已实现价值"的偏离程度:
$$MVRV = \frac{\text{Market Cap}}{\text{Realized Cap}}$$
已实现价值(Realized Cap)按每枚币最后一次移动时的价格计算其价值(而非当前市价),反映了市场的平均持仓成本。
此处有展示代码展开 ▼
python
def calculate_mvrv(market_cap_series, realized_cap_series):
"""
计算 MVRV 比率
MVRV > 3.7 通常为顶部区域
MVRV < 1.0 通常为底部区域(累积区)
"""
mvrv = market_cap_series / realized_cap_series
signals = pd.Series('neutral', index=mvrv.index)
signals[mvrv > 3.7] = 'overvalued_extreme'
signals[mvrv > 2.5] = 'overvalued'
signals[mvrv < 1.0] = 'undervalued_extreme'
signals[mvrv < 1.5] = 'undervalued'
return pd.DataFrame({
'mvrv': mvrv,
'signal': signals
})点击展开可浏览运行结果
📘 本段代码定义了 1 个函数/类:函数 `calculate_mvrv`(计算 MVRV 比率)。该片段为教学展示(未包含独立运行的输入数据),可在实战练习中结合真实数据调用。
矿工与巨鲸行为跟踪
<钱包级>分析是链上数据最独特的价值所在。
矿工余额与抛售压力
矿工需要出售挖矿收益来覆盖电力、设备等运营成本,因此矿工地址的资金流出往往是持续的抛售压力来源。当矿工余额出现异常大幅下降(矿工恐慌性出逃),通常意味着市场极度悲观。
巨鲸行为监测
巨鲸(Whales)通常指持有大量加密货币(如>1000 BTC 或 >10000 ETH)的地址。监测维度包括:
- 鲸鱼持仓集中度:前100地址的持仓占比变化
- 交易所鲸鱼比率:流入交易所的大额转账占总流入的比例 > 90% 可能预示抛售
- 鲸鱼-散户比率:大额交易量 vs 小额交易量的动态变化
此处有展示代码展开 ▼
python
def whale_behavior_analysis(large_tx_df, exchange_wallets, threshold_btc=100):
"""
巨鲸行为分析
"""
# 识别大额转账
whale_txs = large_tx_df[large_tx_df['value_btc'] >= threshold_btc]
# 计算流入交易所的鲸鱼交易比例
whale_to_exchange = whale_txs[whale_txs['to'].isin(exchange_wallets)]
inflow_ratio = len(whale_to_exchange) / len(whale_txs)
# 净流量分析
net_flow_to_exchanges = (
whale_txs[whale_txs['to'].isin(exchange_wallets)]['value_btc'].sum()
- whale_txs[whale_txs['from'].isin(exchange_wallets)]['value_btc'].sum()
)
return {
'whale_tx_count': len(whale_txs),
'whale_exchange_inflow_ratio': inflow_ratio,
'whale_net_flow_btc': net_flow_to_exchanges,
'signal': 'bearish' if inflow_ratio > 0.6 and net_flow_to_exchanges > 0 else 'neutral'
}点击展开可浏览运行结果
📘 本段代码定义了 1 个函数/类:函数 `whale_behavior_analysis`(巨鲸行为分析)。该片段为教学展示(未包含独立运行的输入数据),可在实战练习中结合真实数据调用。
资金流向分析
交易所净流入/流出
交易所净流量是最直接的供需压力指标:
- 净流入为正:币正在被转移到交易所(通常是为了出售),短期看跌
- 净流出为正:币正在被从交易所提走(通常是为了冷存储或DeFi参与),短期看涨
稳定币发行与销毁
稳定币(USDT/USDC/DAI)的发行量变化反映了加密市场的"弹药"水平。稳定币发行量增加 = 更多购买力等待入场。
此处有展示代码展开 ▼
python
def exchange_flow_analysis(exchange_inflow, exchange_outflow, stablecoin_mcap):
"""
交易所资金流向综合分析
"""
net_flow = exchange_outflow - exchange_inflow # 流出为正
# 稳定币购买力指标
btc_price = 50000 # 示例
stablecoin_buying_power = stablecoin_mcap / btc_price # 稳定币能买多少BTC
# 综合分析
signal_score = 0
if net_flow > 0:
signal_score += 1 # 净流出 = 看涨
else:
signal_score -= 1
if stablecoin_mcap.pct_change(7).iloc[-1] > 0.05:
signal_score += 1 # 稳定币市值上升 = 资金在入场
return {
'net_exchange_flow': net_flow,
'stablecoin_to_btc_ratio': stablecoin_buying_power,
'composite_signal': signal_score
}点击展开可浏览运行结果
📘 本段代码定义了 1 个函数/类:函数 `exchange_flow_analysis`(交易所资金流向综合分析)。该片段为教学展示(未包含独立运行的输入数据),可在实战练习中结合真实数据调用。
链上分析的局限:链上数据虽公开,但地址归属和意图推断仍非常困难。交易所钱包会定期更换地址,混币器和隐私币的使用增加了追踪难度。此外,链上数据通常滞后于价格变动(价格领先链上指标2-3天),因此更适用于中长周期判断而非高频交易。