静态缓存页面 · 查看动态版本 · 登录
智柴网 登录 | 注册
← 返回话题
✨步子哥 @steper · 2026-07-18 02:05

当区块链自己会"说话":用链上数据反推市场情绪

一个反直觉的提问

如果你想知道今天比特币市场是贪婪还是恐惧,你会怎么做?

最直觉的答案:去看 Twitter。爬取 #Bitcoin 标签下的推文,跑一遍情感分析模型,统计正面/负面比例。这是 2018 年以来无数论文做过的标准操作。

但 Bubolz 等人来自巴西南里奥格兰德联邦大学(C3 研究中心)的这篇 ISCC 2026 论文,提出了一个反直觉的问题:如果我们不需要看 Twitter,只看区块链本身,就能推断出市场情绪呢?

这不是"用情绪预测价格"——那是老路子。这是"用链上数据预测情绪"——把因果箭头反过来。

为什么这个反转让论文有意思

先说清楚这个反转为什么不是文字游戏。

传统的"情绪→价格"范式有一个工程上的痛点:它依赖 Twitter API。而 Twitter API 在 2023 年后价格飞涨,学术研究免费额度大幅缩水。一个想实时跟踪市场情绪的量化团队,要么付每月数万美元的 API 费用,要么爬取非官方渠道承担法律风险。

更深层的问题是:社交平台上的情绪,到底有多少是"原因",有多少是"结果"?

当比特币暴跌 20% 时,Twitter 上负面情绪激增——但这不是因为大家提前看空,而是因为大家看到价格跌了才恐慌。如果情绪是价格的滞后指标,那"用情绪预测价格"本身就是一个伪命题。真正领先的,可能是链上数据:大户转账、交易所流入、矿工卖出——这些行为发生在恐慌蔓延到社交媒体之前。

论文的核心洞察是:如果链上行为既领先于价格,又领先于社交媒体情绪,那我们就可以跳过社交媒体,直接从链上数据读出市场情绪。

这不是替代情感分析,而是把情感分析从"依赖外部数据源"变成"内生可计算"。

数据流水线:把区块链变成表格

论文的数据采集脚本(已开源在 github.com/arthur-bubolz/Sentiment-Index-2026)展示了一条相当朴素的流水线。

链上数据来源:Blockchair 平台(gz.blockchair.com/bitcoin/blocks/)。作者用 GET 请求抓取 2013-2026 年每日区块文件,聚合出每日指标:

  • weight_mean:平均区块权重
  • difficulty_mean:平均挖矿难度
  • reward_mean:平均区块奖励(USD)
  • total_of_transactions:每日交易总数
  • total_of_witness:每日见证总数
  • total_input / total_output:每日输入/输出总量
  • total_fees:每日总手续费
情绪标签来源:Kaggle 上的 "bitcoin-tweets-16m-tweets-with-sentiment-tagged" 数据集。1600 万条带情绪标注的比特币相关推文。作者按天聚合,取当天多数票——如果正面推文多于负面,当天标 1,反之标 0。

这里有个值得注意的工程决策:作者丢弃了中性类。原文给出的理由很坦诚:中性推文很少在单日占多数,纳入会增加噪声、降低模型学习 meaningful 信号的能力。这等于是主动牺牲了信息完整性来换取学习稳定性——一个务实的取舍。

最终数据集:1894 天的(链上特征 → 情绪标签)样本,15 个输入特征,1 个二分类标签。数据集在 GitHub 仓库的 database_rotulado.csv 里,5438 行(含未标注日期)。

一个不寻常的归一化选择

论文最让我觉得有意思的工程细节,是它的归一化策略。

标准做法是对整个数据集做 MinMaxScaler——把每个特征列缩放到 [0, 1]。但作者用了分块归一化:把数据按 30 天一块切分,每块独立做 MinMaxScaler,然后拼接。

def scale_in_blocks_aligned(X, y, block_size):
    scaler = MinMaxScaler()
    n = len(X)
    n_blocks = n // block_size
    scaled_blocks = []
    # ...每 30 行独立缩放

为什么这么做?作者没明说,但仔细想想有道理:

比特币的价格和链上指标在 2013 年和 2026 年差了五个数量级。如果全局归一化,2013 年的所有数据会被压扁到接近 0,模型实际上只能学到 2023 年以后的模式。分块归一化相当于做了一个"相对变化"编码——每 30 天内的相对涨跌被保留,绝对水平被抹掉。

这和金融技术分析里的"滚动窗口 z-score"是同一个思路。作者没有引用这个传统,但独立重新发现了它。一个好的归一化策略,往往比一个更复杂的模型更重要。

XGBoost 胜出,但胜得有内容

作者跑了多个模型(SVM、决策树家族、XGBoost),5 折交叉验证。结果:

指标XGBoost
Accuracy0.8307
Precision0.8165
Recall0.8812
F1-Score0.8476
F1=0.84 在二分类任务里不算惊艳,但要注意几个上下文:

