4. 搜索指数异常定义

在构建投资者关注因子时,最核心的问题不是“搜索量有多少”,而是“当前搜索量相对于它应有的水平,是否出现了异常”。搜索指数本身具有强烈的季节性、趋势性和事件驱动特征:春节前后、财报季、政策发布窗口都会带来规律性波动,而突发事件、舆情危机、产品发布则会带来脉冲式跳升。因此,异常定义必须同时回答三个问题:基准是什么、偏离多大算异常、异常持续多久有意义。本节围绕异常识别标准、同比环比、z-score 与分位数四类方法展开,并给出可落地的判定流程。

一、核心原理:异常是“相对基准的偏离”,不是绝对高低

搜索指数的原始值没有可比性。一个日均 5000 的关键词和一个日均 500 的关键词,同样上涨 200,含义完全不同。因此异常识别的第一步是构造基准序列,第二步是度量偏离程度,第三步是设定阈值并做持续性过滤。

基准的构造方式决定了异常的经济含义。同比基准回答“今年比去年同一时期是否异常”,适合剔除年度季节性和长期趋势;环比基准回答“比上一个周期是否异常”,对短期变化更敏感,但容易受节假日错位干扰;滚动均值基准回答“相对于最近一段时间的常态是否异常”,适合捕捉趋势变化但会滞后;分位数基准回答“当前值在历史分布中的位置”,对厚尾和极端值更稳健。

关键判断:异常识别不是找一个“万能阈值”,而是根据因子的使用场景选择基准。若用于事件驱动策略,应优先选择对短期脉冲敏感的环比与 z-score;若用于中长期关注度趋势,应优先选择同比与滚动分位数。

二、四类方法:同比环比、z-score、分位数与组合判定

同比与环比是最直观的方法。同比计算为当前值除以上年同期值减一,环比计算为当前值除以上一周期值减一。它们的优点是解释性强、业务方容易接受;缺点是当基期本身异常时会产生误导。例如去年同月因突发事件搜索量暴涨,今年同比就会显示“大幅下降”,但这并不代表关注度真的萎缩。

z-score 方法将当前值减去滚动均值再除以滚动标准差,得到标准化的偏离程度。通常以 |z| > 2 或 |z| > 3 作为异常阈值。z-score 的优点是量纲统一、便于跨关键词比较;缺点是对极端值敏感,且要求序列近似正态。搜索指数往往右偏厚尾,因此实践中常配合对数变换或使用稳健 z-score(基于中位数和 MAD)。

分位数方法不假设分布形态,直接看当前值在历史窗口中的分位位置。例如超过过去 250 个交易日搜索指数的 95% 分位,即判定为高异常;低于 5% 分位判定为低异常。分位数方法对厚尾和离群点更稳健,但需要足够长的历史窗口,且分位数本身会随窗口滚动而变化。

实际工程中,单一方法容易误报。推荐采用组合判定:先用同比或环比做粗筛,再用 z-score 或分位数做精筛,最后用持续性规则过滤单日噪声。例如要求连续 2 个交易日 z-score 超过阈值,或 5 日内至少 3 日超过分位阈值,才认定为有效异常。

搜索指数异常识别:四类方法与组合判定 同比 / 环比 基准:上年同期 / 上一周期 优点:直观、可解释 风险:基期异常会误导 z-score 基准:滚动均值与标准差 优点:量纲统一、可跨词比较 风险:对极端值敏感 分位数 基准:历史分布位置 优点:稳健、不假设分布 风险:需足够长历史窗口 组合判定 粗筛 + 精筛 + 持续性 降低误报与漏报 推荐生产使用 组合判定规则示例: ① 同比或环比粗筛 → ② z-score > 2 或分位数 > 95% 精筛 → ③ 连续 2 日或 5 日内 3 日满足 → ④ 标记为有效异常 输出:异常标记序列(0/1)、异常强度(z 值或分位距)、异常持续天数,作为投资者关注因子的原始输入。 注意:阈值需按关键词类别分层设定,避免用同一套参数覆盖所有搜索词。

