第 12 课 · 宏观数据与择时

PMI / CPI / 社融是低频慢变量——它们定仓位"水位",不触发交易;LLM 是翻译官,不是预言家

预计用时:35 分钟 上一课:第 11 课 · 研报解读 Agent

这节课你将得到什么

一个能跑的"宏观脉搏"面板 scripts/macro_pulse.py:自动拉取近 12 个月的制造业 PMI、CPI 同比、社融/信贷三条宏观曲线,计算每个指标的边际变化方向(环比改善 / 恶化 / 持平),拼出一句话的"宏观水位"结论,再让 LLM 把数据翻译成仓位水位建议 + 对 A 股风格的含义

但面板只是载体。这节课要建立的认知是三条:第一,宏观数据是月度低频慢变量,它回答"季节"而不是"天气",永远不该进入你的日内决策;第二,宏观解读里"边际变化"比"绝对数值"重要得多;第三,LLM 在这件事里的角色是翻译官——把数字翻译成仓位与风格的含义——而不是预言家。这三条会直接决定你把这节课的组件插进决策系统的哪个位置。

一、宏观数据的节奏:它和你不在同一个时钟上

先看这三类数据的发布节奏(以官方发布日程为准,见延伸阅读):

指标发布方频率与时间它衡量什么
制造业 PMI国家统计局每月最后一天上午,当月数据当月出企业采购经理对景气度的问卷打分,50 为荣枯线:高于 50 扩张,低于 50 收缩。是少数"当月就知道当月事"的宏观指标
CPI 同比国家统计局每月 9~13 日左右,发布上月数据物价涨速。温和通胀(1%~3%)对企业盈利最友好;通缩(负值)压制利润,高通胀引来紧缩
社融 / 新增贷款中国人民银行每月 10~15 日左右,发布上月数据实体经济从金融体系拿到多少钱。信用扩张领先于经济扩张,是最受关注的"领先指标"之一

注意两个事实。第一,频率是月度的:一个月一个数据点,一年十二个点。你在第 4 课回测用 242 个日线数据点都嫌少,宏观指标的"K 线"稀疏到只配看方向,不配算信号。第二,发布是滞后的:7 月中旬你看到的是 6 月的 CPI 和社融——你决策用的是半个月前的经济快照,而市场里的专业机构在数据发布前早就用高频数据(电厂煤耗、物流、票据利率)猜得八九不离十了。

所以宏观数据在你系统里的正确位置

你的决策系统本来就是分层的,节奏由慢到快:宏观(月度)定仓位水位与风格倾斜 → 研报与新闻(周度,第 3、11 课)形成观点 → 盘中异动(第 6 课)辅助执行。宏观层的产品不是"买/卖"信号,而是一个旋钮:水位偏暖,仓位上限抬一档、风格往顺周期偏一点;水位偏冷,上限压一档、往红利防御偏一点。调这个旋钮的频率是月度的——这恰好和 T+1 培养出来的"盘后分析、次日计划"的慢节奏兼容:A 股的制度本来就不奖励快,宏观层更是把"慢"做到了极致。

二、边际变化 > 绝对数值(本课的知识核心)

新手读宏观数据的第一反应是比大小:"PMI 50.3,刚过荣枯线,一般般。"职业读法恰恰相反——先看方向和加速度,再看水平:

把这个原则写进代码,就是脚本里的 direction():最新值减上月值,超过阈值判改善/恶化,否则持平。逻辑简单到近乎简陋——但对月度数据,这就是正确的精度。给 12 个点拟合复杂模型,是第 7 课讲过的过拟合换了件衣服。

三、动手:跑宏观脉搏面板

脚本优先调真实接口(东方财富的 PMI/CPI、人民银行的社融),全部失败时退回内置样本(2026-07-21 用真实接口抓取的近 12 个月数据)。逐行复制:

cd "$HOME/AI Project/Quant Learning"
source .venv/bin/activate
python scripts/macro_pulse.py

你会看到(我已在你的环境实测通过,数字是真实运行结果):

