作 者:老余捞鱼
原创不易,转载请标明出处及原作者。

文中示例仅用于技术讨论,不构成任何操作建议。
量化策略开发应以学习和技术交流为目的。
本号不荐股、不卖课、不承诺收益。
市场有风险,请合法合规投资。
本文约 4000 字 | 预计阅读 8-12 分钟,后有示例代码,建议先收藏。
· · ·
你有没有想过,美国国债市场现在正在给你一次确定性较高的机会?
美财政部从 9 月 9 日开始,把长端国债回购操作的规模从每次 20 亿美元提高到至少 40 亿美元。与此同时,杠杆基金持有的美债期货空头规模,接近今年以来的最高点。这两个事情碰到一起,就是一个经典的空头挤压格局。
但 空头挤压 这四个字到底是什么意思?它是怎么运作的?为什么现在值得盯?这篇文章就把这件事拆开来,讲清楚。
一个循环是怎么开始的
我先把这个机制从头讲一遍,这样后面你再看数据,就知道在看什么了。
假设你现在是做空美债期货的人。你赌的是收益率往上走、价格往下掉。
现在财政部进来了,大手笔买入国债现券。
买国债 → 债券价格上涨 → 收益率下降。
你的期货头寸开始亏钱。但你还撑着,还没打到你的止损线。
问题是你的止损线不是你就能决定的,因为很多人的止损是模型自动执行的。
你问我什么模型?趋势跟踪模型,也就是 CTA 那套系统。规则很简单:价格跌破某个时间窗口的均线,做空;价格涨回去,平空甚至翻多。
现在财政部把价格推过了一个均线。第一个模型的止损被触发,平空(买回来)。
更多的买盘进来,价格再涨一截。又打穿了第二个模型的止损。又平空。
循环开始自己跑起来。

这就是空头挤压。它的核心特征是,初始的推动力不需要很大,只要能触发第一批平仓,后面的动作是市场自己完成的。
财政部不需要把整个国债市场买下来。它只需要把价格推到某个关键位置,让趋势跟踪模型的空头开始难受,剩下的活儿,市场自己会干。
现在的空头到底有多大
分析数据要精确,不能靠感觉。
根据 CFTC 的 COT 报告,截至 8 月 18 日,杠杆基金持有 258 万手标准 10 年期国债期货空头,同期只有 35.2 万手多头。
净空头大约 223 万手。
这不是 2026 年的绝对最高点。今年 1 月初,净空头曾经达到 234 万手。但这个差距不重要,重要的是方向:国债期货市场现在极度一边倒,空头压倒多头。
而且还有一个细节很关键:就在最近一周,杠杆基金又加了 75,725 手空头。
这说明什么?空头还没被洗掉,还有加仓的空间,还有燃料。
不光是 10 年期。QuantJourney 的数据显示,杠杆基金还净做空大约 35.3 万手 Ultra 10Y 合约、36.1 万手 30 年期国债期货合约。
压力分布在整个久期谱系上。

不过这里有一个需要区分的地方,杠杆基金不等于 CTA。有一部分空头来自基差交易,赌的是期现价差收敛,而不是方向。
所以结论不是CTA 做空 223 万手国债期货,而是:杠杆基金群体持有异常大的国债期货空头,而独立评估也显示趋势跟踪者在久期上显著做空。这两件事叠加在一起,就足够制造挤压风险了。
贝森特在打什么算盘
好,现在我们换一个角度。
贝森特,美国财长,不需要证明 10 年期国债收益率“应该”在 4.30%。他不需要解决财政赤字,不需要搞定联邦债务规模。
他只需要做一件事:把价格路径改一个方向,足够久,让现有的空头头寸开始觉得不对劲。
这个目标比“解决根本问题”要容易得多。
如果收益率下降到某个程度,触发了系统性平仓,那财政部实际上是在招募私人市场的资金来帮他继续推这个方向。
所以他的战术目标可能是:争取时间、压低长端收益率、改善金融条件,让持仓本身放大干预效果。
这能持续六个月吗?坦率说,我觉得不会。成功的挤压,并不能解决美国国债的结构性问题。
更可能的路径是:财政部干预 → 空头挤压 → 收益率下行 → 持仓正常化 → 政治窗口关闭 → 财政基本面重新回到台面上。
一次战术性的国债反弹,和长期结构性困难,完全可以共存。这两件事不矛盾。
弹簧已被压紧,但还没松手
这就是为什么这个格局现在有意思,而不是等大涨之后再来说。
数据显示,10年期收益率、30年期收益率和TLT都还处于中长期趋势线下方。
市场在说三件事:趋势向下,空头很大,没有确认反转。
我把这个状态叫做,弹簧已经压紧,但还没触发。
这个“还没”很重要。机会是随着价格运动逐步消失的。TLT 在 82 到 83 美元,你是在交易挤压的可能性。TLT 在 88 到 90 美元,你就是在交易挤压本身了。这是两个完全不同的风险收益结构。
我在盯的具体价位
10 年期国债收益率在 8 月 24 日收在 4.70% 左右。
第一个让我认真关注的点位,大约在 4.60%。跌破这个,当前的价格区间就算破位了。如果继续跌破 4.50%,我会把这次变动当成比普通短期反弹更重要的事来处理。
对应到 ETF 的价格,大约是这样的:
- TLT 84 到 85 美元,是第一道趋势挑战线。
- TLT 85.5 到 86.5 美元,是更强的确认信号。
我还会看 EDV 和 ZROZ 这两只更高久期的 ETF 能不能配合。如果长端真的在动,更高久期的工具应该跟着确认。
所以一个值得关注的格局是:TLT 涨到 85 到 86 美元,同时 EDV 和 ZROZ 也出现相应上涨,这时候挤压概率就会显著上升。10 年期收益率到 4.30% 到 4.40%,系统性平仓很可能已经在价格里发生了。
本月的18到19日,市场其实做过一次小预演。10 年期收益率只跌了大约 6 个基点,30 年期大约 9 个基点。TLT 涨了约 1.7%,EDV 涨了约 2.9%,ZROZ 涨了超过 3%。这只是一次很小的利率波动。如果来一次 30 到 40 个基点的波动,叠加真实的持仓平仓,是完全不同的局面。

