用 5 个公开指标量化"美元信用健康度"——一套可复用的宏观打分系统
本文最后更新于 2026年6月28日 凌晨
量化系统里有一类判断特别难做:**”美元到底强不强”**。它不像技术指标有现成公式,而是散落在收益率曲线、汇率、黄金储备、利差这些维度里,最终在交易员脑子里合成一个模糊的”感觉”。
本文记录一个量化项目里把这种感觉压缩成一个 0–100 分数的过程:五个公开指标、三个免费数据源、一套线性加权评分。重点不在结论(结论明天就会变),而在怎么把一个主观的宏观判断,拆成可回测、可复现、可解释的数字。
一、问题:宏观判断的”不可证伪”困境
一个典型的量化策略每天要回答一堆问题:现在该不该加杠杆?黄金该不该配?A 股该不该避险?这些问题的答案,往往都挂在同一个上游变量上——美元信用的强弱。
但”美元强不强”是个糟糕的输入:
- 它不可证伪。今天说”偏弱”、明天说”还行”,没有任何锚点。
- 它无法回测。回测引擎要的是一个确定性的时间序列,而不是一段自然语言。
- 它依赖人。换个分析师,结论就变,策略也就跟着漂移。
所以项目的目标很明确:把”美元信用健康度”变成一个每天自动产出、可追溯公式、可调权重的数字。 下游策略(黄金配置、A 股仓位、美元资产对冲)都读这一个数。
二、设计:五个维度怎么选
美元信用强弱本质是一个多维信号,没有任何单一指标能完整描述它。这里把它拆成五个相对正交的维度,每个维度都映射到 0–100(100 = 信用强健,0 = 信用崩溃),最后加权求和:
| 维度 | 含义 | 直觉 |
|---|---|---|
| 收益率水平 (yield_level) | 10Y 美债收益率 | 收益率越高,融资成本越高,信用越承压 |
| 收益率曲线形态 (yield_curve) | 10Y − 2Y 利差 | 倒挂 = 衰退信号,信用承压 |
| 美元汇率趋势 (fx_trend) | USD/CNY 20 日变动 | 美元走弱,信用承压 |
| 去美元化信号 (dedollarization) | 中国黄金储备同比 | 黄金加速增持,去美元化压力上升 |
| 中美利差 (cn_us_spread) | 中美 10Y 国债利差 | 利差倒挂影响资金流向 |
为什么是这五个、而不是别的?有三条选择原则:
- 数据公开且免费。全都来自 akshare 这种公开财经数据库,不依赖付费终端。可复现、可审计。
- 维度尽量正交。收益率水平、曲线形态、汇率、储备、跨国利差——分别从利率、汇率、官方储备、跨境资本四个角度切入,避免五个指标其实都在量同一件事。
- 可解释。每个维度都能讲出”为什么这个数变大代表美元信用变弱”,而不是堆一个黑箱回归。
三、评分公式:线性映射 + 截断
每个维度的核心都是一个线性映射到 0–100,再用 max(0, min(100, x)) 截断。这是有意为之的简单设计——任何超过 100 或低于 0 的极端值都被压平,避免单一维度因为离群点而主导总分。
1 | |
几个设计细节值得说明:
- 基准线设在 50。
curve_score、fx_score、spread_score都以 50 为中性基准——利差为 0 给 50 分,正常向上偏移。这比”全维度都从 0 起算”更符合直觉:不倒挂、汇率稳定的常态本就该接近 50,而不是接近 0。 - 权重反映重要性,但不贪大。收益率水平给了最高权重 0.25(融资成本最直接),曲线和汇率各 0.20,去美元化 0.20,中美利差最低 0.15。权重本身就是可调旋钮,逻辑随时间漂移时直接改一行。
- 系数是经验值,不是拟合出来的。比如
yield_10y * 20意味着 5% 的 10Y 收益率就把这一维扣到 0。这种系数来自对历史区间的观察,不依赖任何机器学习拟合——刻意保持可解释,避免过拟合。
这种”线性 + 截断”的朴素方式,换来的是一个没有任何隐藏自由度的打分器:调任何一个系数,你能立刻预判总分往哪边走。
四、数据层:三个公开数据源
整个评分只用三个数据接口,都走 akshare:
| 数据 | akshare 接口 | 用途 |
|---|---|---|
| 美债收益率曲线 | bond_zh_us_rate() |
2Y/5Y/10Y/30Y 美债 + 中国 10Y |
| USD/CNY 汇率 | currency_boc_sina(symbol="美元") |
央行中间价 + 20 日变动 |
| 中国黄金/外汇储备 | macro_china_fx_gold() |
储备绝对值 + 同比 |
1 | |
每个数据获取函数都用 try/except 包住,任何一路数据失败都返回空 DataFrame 而不是抛异常——下游有降级处理。API_DELAY = 2 秒的间隔是经验值,akshare 的东财接口对高频访问很敏感。
五、工程细节:那些不写不知道的小坑
1. stdout → stderr 重定向
上面代码里有一行容易被忽略:
1 | |
为什么这么做? akshare 内部会用 tqdm 打进度条,而且部分版本直接 print 调试信息到 stdout。如果这个脚本的 stdout 要被上游当成结构化输出(比如直接管道给 json.loads),那些进度条会污染输出、直接解析失败。
把库的噪声重定向到 stderr、业务输出留在 stdout,是让脚本既能给人看(stderr 进度条)、又能给机器读(stdout 纯 JSON)的关键。这种”双通道”输出习惯在数据流水线里非常有用:
1 | |
2. 防御式嵌套访问
工作流会把每个脚本的 JSON 输出汇总成一个大盘看板。但上游脚本可能因为数据缺失而只输出部分字段,直接 data["metrics"]["us_yield_10y"] 一旦任一层缺失就抛 KeyError,整个看板生成崩溃。于是有一个 safe_get:
1 | |
这样 safe_get(dollar_credit, "metrics", "us_yield_10y", default="?") 永远不会炸。看板的健壮性不应该依赖每个子脚本都完美输出——用防御式访问把”上游坏了”降级成”这一格显示 N/A”,而不是整个看板白屏。
3. 优雅降级
当核心数据(美债收益率)完全拿不到时,脚本不会崩溃,而是输出一个明确的”数据不足”结构:
1 | |
这保证了即使数据源当天挂掉,下游流水线拿到的也是一个合法的 JSON,而不是一个异常或空文件。对一个每天定时跑、上游偶发不稳的系统,这个设计把”数据源故障”从”致命错误”降级为”今天的某个维度缺失”。
六、集成:一函数一脚本,工作流编排
这个评分模块不是孤立的,它是一个十模块宏观周期工作流的第 10 步。整个工作流遵循一条很朴素的组织原则:
一个功能一个脚本,每个脚本独立产出 JSON;一个工作流脚本负责串联、收集、汇总。
1 | |
工作流编排器做的事很轻:在容器里依次 docker exec 跑每个脚本、docker exec cat 读回各自写的 JSON、汇总成一个大盘看板、再 docker cp 同步到宿主机和容器(供下游策略读取)。
1 | |
这种结构的好处:
- 可独立调试。任何一个 tracker 都能单独
python3 juglar_tracker.py --json跑起来看输出,不用拉起整套工作流。 - 故障隔离。某个脚本失败,编排器记一行
FAILED,照样收集其余脚本的结果,看板那一格显示{"error": "..."}。不会因为一个数据源挂了,整天的宏观判断全停。 - 可扩展。要加一个新维度(比如”商品/美元负相关性”),写一个新脚本 + 在
SCRIPT_ORDER里加一行,工作流编排器一行都不用改。
七、实跑结果:56.1 分意味着什么
这是某次实跑的真实输出(数据截至跑批当日):
| 维度 | 分数 | 原始指标 |
|---|---|---|
| 收益率水平 | 12.4 | 10Y = 4.38%(高位,重扣) |
| 曲线形态 | 59.3 | 10Y−2Y = +0.31%(正常) |
| 汇率趋势 | 51.1 | USD/CNY 20日 −0.11%(微贬) |
| 去美元化 | 79.6 | 黄金储备同比 +40.8%(大幅增持) |
| 中美利差 | 100 | 中美 10Y 利差 −2.65%(深度倒挂) |
| 综合 | 56.1 / 中等压力 | — |
总分 **56.1,定性为”中等压力”**(40–60 区间)。
光看这个总分意义不大,价值在于五个子分数的对比,它能讲出一个比”美元偏弱”具体得多的故事:
- 拉低总分的主因是收益率水平(12.4)和去美元化(79.6)。前者说明美债融资成本处于历史高位区间,后者说明全球第二大经济体在持续增持黄金、分散美元敞口——两者都直接侵蚀美元的信用基础。
- 但曲线没倒挂(59.3)、汇率也只是微贬(51.1),说明市场尚未进入”衰退+抛售”的极端组合,所以是”中等压力”而不是”承压”或”危机”。
- 中美利差那维拿了满分 100,反映的是深度倒挂(美国利率远高于中国)。这一维满分反而值得警惕:它说明资金有强烈动机留在高息的美元资产里,但同时也意味着美元的高息是”硬撑”出来的,一旦降息周期开启,这一维会快速回落。
这种子分数解读,才是这个打分系统相对一句”美元偏弱”的真正增量。
最后,模型还输出三句话的资产含义,供下游策略直接消费:
1 | |
注意这个映射是基于总分的简单阈值判断(< 60 就利好黄金、偏空美元),不是预测。它的作用是给下游一个确定性的、可回测的开关,而不是替交易员做决定。
八、复盘:这套模型的边界
诚实地说,这套打分有几个明显局限:
- 系数是拍脑袋的经验值。
yield_10y * 20、gold_yoy * 0.5这些系数来自对历史区间的观察,但没有经过严格的回测优化。好处是可解释、不会过拟合;坏处是可能系统性高估或低估某个维度的权重。 - **五个维度未必真”正交”**。比如收益率水平和中美利差都含 10Y 美债收益率,存在信息重叠。要更严格,应该先做相关性分析、必要时降维。
- 去美元化信号用”黄金储备同比”做代理,是个粗粒度近似。真正的去美元化还包括央行购债、本币结算协议等,但那些数据要么不公开、要么频率太低。
- 线性映射 + 截断会压平极端值。比如收益率超过 5% 后这一维就归零,区分度丢失。对于”非常规”时期(如收益率急速飙升),模型的敏感度不足。
下一步可改进的方向:把系数从经验值改成基于历史分位数的动态映射(收益率处于过去 5 年的什么分位)、引入更多去美元化代理指标、对五个维度做正交化预处理。
但核心思路是不变的:把宏观判断从”感觉”变成”分数”,从”不可证伪”变成”可回测”,从”依赖人”变成”可追溯公式”。 哪怕这个分数不够精确,它也比一段自然语言的判断要有用得多——因为它能进入回测、能定阈值、能在偏离时报警。
小结
这套”美元信用健康度打分”记录了把一个主观宏观判断工程化的全过程:
- 领域建模:美元信用拆成五个相对正交的维度,每个映射到 0–100。
- 评分设计:线性映射 + 截断 + 加权,刻意保持可解释、零隐藏自由度。
- 数据层:三个免费公开源,每路失败可降级,限速防封。
- 工程实践:stdout/stderr 双通道输出、防御式嵌套访问、优雅降级、一函数一脚本的模块化编排。
- 集成:作为十模块宏观工作流的一环,输出 JSON 供下游策略消费。
它不是一套预测模型,而是一个把判断标准固化下来的工具。当你说”美元信用承压”时,背后能立刻指出是哪一维、扣了多少分、原始指标是多少——这才是量化系统该有的样子。
一句话:能被拆成五个分数的宏观判断,永远比一段形容词更值得信任。