ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

新闻Alpha策略实战:从数据清洗到回测防坑指南

新闻Alpha策略实战:从数据清洗到回测防坑指南 这个标题其实是三篇连续研究里的中间一篇前面一章是情感类信号后面一章大概率要落到组合层面的合成与容量问题。而第二章单独拎出“新闻Alpha”来讲是有原因的新闻数据看起来人人都能拿到真正把它做成可交易的信号中间全是工程和统计上的坑。这篇就围绕“新闻Alpha到底在赚什么钱、数据怎么洗、信号怎么构造、回测怎么避免自欺欺人”展开给正在做或准备做新闻类另类数据策略的朋友一份可以直接拿走的路线图。1. 先拆标题News Alpha是在找哪一段收益1.1 新闻Alpha的定义和“Alpha”的分工很多人一听到新闻Alpha就以为是“用新闻预测股价涨跌”。这个理解不够精确。如果单纯预测方向你预测出来的收益里往往混着市场涨跌、行业轮动、小盘风格这些成分。那些收益不是Alpha是Beta或风格暴露。真正意义上的新闻Alpha是指把新闻事件、新闻文本情绪作为信息增量在同一条时间线上剔除了常见风险因子市场、行业、市值、价值、动量等之后依然能stable地贡献的那部分超额收益。所以做News Alpha的研究最先要做的事情不是跑NLP模型而是给这个Alpha划定边界。我习惯定义一个简单口径针对某个公司事件信息公开后的[T0, T0n]窗口内用事件后收益减去“按照历史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的贡献会更直接。这里也有一些经验想在收尾时多说一句新闻是人类写的里面大量信息是冗余的、情绪化的、重复的策略要做的是从噪声中找到结构性意外而不是让模型学会预测新闻接下来会怎么写。第一章、第二章拆开分别处理情感与新闻到第三章做融合时你已经有了两张结构化资产表。到时候更大的难点会是权重估计两个信号各自有效但重叠度高时如何分配权重使组合的风险收益特征最优。我的建议是在信号入库阶段就保留每次计算的原始字段不要只存最终因子分。系列走到后半程时样本级的数据回溯能力是财富否则一旦融合结果不理想你很难定位究竟是情感模块变了、新闻主键漂移了还是两者组合时的方法出了偏差。下一次发布第三章时大概率会用一个若干年横跨市场周期的事件面板来展示两者融合后的结果。在此之前把本章的数据清洗、事件分层和去偏差逻辑先跑顺手比急着上模型更有意义。
返回列表