绝大多数关于”社交媒体情绪”的量化文章,都停留在同一个简化假设上:把情绪当成一张每日快照—今天看涨情绪 0.6,明天 0.55,然后拿这个数值去回归收益。这个视角最大的问题,是它把**情绪的”传播过程”**整个丢掉了。
价格发现(price discovery)真正发生的地方,不是某个静止的情绪值,而是叙事在人群里被看见、被转发、被争论、被稀释的动态过程。一条关于某公司产能的推文,之所以能影响股价,不是因为它”存在”,而是因为它在 48 小时内从 1 个种子节点扩散到了 5 万个节点,触达了大量原本不会研究这只股票的交易者。
本文要做的,就是把情绪从”快照”还原成”传播”,并告诉你怎么把它变成可回测的信号。
一、为什么情绪是”传播”而非”状态”#
传染病模型是理解信息扩散最成熟的语言。把一条金融叙事(比如”某芯片厂良率崩了”)当作病原体,人群分为三类:
- S(t) 易感者:还没接触过这个叙事的人;
- I(t) 传播者:已经知道、且正在转发/讨论的人;
- R(t) 移除者:话题冷却、注意力转移走、价格已消化的人。
经典的 SIR 动力学是:
其中 是传播率(一条推文被转发的概率乘上触达人数), 是遗忘/冷却率。关键结论是:情绪对价格的影响,主要体现在 I(t) 的爬坡段和峰值附近,而不是在 S(t) 还很高、没人谈论的时候。
这就解释了为什么很多”情绪值”策略失效:它们用的是稳态的情绪水平,而真正有信息含量的是传播速度 和峰值时间。
这里有个被很多人忽略的量化要点:基本再生数 。只有当 时叙事才会”病毒式”扩散,否则会在几轮内自然消亡。这意味着并非每条被讨论的叙事都值得交易—你真正要找的是 显著大于 1 的”真催化”,而不是 的噪声。从真实转发级联数据里,可以用每日新增传播者数量反推参数:对 做对数回归,斜率近似为 ,再结合稳态方程就能解出 与 ,从而估计一条叙事的”传染力”。

二、情绪如何驱动价格发现#
情绪影响价格的机制,不是玄学,而是三条可验证的链路:
- 注意力 → 成交量:叙事扩散带来新参与者,成交量放大,买卖盘失衡被放大。
- 分歧 → 波动率:被争论的叙事制造多空分歧,隐含波动率抬升,期权市场先反应。
- 提前量 → 领先收益:信息在社交网络里的扩散,往往早于它在价格里的完全反映,于是情绪变化领先于次日收益。
第三点是我们最关心的。用互相关(cross-correlation)可以检验“情绪领先还是收益领先”:如果情绪变化的滞后阶数在 处相关性最强,说明情绪先于价格。
更严谨地,可以用 Granger 因果检验回答“是情绪预测了收益,还是两者只是被同一只看不见的手(比如宏观新闻)共同驱动”。对 做先后回归,若情绪变化的滞后项系数显著、且加入情绪后收益自身滞后项系数明显下降,才能说情绪“真的”领先于价格。这一步是把“叙事驱动价格”从直觉变成可证伪假设的关键,也是很多看似有效的情绪因子在样本外塌房前的“压力测试”。

