Skip to content

美债空头持仓223万手,贝森特一买入就能逼空?

作 者:老余捞鱼

原创不易,转载请标明出处及原作者。

文中示例仅用于技术讨论,不构成任何操作建议。
量化策略开发应以学习和技术交流为目的。
本号不荐股、不卖课、不承诺收益。
市场有风险,请合法合规投资。

本文约 4000 字 | 预计阅读 8-12 分钟,后有示例代码,建议先收藏。

· · ·

你有没有想过,美国国债市场现在正在给你一次确定性较高的机会?

美财政部从 9 月 9 日开始,把长端国债回购操作的规模从每次 20 亿美元提高到至少 40 亿美元。与此同时,杠杆基金持有的美债期货空头规模,接近今年以来的最高点。这两个事情碰到一起,就是一个经典的空头挤压格局。

但 空头挤压 这四个字到底是什么意思?它是怎么运作的?为什么现在值得盯?这篇文章就把这件事拆开来,讲清楚。

一个循环是怎么开始的

我先把这个机制从头讲一遍,这样后面你再看数据,就知道在看什么了。

假设你现在是做空美债期货的人。你赌的是收益率往上走、价格往下掉。

现在财政部进来了,大手笔买入国债现券。

买国债 → 债券价格上涨 → 收益率下降。

你的期货头寸开始亏钱。但你还撑着,还没打到你的止损线。

问题是你的止损线不是你就能决定的,因为很多人的止损是模型自动执行的。

你问我什么模型?趋势跟踪模型,也就是 CTA 那套系统。规则很简单:价格跌破某个时间窗口的均线,做空;价格涨回去,平空甚至翻多。

现在财政部把价格推过了一个均线。第一个模型的止损被触发,平空(买回来)。

更多的买盘进来,价格再涨一截。又打穿了第二个模型的止损。又平空。

循环开始自己跑起来。

▲ 图1:空头挤压循环机制

这就是空头挤压。它的核心特征是,初始的推动力不需要很大,只要能触发第一批平仓,后面的动作是市场自己完成的。

财政部不需要把整个国债市场买下来。它只需要把价格推到某个关键位置,让趋势跟踪模型的空头开始难受,剩下的活儿,市场自己会干。

现在的空头到底有多大

分析数据要精确,不能靠感觉。

根据 CFTC 的 COT 报告,截至 8 月 18 日,杠杆基金持有 258 万手标准 10 年期国债期货空头,同期只有 35.2 万手多头。

净空头大约 223 万手。

这不是 2026 年的绝对最高点。今年 1 月初,净空头曾经达到 234 万手。但这个差距不重要,重要的是方向:国债期货市场现在极度一边倒,空头压倒多头。

而且还有一个细节很关键:就在最近一周,杠杆基金又加了 75,725 手空头。

这说明什么?空头还没被洗掉,还有加仓的空间,还有燃料。

不光是 10 年期。QuantJourney 的数据显示,杠杆基金还净做空大约 35.3 万手 Ultra 10Y 合约、36.1 万手 30 年期国债期货合约。

压力分布在整个久期谱系上。

▲ 图2:CFTC 持仓数据对比

不过这里有一个需要区分的地方,杠杆基金不等于 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 个基点的波动,叠加真实的持仓平仓,是完全不同的局面。

▲ 图3:TLT 关键价位图

久期凸性叠加持仓凸性:债券自己“越涨越疯”的加速度,加上空头们慌不择路踩踏买入的推力,这两股劲撞到一起,才是这波行情真正的好戏。

一个比等技术突破更早的信号

通常大家会等收益率跌破了某个关键位置再去关注。但有一个信号比这个更早。

紧紧盯住国债收到坏消息的时候。

如果油价大涨、财政消息继续难看、国债供给依然沉重,而 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%。

▲ 图4:期权价差结构示意图

这个结构有意思的地方在于:你不需要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

Published inAI&Invest专栏

Be First to Comment

    发表回复