AMPARIES

量化轮动系统建设手记(二):新闻与事件——与限流斗智斗勇

2026-09-15 · 数智实践

行情数据的世界是安静的:数字、表格、收盘。而新闻数据的世界是喧闹的:每天几千条消息从几十个来源涌进来,还带着「你请求太快」的耳光。这篇记录把新闻变成可用数据的全过程——以及一场至今仍在进行的限流博弈。

一、新闻 → 板块:给每一条消息找到"归属"

要让新闻对轮动模型有用,第一步是把「一条消息」映射到「一个行业」。我们建了一张实体→行业映射词典,四层匹配、由精确到宽松:

实际运行:1617 条词典条目,把近期新闻中「带实体的文章」的 26%完成了板块归集——其余多为人物、国家等不适合映射的实体。产出一张「板块 × 日期」的热度表(条数 + 重要性加权 + 代表性标题),每日自动刷新。

二、事件抽取引擎:把消息变成"事件"

热度只是量,事件才是质。规则版引擎把新闻归类成 8 类事件并打上方向标签:

事件类型识别要点(示例)
货币政策 / 通胀数据利率、降准降息、CPI/PPI 等宏观数据
地缘冲突 / 能源供给冲突、制裁、管道、减产、油价
产业政策 / 监管处罚规划、补贴、立案、处罚、退市
公司业绩 / 并购重组财报、预增预减、收购合并

每条事件带:日期、类型、方向(利好/利空/中性)、关联板块、相关主体。首轮跑出三千多条事件。随后上线的事件研究统计会持续计算「事件发生后 T+1/T+3/T+5 天相关板块的超额收益与命中率」——样本每天自动累积,为将来的「事件条件化」信号打地基。

三、历史新闻:两座大山

自有采集只能从「今天」开始积累,而回测需要「过去」。我们找了两条公开历史数据通道:

四、GDELT 限流战:从 2340 次请求到 200 次

GDELT 文档接口对匿名调用施以极严格限流("one every 5 seconds"),实测几个出口 IP 都会收到 429。原计划是「逐月拉取」:10 个主题 × 2 种口径 × 117 个月 = 2340 次请求——在实测出的节流节奏下,这个量级要跑几十天,基本不可行。

转折来自两个发现:

  1. 「年窗口」可用:把请求窗口从一个月放大到一整年,一次就能取回全年 365 天的逐日数据,请求数从 2340 降到 200 次
  2. 多出口并行:不同服务器的出口 IP 有独立的限流额度,于是「主站 + 云主机」双通道各跑一半。

工程细节同样重要:自适应退避(被限流就等 2 分钟起步、逐级拉长,成功后立即恢复快节奏)、分片断点续跑(任何时候中断都能续)、看门狗(每 6 小时检查进程,死了自动拉起,跑完自动收工)。目前仍在后台慢慢啃这批数据——这类任务恰当的形态是「无人值守的一周」,而不是「盯一晚上」。

经验小结

免责声明:本系列为个人技术研究记录,所述系统为个人研究工具,不构成任何投资建议。