==========================================================================
宏观脉搏 · 近 12 个月
==========================================================================
月份               PMI(制造业)      CPI(全国同比%) 新增贷款(累计同比%)
--------------------------------------------------------------------------
2026-06                   +50.3                  +1.0                 -15.5
2026-05                   +50.0                  +1.2                 -13.3
2026-04                   +50.3                  +1.2                 -13.1
2026-03                   +50.4                  +1.0                  -8.2
2026-02                   +49.0                  +1.3                  -2.1
2026-01                   +49.3                  +0.2                  -6.1
2025-12                   +50.1                  +0.8                  -6.7
2025-11                   +49.2                  +0.7                  -7.9
2025-10                   +49.0                  +0.2                  -7.4
2025-09                   +49.8                  -0.3                  -5.5
2025-08                   +49.4                  -0.4                  -3.6
2025-07                   +49.3                  +0.0                  -0.6
--------------------------------------------------------------------------
指标体检(最新一个月,边际变化方向 > 绝对数值):
  PMI(制造业)        最新 +50.3  环比 +0.3  方向:改善  [连续4个月站上荣枯线]
                       数据截至 2026年06月,来源:实时(东方财富)
  CPI(全国同比%)     最新 +1.0  环比 -0.2  方向:恶化  [温和通胀区间]
                       数据截至 2026年06月,来源:实时(东方财富)
  新增贷款(累计同比%) 最新 -15.5  环比 -2.2  方向:恶化  [信用扩张收缩中]
                       数据截至 2026年06月,来源:实时(东方财富·社融接口不可用已降级)
==========================================================================
一句话结论(规则翻译):PMI改善、CPI恶化、新增贷款恶化——宏观水位:中性偏冷。
提醒:水位只决定仓位区间与风格倾斜,不触发任何单笔交易。

先自己读一遍这张面板再往下看。三个指标方向打架:PMI 连续 4 个月站上荣枯线(景气在改善),CPI 从 1.2 回落到 1.0(再通胀动能在减弱),新增贷款累计同比一路滑到 -15.5%(信用在收缩)。这不是面板坏了——宏观指标经常互相矛盾,因为经济本来就是一架各部件转速不同的机器。PMI 是问卷调查的"软数据",反映预期和情绪,转得快;信贷是"硬数据",反映真金白银的扩张意愿,转得慢但分量重。两者背离时,通常的读法是:预期先动了,钱还没跟上——弱复苏,根基不牢。这种"方向打架时怎么办"的判断,正是 LLM 翻译官的用武之地,下面第五节细说。

四、免费接口的第二次教育:降级链与新鲜度检查

注意面板里信用指标那一行的来源标注:实时(东方财富·社融接口不可用已降级)。这不是演习——这节课备课时,社融接口 ak.macro_china_shrzgm()(数据源:商务部)在你机器上直接 SSL 握手失败,脚本自动切到了第二条路:东方财富的新增人民币贷款。这就是第 2 课那条纪律在宏观数据上的复用:免费接口一定会挂,每个数据入口都要有备胎。脚本的取数链是:社融(商务部)→ 新增贷款(东财)→ 内置样本,每一环都包在 try/except 里,全部网络请求统一 15 秒超时。

还有一个更隐蔽的坑被这节课顺手踩了出来:备课时我先试了另一个 CPI 接口 ak.macro_china_cpi_yearly(),调用不报错、返回几百行数据——但最新一行停在 2025 年 9 月,已经断更近一年。接口没挂,只是没人更新了。如果你把它接进面板又不看日期,你会拿着一年前的物价数据定今天的仓位,而且毫无察觉。所以脚本里有一个 freshness_note():最新数据距今超过两个月就打印警告。对免费数据源,"能返回数据"和"数据是新的"是两件事,都要检查。

五、LLM 是翻译官,不是预言家

现在把 LLM 接进来。先看它拿到的输入——不是"预测一下 A 股",而是面板的压缩文本,外加一条钉死职责的系统 Prompt(脚本里的 SYSTEM_PROMPT):

你是一名宏观研究助理,服务于一位A股个人投资者。把用户给出的宏观数据面板翻译成对仓位与风格的含义。
纪律:只解读数据含义,不预测指数点位,不给具体买卖指令;必须指出数据风险。
只输出JSON,不要输出任何其他文字:
{"conclusion": <一句话总结宏观环境,不超过50字>,
 "position_stance": <对仓位水位的建议,如"中性/偏多/偏空"加一句理由,不超过50字>,
 "style_implication": <对A股风格的含义,不超过60字>,
 "risk": <最需要提醒的一条数据风险,不超过40字>}