久期凸性叠加持仓凸性:债券自己“越涨越疯”的加速度,加上空头们慌不择路踩踏买入的推力,这两股劲撞到一起,才是这波行情真正的好戏。
一个比等技术突破更早的信号
通常大家会等收益率跌破了某个关键位置再去关注。但有一个信号比这个更早。
紧紧盯住国债收到坏消息的时候。
如果油价大涨、财政消息继续难看、国债供给依然沉重,而 10 年期收益率突然不创新高了,这件事本身就很有分量。
一个显而易见的道理:被大量做空的市场,在坏消息面前不再下跌,往往说明市场性质正在发生变化。
坏消息出来 → 债券价格不再创新低 → 空头开始不赚钱 → 平仓开始 → 价格上涨。
这可能发生在明显的技术突破之前。所以我会同时盯好消息带来的反弹,和坏消息之后的卖盘失败。
宏观环境的交叉验证
怎么判断这次上涨是空头挤压,还是经济增长真的出问题了?
这里有一个简单的框架可以参考:
如果 TLT 反弹,同时高收益债 HYG 大体稳定、MOVE 波动率指数下降、股市没有大跌,这个变动看起来更像利率和持仓的挤压。
如果 TLT 反弹,但 HYG 明显走弱,HYG 和 TLT 的比值大幅下降,那市场的解读就变了——可能在定价经济增长放缓。
如果油价继续大涨、通胀预期上升、30 年期收益率继续创出新高,那挤压的假设大概率是错的,至少暂时是错的。
拥挤的持仓是燃料,但燃料不等于火柴。拥挤的交易可以比人们预期的持续更久。
如果你想参与,怎么做
最简单的工具还是 TLT。
EDV 给更高的久期敞口,ZROZ 给更高的凸性。对于一个组合配置,我倾向于 TLT,因为它给了足够的久期,但没有把长端波动的每一分钱都拉满。
如果想做一次战术性的表达,期权就更有意思了。
TLT 在 82.6 美元附近时,11 月 20 日到期的期权大概是这样的报价:82 看涨期权利 2.06 美元,88 看涨期权 0.34 美元。
两个期权组成的价差组合,买进来的成本大约是 1.72 美元。如果 TLT 最后涨到 88 美元以上,这个价差最多值 6 美元,也就是说你投入 1.72 最多拿回 6 块,收益率大约 +250%。

