这个标题其实是三篇连续研究里的中间一篇,前面一章是情感类信号,后面一章大概率要落到组合层面的合成与容量问题。而第二章单独拎出“新闻Alpha”来讲,是有原因的:新闻数据看起来人人都能拿到,真正把它做成可交易的信号,中间全是工程和统计上的坑。这篇就围绕“新闻Alpha到底在赚什么钱、数据怎么洗、信号怎么构造、回测怎么避免自欺欺人”展开,给正在做或准备做新闻类另类数据策略的朋友一份可以直接拿走的路线图。
1. 先拆标题:News Alpha是在找哪一段收益?
1.1 新闻Alpha的定义和“Alpha”的分工
很多人一听到新闻Alpha,就以为是“用新闻预测股价涨跌”。这个理解不够精确。如果单纯预测方向,你预测出来的收益里往往混着市场涨跌、行业轮动、小盘风格这些成分。那些收益不是Alpha,是Beta或风格暴露。真正意义上的新闻Alpha,是指把新闻事件、新闻文本情绪作为信息增量,在同一条时间线上剔除了常见风险因子(市场、行业、市值、价值、动量等)之后,依然能stable地贡献的那部分超额收益。
所以做News Alpha的研究,最先要做的事情不是跑NLP模型,而是给这个Alpha划定边界。我习惯定义一个简单口径:针对某个公司,事件信息公开后的[T0, T0+n]窗口内,用事件后收益减去“按照历史Beta和市场收益推测的期望收益”,再减去“若该股处在动量队列中应该获得的风格收益”,剩下的部分,才是你宣称要被新闻所解释的增量。这样在后期归因时,不会把“今天大盘涨了所以持仓涨了”误算到新闻头上。
另一种更细的分工方式是按信息类型切分。把新闻分为宏观新闻、行业新闻、个股新闻。新闻Alpha通常更多来自个股新闻和行业新闻,宏观新闻虽然可以产生趋势性行情,但对单只股票的Alpha贡献一般需要被下游的因子模型吸收。因此,在做数据表设计时,一开始就把新闻的“主体层级”打标到个股、行业、宏观三个字段上,后续再切成信号时会省掉大量麻烦。
1.2 为什么新闻能形成Alpha:市场反应链条
价格对新闻的反应不是瞬间完成的。一条信息从出现到被定价,通常要经过五个环节:事件发生、媒体报道、投资者阅读、交易执行、价格回归。只要链条上任何一个环节存在速度差或理解差,暂时性错误定价就出现了。新闻Alpha的赚头,本质来自两类低效:第一类是速度低效,少数人比多数人先看到信息并先行动;第二类是理解低效,同样一条新闻,有人解读为利好,有人解读为利空,资金之间形成分歧,导致价格向合理估值靠拢的过程被拖延。
举个例子来说,某家公司发布公告称核心产品获得了监管批准。理论上这是明确利好,但如果公告文本有大量法律措辞,普通读者很难不借助工具立刻判断影响方向和幅度。当事件确认后,专业资金会在几秒内下单,而更广泛的投资者会在当天收盘后阅读券商解读,在第二天或第三天继续买入。这就是一个可以捕捉的定价窗口。
行情数据里面也有证据:对重大公司新闻,股价往往不是一次性跳到位,而是会出现连续两三天的漂移,行业内叫Post-Earnings-Announcement Drift的变体。虽然这个漂移幅度逐年减小,但在中小市值、覆盖度较低的股票上依然显著。News Alpha的主要目标就是把这部分漂移变成可重复的策略逻辑,而不是押注某一条新闻一定导致股价涨停。
1.3 与Sentiment Alpha的区别和关联
系列的第一篇处理的是情感信号,通常做法是对社交媒体、新闻文本测情绪得分,然后构建一个横截面的情绪因子,高情绪买入、低情绪卖出。News Alpha更像是一个事件驱动的窄口径策略型信号,核心是“某个主体、某个类型的事件、某个时点发生了”,伴随的文本情绪只是该事件的一个属性,而不是全部。
实际研究中这两者都需要,但融合顺序有讲究。我倾向于用情感信号做股票池层的打分,用新闻Alpha做事件触发层的增强。情感信号回答的是“市场对这只股票的关注和情绪处于什么状态”,新闻Alpha回答的是“当前这个具体消息出来,是否构成新的边际变化”。如果在同一只股票上,情感分偏低但突发新闻给出重大正面事件,反而是更好的介入机会;反过来,情绪分很高但新闻已经进入密集报道的晚期,再进场的性价比就很差。
这一章把News Alpha单独拆出来深挖,是因为它的数据流、事件定义和回测口径都与Sentiment有较大差异。不清楚边界就把两层揉在一起,最后无论哪个信号失效都很难定位问题。
2. 数据准备:构建新闻Alpha七分在数据,三分在特征
2.1 用事件表字段设计倒推数据源要求
做新闻Alpha,很多团队一开始买的是现成的新闻数据库,字段很全,看起来明天就能跑模型。真正动手才发现,卖方新闻库给的是“文章”,而策略需要的是“事件”。两者之间差着一层事件结构化处理,这层处理的质量直接决定后面所有特征的纯度。
我最终沉淀下来的核心数据结构是一张扁平事件表,每条记录表示“在某个时点,某家公司发生了某类事件”。关键字段包括:事件主键、相关主体代码、一级事件类型、二级事件类别、事件方向、事件强度、新闻源ID、首发时间戳、数据入库时间戳、源链接、原文本。这里最容易被忽略的是“事件主键”,它不是某条新闻的ID,而是同一事件被多家媒体报道时共用的唯一标识。如果缺失这个字段,后面做去重和新鲜度时会出现反复计算同一条信息的灾难性问题。
数据源选择也存在一个常见误区:买越多供应商越好。我曾经同时接了三家新闻源,以为这样覆盖率更高,结果同一家公司的同一事件一天内出现上百条转载,处理量翻了十几倍,事件主键反而更难统一。后来调整思路,按用途分工选源:官方公告与监管披露作为“事实源”,财经通讯社的实时流作为“速度源”,重要行业媒体作为“解读源”。事实源用来确认事件,速度源用来决定首发时点,解读源用来补充观点型情感。三方各司其职,错误率显著下降。
2.2 时间戳口径的三个坑
新闻时间戳是整条链路里最考验细节的部分。分享三个我踩过、也帮朋友排查过的坑:
首先是时区问题。不少国际新闻API返回的是UTC时间,而A股行情的时间戳是北京时间。写代码时一旦忘记加时区转换,所有盘中新闻都会偏移8小时,回测中会出现灾难性的未来函数。我的建议是,任何新闻数据入库时统一转成Asia/Shanghai时区的本地时间,并且把原始时区信息单独存到一个字段里,方便追溯。
第二个坑是发布时间不等于事件发生时间。很多深度报道是滞后对事件的复盘,落款时间可能是晚上八点,报道的事件却发生在当天下午两点。如果是重大事件,盘中两点已经有资金异动,晚间新闻再做信号就属于接盘。对这类滞后新闻要做“报道时点”与“内容涉及事件时点”的区分,至少打一个报道延迟标签,供下游决定是否跳过。
第三个坑是爬虫或新闻API入库的时间往往晚于实际发布数秒甚至数分钟。新闻数据商的传输链路会经历采集、规整、分发多个环节,入库时间并不等于对外发布时间。所以在研究环境里必须使用新闻中的发布时间字段,生产环境使用对方提供的发布时间或交易所原始时间戳,绝不能拿本地数据库的insert_time当事件发生时间。
2.3 文本清洗和主体匹配的工程步骤
主体匹配是中文场景下特别容易翻车的环节。一家公司在不同新闻里可能叫全称,比如“三一重工股份有限公司”,也叫简称“三一重工”,还有可能被称作“三一”。如果只做字符串包含,很容易漏识别或错配到同名公司。我建议把主体匹配做成两步:第一步做一个公司名词典,收录股票代码、公司全名、常用简称、历史曾用名;第二步先用词典做最大匹配,再用正则或NER识别出候选主体,最后用股票代码映射表做一次交叉验证。
公司名和股票代码之间也不是一一对应的。一只A股有代码,其母公司、子公司也可能出现在新闻里。子公司的重大合同不一定直接利好上市公司,但也未必毫无影响。我目前的规则是:直接命中的按主线处理;子母公司关系纳入专业机构股权库的,打一个“间接关联”标签,信号权重做半衰折扣,由研究参数决定。
文本去噪层同样要严格。网页HTML标签、记者署名、版权声明、相关推荐链接都属于噪声。新闻正文一般只保留标题+导语+正文三部分,其中标题权重最高。情感分析里,如果把“股市有风险,投资需谨慎”这类模板句也算进去,整体情绪得分会被严重稀释。要准备一套行业词库做句子级过滤:句子里含无实质信息模板词,如“仅供参考”“不构成投资建议”,就直接剔除该句,不参与特征计算。
3. 把新闻文本变成可以回测的信号
3.1 事件分类与影响方向判断
新闻文本转化为信号的第一步,不是问“这句话积极还是消极”,而是问“这属于哪类事件”。因为新闻的情绪方向必须跟事件类型一起解读才有意义。比如“某公司被下调评级”是负面,但如果原文同时还说“下调至持有,但维持目标价不变”,整条新闻的净影响就不是那么强。我常用的做法是把事件先粗分为八类:业绩类、资本运作类、经营重大合同、监管处罚类、管理层变动类、行业政策类、分析师评级类、宏观数据类。
每类事件对应不同的先验方向。业绩预增、中标大单、获得监管批准是上行事件;被处罚、业绩预亏、实控人质押风险是下行事件。分析师的评级调整则相对复杂,不能只看方向词,要看目标价调整幅度和报告发布前后的市场预期差。
判断影响方向时,纯靠情感模型不够,建议做一个层级规则引擎:第一层用事件类型给先验方向;第二层用情感模型对文本打正负倾向;第三层用一个数值提取器看具体数字,比如“同比+20%”和“同比-20%”会让同一类事件的方向反转。三层结果一致时信号权重最高,不一致时降低权重或标记为低置信事件。
实际操作中我也能感受到,模型跑出来的情感分通常无法区分“事件本身利好但股价已经涨过”和“事件利空但市场麻木”。这时需要引入市场反应校验:新闻发布后3分钟至10分钟的价格涨跌方向,可作为事件真实冲击的参考。但这一参考字段在训练样本里要非常警惕,它带了很强的市场信息,容易造成前视偏差。现在我的做法是,它只用于线上动态调权重,不用于历史标签拟合。
3.2 一条新闻的事件信号构造与新鲜度权重
当一条事件被归类、方向被确定后,需要把它做成数值信号。我常用的信号构造由三个部分乘积组成:方向分、强度分、新鲜度分。方向分取值区间是[-1, 1];强度分由事件类型冲击系数和事件中涉及的财务数字规模共同决定;新鲜度分用于解决同一事件重复报道的问题。
新鲜度分是很多初做新闻策略的团队最容易忽略的点。以同一事件为例,第一条报道出现时市场还没反应,价值最高。五分钟后各大网站开始转载,此时信号边际价值下降。第二天媒体还在做深度跟进,价格往往已经吸收了大部分信息,再把当天新闻加进情绪得分就是最典型的重复计算。
我推荐用事件主键而不是新闻标题来去重。事件首发后,在一个有效窗口比如两小时内出现的所有后续报道,只保留首发新闻的原始冲击,后续报道的文本特征通通不进事件级信号,只作为确认信号,可能增加少量置信度。窗口之外如果出现有增量信息的调查报道或公司澄清公告,要把它视为新事件,重新计算事件主键。
信号聚合到个股层面时也要想清楚频率。新闻事件本身是稀疏的,如果直接把“当天有正面新闻的股票都买入”,会把很多没有新闻的股票排除在股票池外。更好的做法是构建一个以日为单位的新闻评分,无新闻日为中性分0,有正面事件得分加正数,有负面事件得分为负数。这样横截面上个股之间可比较,同时保留了无事件股票作为对照组。
3.3 与量价因子和Sentiment信号的衔接原则
新闻Alpha单独的IC一般不低,但把它直接放进多因子模型很容易与已有量价因子产生共线性,因为价格中已经包含了对过去新闻的反映。为了让自己构建的新闻因子是增量信息,而不是另一个翻版的短期反转因子,需要在入库前做一次正交化处理。
做得比较朴素但有实效的做法是:把当日新闻因子值对若干个关键因子做线性回归,比如换手率变化、过去5日动量、波动率,取残差作为纯新闻增量。如果残差几乎为零,说明新闻内容已经被盘面交易提前消化,信号价值很低。这种情况下不要硬构造因子,应该回去检查新闻源首报延迟与事件时点识别。
和上一章情感信号的配合,更建议分层嵌套而不是相加。先用情感因子圈定一个可交易池,比如当周情感分处在全市场前40%以内;然后在池内按新闻事件强弱排序,只接强度超过阈值的正面事件。这么做的好处是:情感池过滤掉了没热度、没关注度、交易不活跃的股票;新闻事件层解决了入场时点问题。两者结合下来,持仓数量会明显少于单用情感的策略,单笔事件胜率和盈亏比也更可控。
4. 事件研究法回测框架与关键参数设置
4.1 事件日的取值与异常收益计算
新闻Alpha的回测更适合用事件研究法。第一步要设定“事件日T0”,这是一个非常需要斟酌的时点。我建议在盘中策略中使用新闻发布时间作为T0,但匹配行情时用下一个可成交时点;在日频研究中则用新闻发布后的第一个交易日收盘作为T0,此时价量数据都已完全公开。绝对禁止把新闻发布当天的开盘价当成事件前价格,因为如果新闻是盘前发布的,开盘价已经包含了新闻影响,用它将导致事件“看不到收益”。
异常收益计算我会基于一个简约的市场模型:AR = 个股日收益率减去市场指数日收益率,再减去稳健估计的Beta乘以市场超额收益。个股Beta用过去120个交易日数据估算即可,行业属性强的时候再考虑加入行业指数作为第二个回归因子。对没有足够历史数据的新股,事件窗口样本直接剔除,不参与统计。
事件窗口长度的选择取决于策略交易频率。如果目标是捕捉几小时内的脉冲行情,窗口用分钟级数据,T0标记为新闻发布后第5分钟,观察未来30分钟到120分钟的价格变化。如果研究的是日频持仓,事件窗口建议用[1, 3]个交易日,也就是新闻发布后第二天到第四天,这样既能容纳市场消化信息所需时间,也避免过长窗口引入更多噪声。
4.2 分层回测组与持仓规则设计
一个扎实的新闻Alpha回测,不要只看单一策略的净值,而是要做“事件分层回测”。每天把所有事件按信号分数从高到低排序,分成5层或10层,计算每一层在下一个持仓期内的平均收益率。理想状态应该是信号分越高、收益越高,并且最低层的收益要明显跑输最高层。如果只有第一层有超额,其余层收益乱序,说明因子只在极端事件上有效,策略容量和稳定性都比较差。
持仓规则要明确三点:持仓数量上限、单标的权重上限、事件间是否允许重复持仓。持仓数量我一般限制在10到30只,太少则单事件冲击太大,太多则事件Alpha被不相关事件稀释。单标的权重上限5%或10%都可用,取决于回测起始资金和该标的流动性。如果同一标的一天内出现多个相近方向的事件,不重复加仓,只允许按最早事件的建仓价计一次仓。
换手率是一个要提前准备的约束项。新闻事件驱动策略天然高换手,有些事件窗口只有一两天,持有期结束就要卖出,一个月下来换手率可能超过500%。这时候在不考虑交易成本的回测里收益可能很漂亮,但扣除双边手续费和冲击成本后利润所剩无几。建议在两个地方设置成本:固定成本按双边千分之二或更多,冲击成本按该股票过去20日平均成交额的一定比例动态计算。
4.3 注意三类容易高估收益的偏差
第一类是未来函数偏差。新闻带的时间戳如果晚于价格对事件产生反应的时间,比如新闻源实际发布时间是15:30但API记录为16:00,而当天14:30股价已经因传闻异动,那回测中把16:00的信号对应到次日开盘买入,看似正确,实际上信号来源里可能混入了盘中的量价异动信息;真实盘口在14:30还没有这条公开新闻,策略根本不会触发。排查方式很简单:抽出几条重大新闻,人工核对新闻发布时间和当天该股5分钟级K线的关系;如果大量事件发生在“价格异动后超过15分钟”才出新闻,就要把这个新闻源单独标记为慢速源。
第二类是幸存者偏差,尤其是在用当前时间点的成分股和退市规则来回测过去五年的新闻数据集时,过去发生过的退市股新闻会缺失,那些业绩暴雷之后一蹶不振的样本恰好也没收到新闻流,结果就是负面新闻类别不完整,回测结果系统性偏乐观。必须用历史时点的股票列表和历史时间点的新闻库做匹配,也就是做一次时点快照对齐。
第三类是事件数量偏少导致的标准误偏差。新闻事件不像量价数据那样每天全市场都有,一个月可能只有几百个高质量事件,分配到各个行业后,每个分组只有十几个样本。这样如果多空组合收益靠一两笔极端正收益事件支撑,统计检验上往往不显著。在回测报告里,除了看年化收益和夏普,还要看每层事件的数量以及收益的标准误差,至少保证每个分层的样本量在统计学上能说出故事。
5. 常见信号失效场景与排错实录
5.1 事件重大但组合没有跑出超额
这是被问得最多的一种情况:模型明明识别出一条很有价值的新闻,买入后股票却没怎么涨。我总结下来,问题多数不出在NLP或信号层面,而出在“这个事件对当前市场价格而言到底算不算意外”。比如一家公司已经连续发布三次业绩预告,都是超预期,等到正式财报出来又是超预期,这本身不再是意外信息,而是已经被市场定价的均值回归过程。这类事件在事件分层中如果仍然被赋予很高分数,就会拉低策略表现。
解决办法是在事件录入前增加一个预期差模块。对业绩类事件,可以把一致预期数据同步到新闻流里,文本说“净利同比增长50%”,和一致预期增长40%比较,超过的部分才算正面冲击。如果新闻内容与预期持平,无论文本措辞多积极,都应降为中性事件。在缺乏一致预期数据的场景里,可以用该股过去40日价格趋势作为代理预期,股价已上涨20%时再出普通利好,事件分数打折。
还有一种事件冷启动的情况值得记录:新闻本身是真正的增量利好,但个股流通盘过小,单笔大单买进后几乎没有后续接盘。结果是策略盈利停留在账面上,卖出时反而要用数日甚至数周时间才出得去。对这种股票,回测无法处理流动性成本,实盘几乎无法处理冲击成本。建议把事件股票池里日均成交额低于某个界线的标的直接剔除,宁可错过,也不能让回测容量失真。
5.2 跳空和停牌导致价格已无法介入
重大新闻经常伴随两种特殊行情:第二天直接涨停开或一字板封死,以及消息公布前后临时停牌。对一字板涨停股,回测在涨停价给你反馈可以买入,但真实环境里大概率挂单排队也排不上;对停牌股,复盘后的价格往往已经一步到位,事件窗口内的收益无法稳定获取。
处理方式给三个建议。其一,识别一字板:事件日当天开盘价等于最高价并封死涨停时,只在排板成功的假设下才允许成交,或者直接把这种样本从可交易样本中剔除。其二,对涨停股买入价加入涨跌停约束,无法在涨停价买入就不纳入组合。其三,停牌股票买入后若复牌时间超过N天,按冻结资金处理且不计入事件日;复牌后新闻已经老化,信号权重需要重新评估。这样虽然看起来损失了很多高收益样本,但在实盘可复制性上更扎实。
5.3 同一事件被刷屏导致重复计算
前面提到用事件主键做去重,但有几种反例会突破主键的设计。第一种是券商研究员在事件后发布深度报告,标题和新闻事件指向同一结果,但报告包含额外的盈利预测调整信息,这样应该当作新信号处理。第二种是公司对媒体报道发布澄清公告,虽然是同一事件,但澄清内容可能改变事件方向,需要修正原事件而不是新增事件。第三种是同一行业多家公司同时受同一政策影响,此时事件主体的粒度应该一度上升到行业层面,而不是在个股层面留下重复记录。
排查是否重复计算有一个简单的方法:把一段时间内同一主体被触发的事件按时间排序,查看相邻事件的时间差和内容相似度。如果同一事件在三天内反复出现但事件主键不一致,去重函数肯定有漏洞。可以引入文本相似度阈值,两条新闻事件余弦相似度超过0.85时,自动合并成同一事件,保留第一次出现的时间戳并把后一条被合并的原文挪进备注字段。
5.4 快速自查清单:新闻回测结果异常时先看一遍
结果过于惊艳或失效无收益时,检查以下节点,大多数问题能暴露出来。
新闻侧:时间戳是否统一转换到标的所在交易所时区;是否使用入库时间作为事件时间;是否有按事件主键做去重;文本清洗是否过滤了免责声明和模板段落;主体匹配是否覆盖公司简称和曾用名;是否区分首报与跟随报道。
行情侧:事件日是否匹配到新闻发布后第一个可成交时点;是否处理了一字板和停牌;收益率计算是否使用当日开盘价或VWAP,而不是收盘价;交易成本是否覆盖双边费用和冲击成本。
信号侧:事件分类是否覆盖所有重要类型;是否存在用市场反应数据反推标签的循环逻辑;因子是否与动量因子做过正交化;正面新闻出现在经过一段时间大幅上涨的股票上时,是否施加了预期差调整。
统计侧:样本期间是否横跨牛熊两端;每个事件分层是否有足够样本数;超额收益来源是否集中在少数个股或少数行业;夏普通常不高时,是否存在靠尾部大额正收益撑起来的幻觉。
6. 工程化要点与系列衔接心得
6.1 新闻流的延迟预算应该压到多低
新闻Alpha策略对延迟的敏感程度取决于持仓周期。如果持仓周期是几天,新闻延迟两三分钟影响不大,因为你有足够时间在收盘前完成建仓,甚至会等到第二天开盘再操作。如果是日内脉冲策略,处理要求就完全不同,新闻从发布到你的策略发出下单指令之间,延迟每慢一秒钟都可能损失一段利润。针对日频以上的策略,把研究重心放在事件清洗和去重质量上,比盲目追求毫秒级低延迟价值更大。
我实际把整条处理链路拆成三段来看延迟:数据厂商分发时延、内部解析和特征计算时延、信号到交易系统的发送时延。绝大多数团队真正瓶颈在中段:文本解析和模型推理串行跑,单条新闻处理耗时几十甚至上百毫秒,看起来不慢,但盘中高波峰时积压数据会迅速形成几十秒延迟,策略表现明显劣于回测。解决思路是给新闻解析服务做并发处理,并给每个优先级打标,财报、业绩预警这类强事件优先处理,普通快讯可以延后。
回测环境里也要注意模拟这样的延迟结构。如果回测假设所有信号都在毫秒级别产生、下一秒就能交易,这个假设在生产环境无法满足。最简单的方式是回测时给每条事件统一加上延迟时间,比如假设所有信号在新闻发布后5秒得到,再统一增加网络传输和交易系统处理的缓冲,对稳妥性很有帮助。
6.2 从第一版到第三版的迭代心得
这套新闻数据流和信号框架,我是从第三版开始才感觉能用。第一版直接拿“新闻情绪得分”作为横截面因子,结果它和短期反转因子相关性极高,新闻源里大量冗余报道又把信号干扰得不成样子。第二版加入事件分类和主体识别,信号变得更干净,但回测中高估了收益,原因出在没有合理处理一字板和事件时间戳。第三版才把事件主键去重、预期差校验、分层回归正交化这些环节补齐。
回过头看,真正带来持续稳定的部分并不是用了多高级的预训练模型,而是每天都在维护的事件规则和主体词典。语言模型的精度固然影响情感计算,但一套高质量事件分类器配上严格的时间处理,对News Alpha的贡献会更直接。这里也有一些经验想在收尾时多说一句:新闻是人类写的,里面大量信息是冗余的、情绪化的、重复的,策略要做的是从噪声中找到结构性意外,而不是让模型学会预测新闻接下来会怎么写。
第一章、第二章拆开分别处理情感与新闻,到第三章做融合时你已经有了两张结构化资产表。到时候更大的难点会是权重估计:两个信号各自有效但重叠度高时,如何分配权重使组合的风险收益特征最优。我的建议是在信号入库阶段就保留每次计算的原始字段,不要只存最终因子分。系列走到后半程时,样本级的数据回溯能力是财富,否则一旦融合结果不理想,你很难定位究竟是情感模块变了、新闻主键漂移了,还是两者组合时的方法出了偏差。
下一次发布第三章时,大概率会用一个若干年横跨市场周期的事件面板来展示两者融合后的结果。在此之前,把本章的数据清洗、事件分层和去偏差逻辑先跑顺手,比急着上模型更有意义。