halo 的技术博客

返回

另类数据(alternative data)听起来很贵:卫星图、信用卡流水、船运 AIS。但有一个数据源,公开、免费、可日频拉取,而且直接反映散户的注意力——谷歌趋势(Google Trends)。2013 年 Preis 等人那篇著名的论文发现:当「债务」「危机」类搜索量飙升,股市随后几天的波动会显著抬升。注意力,先于波动。

这件事对量化有意义:如果搜索量能提前预示波动,那你就可以在恐慌搜索抬头时降杠杆、买波动率,而不是等暴跌发生再补救。但搜索量预测的是波动还是方向?这两件事天差地别。本文用一组自洽合成数据,把「搜索量 → 短期波动」做成可检验的实验,并诚实告诉你它的边界在哪里。

一、造一条搜索量曲线#

真实的 Google Trends 给的是 0–100 的相对指数(不是绝对搜索次数),且带有明显的恐慌 / 狂热尖峰。我们合成一条日度指数:基线 50 均值回复,叠加多起恐慌事件(指数衰减),再叠噪声:

import numpy as np

N = 1500                              # 1500 交易日 ≈ 6 年
trend = np.zeros(N)
events = {120: 45, 380: 60, 650: 50, 900: 70, 1150: 55, 1380: 48}
shock = np.zeros(N)
for d, s in events.items():          # 恐慌/狂热尖峰 + 指数衰减
    for k in range(10):
        if d + k < N:
            shock[d + k] += s * np.exp(-k / 3.5)
trend[0] = 50
for t in range(1, N):
    trend[t] = trend[t-1] + 0.20 * (50 - trend[t-1]) + np.random.normal(0, 2.5) + shock[t]
trend = np.clip(trend, 5, 100)
python

图 1 就是这条曲线:平时在 50 上下,遇到危机事件会窜到 90+、然后缓缓回落。红虚线标出那些事件日。

合成搜索量指数:恐慌/狂热尖峰(指数衰减)

二、搜索量如何进波动:GARCH + 水平信号#

我们让资产收益的真实波动由 GARCH(1,1) 驱动(日波动常态约 0.8%),并加一条关键规则:搜索量水平越高于基线,未来波动被乘得越大(封顶 +50%)。这对应 Preis 的「水平信号」——不是搜索量在涨,而是它已经很高这件事,预示恐慌。

mu = 0.0004
omega, alpha, beta = 0.0000030, 0.10, 0.85   # 持久性 0.95
sigma = np.zeros(N); sigma[0] = 0.012
ret = np.zeros(N)
for t in range(1, N):
    excess = max(trend[t] - 50, 0) / 50.0      # 0 ~ 1
    vol_boost = 1.0 + 1.5 * excess             # 恐慌搜索→波动乘数(封顶 +50%)
    sig2 = omega + alpha * ret[t-1]**2 + beta * sigma[t-1]**2
    sigma[t] = min(np.sqrt(max(sig2, 1e-8)) * vol_boost, 0.06)
    ret[t] = mu + sigma[t] * np.random.standard_normal()
rv5 = np.array([np.sqrt(np.sum(ret[t:t+5]**2)) for t in range(N-5)])   # 未来 5 日已实现波动
python

图 2 把「未来 5 日已实现波动」(蓝)和搜索量(橙,右轴)叠在一起:你能看到搜索量尖峰之后,波动几乎总是跟着抬头——领先关系肉眼可见。

搜索量水平尖峰领先于未来波动上行(另类情绪前瞻)

三、预测能力:样本外 R²#

光看图不够,要量化。用滞后一日的搜索量水平(标准化)去预测未来 5 日已实现波动,算样本外 R²:

trend_std = (trend - trend.mean()) / trend.std()
X = np.column_stack([np.ones(N-6), trend_std[:N-6]])
coef, *_ = np.linalg.lstsq(X, rv5[:N-6], rcond=None)
pred = X @ coef
ss_res = np.sum((rv5[:N-6] - pred)**2)
ss_tot = np.sum((rv5[:N-6] - rv5[:N-6].mean())**2)
oos_r2 = 1 - ss_res / ss_tot          # 样本外 R²
python