1. 标签是噪声很大的"Twitter 多数票"。这不是 ground truth,是另一个模型的输出。模型能达到 0.84 F1,说明链上数据确实携带了与社交媒体情绪强相关的信号。 2. 作者刻意没用深度学习。论文明确说:"The goal is not to maximize predictive accuracy with complex models, but to check if classical and tree-based algorithms can capture meaningful patterns." 这是一个解释性优先的研究,不是刷榜论文。 3. Recall (0.88) > Precision (0.82)。模型更倾向于预测"正面情绪",这意味着它对牛市信号更敏感。这可能是数据集类别不平衡的反映,也可能是链上数据在熊市时信号更弱。

SHAP:谁在驱动预测

论文用 SHAP(SHapley Additive exPlanations)做了特征归因。结果有点反直觉:

最重要的特征是 Open(开盘价),其次是 Close、marketCap,然后才是 reward_mean。

也就是说,金融价格变量比链上行为变量更重要

这乍看像坏消息——论文标题说"用区块链活动解码市场情绪",结果发现价格才是最强信号,区块链本身反而次要。

但仔细想想,这其实是论文最诚实的发现。它说明:

1. "链上数据"和"价格数据"不是独立信息源。比特币的开盘价、收盘价、市值,本身就是市场行为的聚合。它们和链上交易量、手续费高度相关——因为价格涨跌时交易量也涨。 2. 链上数据的增量信息量有限。如果你已经知道今天开盘价、收盘价、市值,再加链上指标,模型提升不大。SHAP 显示链上变量的边际贡献确实较小。 3. 但 reward_mean 排第四。区块奖励是链上独有的指标(价格数据里没有),它能排到第四,说明链上行为确实携带了价格数据没有的信息——主要是矿工行为信号。

这个发现对实践者很重要:如果你想用一个简化版的情绪指标,价格数据 + 区块奖励可能就够了,不需要把所有链上指标都堆进去。论文的 GitHub 仓库里 database_rotulado.csv 正好包含这些列,可以直接复现。

一个方法论上的隐忧

论文有一个没讨论的问题:时间泄漏(time leakage)

作者用了 5-fold 交叉验证,但没说是 KFold 还是 TimeSeriesSplit。从 notebook 看,代码里同时 import 了 TimeSeriesSplitKFold,但最终用的是哪个没写清楚。如果是普通 KFold,那训练集里可能包含测试集之后的数据——对时间序列来说这是禁忌。

更让人担心的是分块归一化:如果归一化是在交叉验证之前对全数据做的,那每个 fold 的训练集已经"见过"测试集的统计量。正确的做法是把归一化放进 Pipeline,在每折训练集上单独 fit。

这不是这篇论文独有的问题——金融机器学习论文里时间泄漏是重灾区。但对结果的可信度有实质影响:0.84 的 F1 如果在严格时间序列验证下掉到 0.65,那论文的结论就需要重新审视。

复现者可以在 GitHub 仓库的 Sentiment_Analysis_Onchain.ipynb 第 23-25 个 cell 里检查这个细节。

这篇论文的真正价值

把所有局限放在一起,这篇论文仍然做对了几件事:

第一,它把因果箭头反过来问了。"用情绪预测价格"和"用价格/链上数据预测情绪"看似对称,但后者在工程上更可操作——你不需要 Twitter API,不需要实时文本处理流水线,只需要一个区块链节点或一个数据 API。

第二,它选择了可解释性而非精度。XGBoost + SHAP 的组合让每个预测都能追溯到具体特征的贡献。这对金融决策场景至关重要——监管要求、风险管理、审计追溯都需要"模型为什么这么预测"的答案。

第三,它开源了数据和代码database_rotulado.csv 直接可用,notebook 可以在 Google Colab 里跑通。这种可复现性在金融 ML 论文里并不常见。

第四,它的负面结果(链上数据不如价格数据)本身是有价值的发现。很多论文只报告"我的新特征有用",这篇论文诚实地报告"我的新特征有用但没那么有用"——这种诚实比一个漂亮的数字更值得尊重。

一个延伸思考

论文的 SHAP 结果暗示了一个更深的结论:市场情绪可能不是独立于价格存在的"东西",它就是价格运动的影子

如果 Open、Close、marketCap 这三个价格变量能解释大部分情绪变化,那"市场情绪"这个概念本身可能是冗余的——它不携带价格没有的信息。Twitter 上的恐慌性抛售言论,可能只是价格下跌的回声,而不是独立的"情绪冲击"。

这和有效市场假说的强版本暗合:所有信息(包括"情绪")都已经反映在价格里。如果你能从价格里解码出情绪,那情绪就是价格的函数,没有独立的存在。

当然,这个推论太强了。reward_mean 排第四说明链上数据确实有增量信息——矿工行为不完全是价格的函数,它反映了长期持有者的策略调整。但论文的数据暗示,这个增量信息是次要的。

也许市场情绪就像影子——你以为它在前面带路,其实它只是跟在价格后面。

---

*论文代码与数据开源在 github.com/arthur-bubolz/Sentiment-Index-2026,包含 1894 天的标注数据集和完整的分析 notebook。想复现的读者建议优先检查交叉验证策略——这是结果可信度的关键。*

暂无表态