这个结构有意思的地方在于:你不需要TLT涨到100美元。你只需它穿过83.72美元这个盈亏平衡点,而这个价格区间恰好也是可能触发趋势跟踪模型翻多的地带。
一个可以复制的挤压评分框架
说到这里,我给你一个可以自己动手的东西。
我真正追踪的,不是“空头很大”这个信息,这个信息本身没有太多时间价值。我想抓住的是过渡状态:从持仓拥挤,到趋势反转,到收益率下降,到久期 ETF 确认,最后到空头平仓。
下面的代码是一个简化版本,从持仓数据、收益率和ETF价格来构建可执行内容。
"""
国债期货挤压评分(Treasury Squeeze Score)计算脚本
数据源:CFTC持仓、ETF价格、国债收益率
评分范围:0-100,越高表示挤压可能性越大
"""
import pandas as pd
import numpy as np
import quantjourney as qj
from typing import Dict, Tuple, Optional
from datetime import datetime
def fetch_cot_data(symbol: str = "043602", start_date: str = "2025-01-01") -> pd.DataFrame:
"""
获取并整理CFTC国债期货持仓数据
"""
raw = qj.cftc.get_cot_data(
symbol=symbol,
report_type="financial",
futures_only=True,
start_date=start_date
)
cot = pd.DataFrame(raw["data"]).sort_values("report_date_as_yyyy_mm_dd")
# 计算杠杆基金净多头和空头占比
cot["lev_net"] = cot["lev_money_positions_long"] - cot["lev_money_positions_short"]
cot["short_pct_oi"] = cot["lev_money_positions_short"] / cot["open_interest_all"]
return cot
def fetch_etf_prices(symbols: list, start_date: str = "2025-01-01") -> pd.DataFrame:
"""
获取多只ETF的历史收盘价,并计算技术指标
"""
raw = qj.fmp.get_historical_prices(
symbols=symbols,
start_date=start_date,
frequency="1d"
)
# 构建价格DataFrame
price_dict = {}
for symbol, rows in raw["data"]["value"].items():
# 从行列表构建Series
series = pd.Series(
{row["date"]: row["close"] for row in rows},
dtype=float
)
series.index = pd.to_datetime(series.index)
price_dict[symbol] = series.sort_index()
px = pd.DataFrame(price_dict)
# 计算技术指标
px["TLT_MA50"] = px["TLT"].rolling(50).mean()
px["TLT_vs_50D"] = (px["TLT"] / px["TLT_MA50"]) - 1
px["EDV_5D"] = px["EDV"].pct_change(5)
px["ZROZ_5D"] = px["ZROZ"].pct_change(5)
return px
def fetch_treasury_rates(start_date: str = "2025-01-01") -> pd.DataFrame:
"""
获取国债收益率曲线数据,并计算10年期收益率5日变化
"""
raw = qj.fmp.get_treasury_rates(from_=start_date)
rates = pd.DataFrame(raw["data"])
rates["date"] = pd.to_datetime(rates["date"])
rates = rates.set_index("date").sort_index()
rates["10Y_5D"] = rates["year10"].diff(5)
return rates
def compute_squeeze_score(
cot: pd.DataFrame,
px: pd.DataFrame,
rates: pd.DataFrame
) -> Tuple[float, Dict[str, float]]:
"""
基于最新数据计算挤压评分及其子成分
"""
# 取最新一行
c = cot.iloc[-1]
p = px.iloc[-1]
r = rates.iloc[-1]
# 1. 持仓拥挤度(空头占比)
positioning = np.clip(c["short_pct_oi"] / 0.50, 0, 1)
# 2. 价格趋势(TLT相对50日均线的偏离)
trend = np.clip((p["TLT_vs_50D"] + 0.03) / 0.04, 0, 1)
# 3. 收益率动量(负向变化)
yield_momentum = np.clip(-r["10Y_5D"] / 0.20, 0, 1)
# 4. 久期确认(EDV和ZROZ同时上涨)
duration_confirmation = np.mean([p["EDV_5D"] > 0, p["ZROZ_5D"] > 0])
# 加权总分
weights = {
"positioning": 0.40,
"trend": 0.30,
"yield_momentum": 0.20,
"duration_confirmation": 0.10
}
score = 100 * (
weights["positioning"] * positioning +
weights["trend"] * trend +
weights["yield_momentum"] * yield_momentum +
weights["duration_confirmation"] * duration_confirmation
)
components = {
"positioning": positioning,
"trend": trend,
"yield_momentum": yield_momentum,
"duration_confirmation": duration_confirmation
}
return score, components
def main(start_date: str = "2025-01-01") -> None:
"""
主流程:拉取数据、计算评分并打印结果
"""
try:
print("正在获取CFTC持仓数据...")
cot = fetch_cot_data(start_date=start_date)
print("正在获取ETF价格数据...")
px = fetch_etf_prices(symbols=["TLT", "EDV", "ZROZ"], start_date=start_date)
print("正在获取国债收益率数据...")
rates = fetch_treasury_rates(start_date=start_date)
score, components = compute_squeeze_score(cot, px, rates)
print("\n=== Treasury Squeeze Score ===")
print(f"综合评分: {score:.1f}/100")
print("\n子成分明细:")
for name, value in components.items():
print(f" {name:<20}: {value:.3f}")
except Exception as e:
print(f"计算过程中发生错误: {e}")
raise
if __name__ == "__main__":
main()权重不需要过度优化。这个框架的价值在于,把势能积累 和 实际触发分开来看。现在持仓分项的得分很高,趋势分项还很低,这就是有意思的原因。
观点总结
我不会简单说:做多国债,因为收益率要降。这个结论下得太早,证据还不够。
更准确的说法是:国债市场现在有异常大的空头持仓,有新的边际买家进入,价格点位离关键趋势线很近。一次温和的初始反弹,有可能演变成自我强化的行情。
贝森特不需要永久解决国债市场的结构性问题,他做不到。他只需要把价格推到足够远,让别人开始买。
在一个持仓拥挤的市场里,这往往就足够制造出比最初催化剂大得多的行情了。
#美债 #空头挤压 #财政部回购 #CTA趋势跟踪 #TLT #DV01 #国债期货 #CFTC持仓 #收益率 #久期凸性 #期权结构 #QuantJourney
Be First to Comment