这套 Prompt 用的还是第 3 课的三原则:结构化输出(JSON 进流水线)、标尺定义(水位只有偏多/中性/偏空几档,不许给点位)、要求理由(risk 字段强制它自我揭短)。演示模式的输出(预计算,针对上面这份真实数据):

LLM 解读(演示模式·预计算):
  【宏观环境一句话】制造业景气重回扩张、物价温和回落、但信用仍在收缩——三个指标方向打架,宏观水位中性偏冷,弱复苏根基不牢。
  【仓位水位建议】仓位建议中性(半仓上下浮动一档):PMI 连续站上荣枯线支持持有权益底仓,但信用拐点确认前不加码,也不因单月回落恐慌减仓。
  【对A股风格的含义】PMI 回升+温和再通胀,历史上更利好盈利驱动的顺周期龙头(消费、先进制造);信用收缩意味着流动性驱动的题材小票缺乏增量弹药,风格偏质量与红利,而非题材与高弹性。
  【风险提示】三个指标方向不一致时,单月噪音的概率大;且 6 月数据到 7 月中旬才发布齐全——宏观回答的是'季节'不是'天气',别用它做周度以下的调仓。

注意这段输出做对了几件事:它把"方向打架"翻译成了"中性"而不是强行选边;它给的是仓位区间(半仓上下一档)而不是买卖指令;它把数据含义接到了风格上(顺周期龙头 vs 题材小票)——这正是你拿宏观能真正影响决策的杠杆:仓位水位和风格倾斜,而不是择时买卖点。

为什么不能让它预测点位(呼应第 3 课的批判性思考)

第 3 课我们说过:新闻经常是对价格的描述而非原因,信息发布时价格已经消化了一部分——宏观数据更是如此,它是月度滞后的公共信息,机构用高频数据提前几周就在交易它了。让一个读公共数据的模型预测点位,等于让它拿所有人都有的旧信息去赚没有人剩下的钱。LLM 真正的比较优势在另一头:它读过海量的宏观复盘文本,知道"PMI 上荣枯线 + 信用收缩"这种组合历史上通常对应什么风格环境——这是翻译,不是预言。翻译错了你能审计(理由就在输出里),预言错了你只会以为是运气。

接入真实模型(可选,课后完成):

export LLM_API_KEY="sk-你的key"
python scripts/macro_pulse.py --live

真实模式我已写好但尚未实测(你机器上还没有 Key)——拿到 Key 后跑一次,有报错直接贴给我。换别家模型只需改 LLM_BASE_URLLLM_MODEL 两个环境变量。

六、把宏观层装进你的决策系统

到这里,你的 Agent 辅助决策系统有了清晰的三层节奏:

节奏来自哪节课产出什么
宏观水位月度本课仓位上限区间、风格倾斜(顺周期 / 防御)
观点形成周度第 3 课(新闻情绪)、第 11 课(研报解读)对持仓/自选股的看多看空理由,可审计
执行辅助盘中第 6 课(异动监控)异动提醒,供你人工决策

三层各管各的时钟,谁也别越界:宏观层再"偏暖"也不该直接触发一笔买入(它太钝),异动层再"刺激"也不该推翻宏观水位(它太吵)。每月社融发布后的那个周末,花十分钟跑一次 macro_pulse.py,把水位旋钮调到位,这个月剩下的时间里宏观层就闭嘴了——这就是慢变量的正确使用方式。

自测

凭记忆作答——答错比答对更能加固记忆。

延伸阅读

下一课预告

第 13 课 · 多智能体团队:多空辩论实战——到这里你已经有了情绪分析、研报解读、异动监控、宏观翻译一整组单兵组件。下一课把它们编成一支队伍:按 TradingAgents 的思路设计角色分工与多空辩论机制,并直面多智能体协作的成本代价。

有任何不清楚的地方(比如边际方向的判定、降级链的写法、宏观层和其他层怎么配合),直接问我——我是你的老师。