三、构建一个”情绪传播力”指标#
与其用单一情绪值,不如构造一组刻画传播结构的特征:
- 触达规模(Reach):N 轮扩散后被激活的节点数,反映叙事穿透力;
- 传播速度(Velocity):达到峰值 I(t) 所需天数,越快越可能是”真实催化”而非噪声;
- 网络中心度:种子节点是否处于高中心度位置(大 V、财经媒体),决定初始放大系数 ;
- 情绪极性加速度:,比水平值更干净地捕捉”正在发酵”。
这些特征拼接起来,才是一个能在截面/时序上用的信号,而不是一个容易被操纵的”热度数字”。
实践中可以把这四个特征合成一个”情绪传播力分数”:先各自做横截面或时序的 z-score,再按经济意义加权—Reach 与 Velocity 给较高权重(它们是领先性的直接代理),网络中心度作为放大系数乘到前面,极性加速度捕捉”正在发酵”。分数本身不直接等于买卖信号,而是作为一层”注意力温度计”:只有当分数突破历史分位数(例如 90%)且仍在上升时,才说明叙事正处于 I(t) 爬坡段,这才是情绪信号信息含量最高的窗口。把它和已有的量价因子做正交化,往往能挤出一小块与基本面、技术面都低相关的增量 alpha。
四、Python 实战#
下面三段代码可独立运行(数据用合成序列,便于复现),分别对应前面的三个图。
4.1 SIR 情绪传播模拟#
import numpy as np
def sir_sentiment(T=120, beta=0.28, gamma=0.06, I0=0.005):
"""SIR 式情绪传播:返回易感/传播/移除三类人群占比序列。"""
S, I, R = np.zeros(T), np.zeros(T), np.zeros(T)
S[0], I[0], R[0] = 1 - I0, I0, 0.0
for t in range(1, T):
dS = -beta * S[t-1] * I[t-1]
dI = beta * S[t-1] * I[t-1] - gamma * I[t-1]
dR = gamma * I[t-1]
S[t] = max(S[t-1] + dS, 0)
I[t] = max(I[t-1] + dI, 0)
R[t] = min(R[t-1] + dR, 1)
return S, I, R
S, I, R = sir_sentiment()
peak = int(np.argmax(I))
print(f"情绪峰值在第 {peak} 天,峰值传播占比 = {I[peak]:.2%}")python4.2 网络扩散(随机几何图 + BFS 激活时间)#
import numpy as np
rng = np.random.default_rng(42)
N = 46
pos = rng.uniform(0, 1, size=(N, 2))
r0 = 0.22
edges = [(i, j) for i in range(N) for j in range(i+1, N)
if np.linalg.norm(pos[i] - pos[j]) < r0]
# 选最中心节点作种子,按 BFS 轮次激活
seed = int(np.argmax([np.linalg.norm(p - 0.5) for p in pos]))
activated = {seed: 0}
frontier = [seed]
while frontier:
nxt = []
for u in frontier:
nbrs = [b for a, b in edges if a == u] + [a for a, b in edges if b == u]
for v in nbrs:
if v not in activated:
activated[v] = activated[u] + 1
nxt.append(v)
frontier = nxt
rounds = np.arange(max(activated.values()) + 2)
reach = [sum(1 for v in activated.values() if v <= k) for k in rounds]
print("逐轮累计触达:", reach)python
4.3 领先-滞后检验 + 情绪动量多空回测#
import numpy as np
T = 500
rng = np.random.default_rng(7)
sent = np.cumsum(rng.normal(0, 1, T))
# 收益领先情绪 1 天:情绪变化预测次日收益
ret = np.zeros(T)
for i in range(1, T):
ret[i] = 0.18 * (sent[i-1] - sent[i-2]) + rng.normal(0, 1) * 0.9
ret = ret / ret.std()
# 互相关:负 lag = 情绪领先
lags = np.arange(-5, 6)
xcorr = np.array([np.corrcoef(np.roll(sent, lag), ret)[0, 1] for lag in lags])
best = lags[np.argmax(np.abs(xcorr))]
print(f"最强互相关在 lag={best}(情绪{'领先' if best<0 else '滞后'}收益)")
# 信号:用 t-1 情绪变化,在 t 日开盘交易(避免前视)
signal = np.sign(np.roll(sent, 1) - np.roll(sent, 2))
signal[0] = 0
strat = np.cumprod(1 + 0.5 * signal * ret)
print(f"情绪动量策略最终净值 = {strat[-1]:.2f}")python注意第 4.3 段里信号用 np.roll(sent, 1),意味着第 t 日用的是第 t-1 日已确定的情绪变化,这是刻意绕开前视偏差的关键写法(详见第五节)。
五、真实陷阱(不说的都是坑)#
- 前视偏差(最常见):用”当日收盘价 + 当日情绪”同时进模型,等于用未来信息。正确做法是信号基于 t-1 及之前的数据,在 t 日执行。举个具体例子:假设你 14:30 用”截至当前的所有推文情绪”生成信号,并用 14:30 的股价做标签回归—这等于用未来半小时的价格信息预测过去,回测年化可以虚高到离谱。正确做法是情绪快照固定在 15:00 收盘后(或次日开盘前),信号只用于下一交易日,且标签用下一日的收益率。
- 机器人放大:社交平台大量 bot 会制造虚假传播峰值,直接拉高 和 Reach。必须做账号可信度过滤(蓝 V/历史活跃度/转发图谱),否则你在交易水军。
- 回音室:同一叙事在封闭社群里反复自引用,看起来触达广,实则没溢出到能影响价格的人群。网络中心度比触达总数更可靠。
- 帖子幸存者偏差:能抓到的数据是”还活着”的帖子,被删帖/限流的负面叙事被系统性低估,情绪天然偏多。
- 监管与流动性:极端情绪驱动的跳空,往往伴随停牌、涨跌停无法成交,回测里的”完美成交”在实盘根本不存在。
- 情绪≠基本面:叙事可以完全错误却仍驱动价格(回忆 GameStop)。情绪信号捕捉的是注意力驱动的短期错配,不是价值。
六、小结#
社交媒体对量化的价值,不在”今天大家是看涨还是看跌”这个静态数字,而在叙事如何传播、以多快速度、从谁出发、触达了谁。把情绪当传播过程建模(SIR + 网络扩散),并用领先-滞后检验确认其确实先于价格,你才拿到一个经得起推敲的另类 alpha 来源。但请永远记得:你在交易的是注意力的短期错配,不是真相本身。