图 3 给出散点 + 拟合线,样本外 R² = 0.073,斜率 +0.0128。注意这个 R² 是正数但只有 7%——这是一个真实存在但很弱的信号,不是点石成金的魔法。任何号称搜索量能精准预测涨跌的,基本都在过拟合。

搜索量水平 → 未来 5 日波动:样本外 R² = 0.073

四、机制验证:高 vs 低搜索量日#

把交易日按搜索量水平切开(图 4):

  • 高搜索量日(>75 分位)后 5 日平均已实现波动 = 11.7%
  • 低搜索量日(<25 分位)后 5 日平均已实现波动 = 7.5%

差了约 4.2 个百分点。机制成立:恐慌搜索抬头后,市场确实更颠。但请记住——波动不等于方向。高波动可能大涨也可能大跌,搜索量本身不告诉你往哪边。

高 vs 低搜索量日:后续 5 日平均已实现波动

五、朴素应用:高搜索量降杠杆#

最简单的落地:高搜索量期把杠杆从 1.0 降到 0.3(其余维持满仓),看回撤是否改善:

lev = np.where(trend[5:N] > np.percentile(trend[5:N], 75), 0.3, 1.0)
nav_full = np.cumprod(1 + ret[5:N])
nav_timing = np.cumprod(1 + lev * ret[5:N])
python

图 5 是两条净值。结果很诚实:

  • 满仓:最大回撤 −98.7%
  • 高搜索量降杠杆:最大回撤 −91.7%

回撤改善了约 7 个点,但两者都是巨额亏损——因为在我们的合成设定里,资产本身带杠杆且波动大,降杠杆只是减速,不是避险。这恰恰说明:搜索量信号适合做风险预算微调,不适合做主要收益来源

恐慌择时:高搜索量期降杠杆,回撤改善

六、诚实陷阱#

  1. 它预测波动,不预测方向:这是最大的误区。搜索量飙升告诉你「要颠了」,不告诉你「往哪颠」。用它做方向择时必亏,用它做波动率 / 杠杆管理才对路。
  2. 代理偏差:Google Trends 是零售搜索,机构决策不在这里发生。它捕捉的是「散户注意力」,对散户主导的市场(加密、meme 股、A 股散户情绪)更强,对机构主导的大盘蓝筹较弱。
  3. 可得性与频率:Trends 是周 / 日相对指数,且有采样噪声;用它的「实时值」做日内交易不现实,最稳的是做日频到周频的风险信号。
  4. 过拟合福音:7% 的 R² 很容易被研究者「优化」成 30%——换关键词、加滞后、挑样本期,都会虚高。本文坚持样本外、单变量,就是为了不骗你。
  5. 主题依赖:不同关键词(debt / crash / bitcoin)对不同资产有效,不能「一个搜索量打天下」。要按标的选词。
  6. 幸存者偏差:合成里事件是塞进去的,真实里「黑天鹅」样本极少,统计意义有限,实盘要保守。

七、落地清单#

  • 信号层:拉取与目标资产相关的关键词 Trends(如标普用 stock market crash,加密用 bitcoin price),做日频标准化;
  • 建模层:用滞后水平预测未来 5–21 日已实现波动(GARCH 对照),只取显著为正的子集;
  • 执行层:把预测波动反推成目标杠杆(波动高 → 降杠杆),不用于方向下单;
  • 监控层:定期重算样本外 R²,一旦衰减到接近 0,说明该信号已失效(注意力结构变了)。

结语#

谷歌趋势是另类数据里最平民的一个:公开、免费、日频。本文用自洽合成证明,搜索量水平确实是领先于波动的信号——样本外 R² = 0.073、高搜索量日后 5 日波动 11.7% vs 低量日 7.5%,机制成立。但朴素降杠杆只把回撤从 −98.7% 改善到 −91.7%,因为它本质是风险信号不是收益信号。结论很克制:用搜索量管理波动和杠杆,别用它赌方向;用样本外的单变量看真实力度,别被优化出来的高 R² 骗了。 注意力先于波动,但注意力不替你选方向。

谷歌趋势作为另类情绪信号:用搜索量预测短期波动
https://blog.halo26812.eu.org/blog/google-trends-sentiment
Author halo
Published at 2026年7月20日
版权声明 CC BY-NC-SA 4.0
Comment seems to stuck. Try to refresh?✨