PMI / CPI / 社融是低频慢变量——它们定仓位"水位",不触发交易;LLM 是翻译官,不是预言家
一个能跑的"宏观脉搏"面板 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 接进来。先看它拿到的输入——不是"预测一下 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 课我们说过:新闻经常是对价格的描述而非原因,信息发布时价格已经消化了一部分——宏观数据更是如此,它是月度滞后的公共信息,机构用高频数据提前几周就在交易它了。让一个读公共数据的模型预测点位,等于让它拿所有人都有的旧信息去赚没有人剩下的钱。LLM 真正的比较优势在另一头:它读过海量的宏观复盘文本,知道"PMI 上荣枯线 + 信用收缩"这种组合历史上通常对应什么风格环境——这是翻译,不是预言。翻译错了你能审计(理由就在输出里),预言错了你只会以为是运气。
接入真实模型(可选,课后完成):
export LLM_API_KEY="sk-你的key"
python scripts/macro_pulse.py --live
真实模式我已写好但尚未实测(你机器上还没有 Key)——拿到 Key 后跑一次,有报错直接贴给我。换别家模型只需改 LLM_BASE_URL 和 LLM_MODEL 两个环境变量。
到这里,你的 Agent 辅助决策系统有了清晰的三层节奏:
| 层 | 节奏 | 来自哪节课 | 产出什么 |
|---|---|---|---|
| 宏观水位 | 月度 | 本课 | 仓位上限区间、风格倾斜(顺周期 / 防御) |
| 观点形成 | 周度 | 第 3 课(新闻情绪)、第 11 课(研报解读) | 对持仓/自选股的看多看空理由,可审计 |
| 执行辅助 | 盘中 | 第 6 课(异动监控) | 异动提醒,供你人工决策 |
三层各管各的时钟,谁也别越界:宏观层再"偏暖"也不该直接触发一笔买入(它太钝),异动层再"刺激"也不该推翻宏观水位(它太吵)。每月社融发布后的那个周末,花十分钟跑一次 macro_pulse.py,把水位旋钮调到位,这个月剩下的时间里宏观层就闭嘴了——这就是慢变量的正确使用方式。
凭记忆作答——答错比答对更能加固记忆。
第 13 课 · 多智能体团队:多空辩论实战——到这里你已经有了情绪分析、研报解读、异动监控、宏观翻译一整组单兵组件。下一课把它们编成一支队伍:按 TradingAgents 的思路设计角色分工与多空辩论机制,并直面多智能体协作的成本代价。
有任何不清楚的地方(比如边际方向的判定、降级链的写法、宏观层和其他层怎么配合),直接问我——我是你的老师。