三、方法流程:从原始指数到异常标记

下面给出一个可复用的处理流程,适用于日频搜索指数。核心思路是:先做平稳化与基准构造,再计算偏离度,最后做阈值判定与持续性过滤。

输入:关键词日频搜索指数 series,窗口 W=250,阈值 z_th=2.0,分位 q=0.95

步骤 1  缺失值与停牌日处理:线性插值,剔除无搜索数据的日期
步骤 2  平稳化:对 series 取对数 log_series = ln(1 + series)
步骤 3  基准构造:
        滚动均值 mean_t = rolling_mean(log_series, W)
        滚动标准差 std_t = rolling_std(log_series, W)
        滚动中位数 median_t = rolling_median(log_series, W)
        MAD_t = rolling_median(|log_series - median_t|, W)
步骤 4  偏离度计算:
        z_t = (log_series_t - mean_t) / std_t
        robust_z_t = 0.6745 * (log_series_t - median_t) / MAD_t
        pct_t = rolling_percentile_rank(log_series_t, W)
步骤 5  异常判定:
        flag_z = 1 if |z_t| > z_th else 0
        flag_pct = 1 if pct_t > q or pct_t < 1-q else 0
        flag = flag_z or flag_pct
步骤 6  持续性过滤:
        若连续 2 日 flag=1,或 5 日内 flag 累计 ≥ 3,则最终标记 abnormal=1
步骤 7  输出:abnormal、z_t、pct_t、持续天数 duration
参数建议:窗口 W 不宜过短,否则基准会被近期异常污染;也不宜过长,否则无法反映结构性变化。日频数据常用 120~250 个交易日。z 阈值 2.0 偏敏感,2.5~3.0 偏保守;分位阈值常用 90%、95%、99% 三档,分别对应弱、中、强异常。

四、案例与场景:财报季搜索异常的识别

假设某上市公司关键词“XX 股份”在财报发布前一周搜索指数开始抬升。若只看绝对值,可能只是正常财报季预热;但用组合方法可以区分“季节性抬升”与“真实异常关注”。

日期 搜索指数 同比变化 z-score 分位位置 判定
T-51200+8%0.672%正常
T-41350+12%1.180%正常
T-31800+35%2.393%关注
T-22600+78%3.698%异常
T-13100+95%4.299%异常
T2900+70%3.899%异常
T+11600+20%1.485%回落

从表中可以看到,T-3 日 z-score 已超过 2,分位进入 93%,但同比仅 35%,属于“关注”级别;T-2 日起 z-score 超过 3.5、分位达到 98%,且连续 3 日满足,判定为有效异常。这种分层判定可以避免把正常财报预热误判为强异常,也能在真正脉冲出现时及时捕捉。

常见误区:第一,直接用原始搜索量做阈值,忽略关键词量级差异;第二,只用同比,遇到基期异常时产生反向误判;第三,z-score 不做对数变换,厚尾分布下阈值失效;第四,忽略持续性,把单日噪声当成事件信号;第五,所有关键词共用一套参数,导致大词漏报、小词误报。

五、复盘与优化:让异常定义服务于因子目标

异常定义不是一次性的技术选择,而是需要与因子目标反复对齐的过程。如果因子用于捕捉短期事件冲击,应提高敏感度,接受一定误报;如果用于构建中长期关注度趋势,应提高稳健性,接受一定滞后。建议在回测中同时观察三类指标:异常命中率(真实事件被标记的比例)、误报率(无事件却被标记的比例)、异常持续天数分布。通过调整窗口、阈值和持续性规则,找到与策略收益最匹配的参数组合。

最后需要强调,搜索指数异常只是投资者关注的“代理变量”,它本身不等于交易信号。异常定义的质量决定了后续因子的信噪比。把基准选对、把偏离度量准、把持续性过滤做好,才能让搜索指数异常真正成为可解释、可复现、可迭代的投资者关注因子输入。