第十三章 盘面择时(一):基差率与历史分位数的实战用法

做基差交易,择时是核心中的核心。

很多人问我:“老张,基差策略到底什么时候进场?什么时候该跑?”

我的回答很简单——看基差率,看历史分位数。

这两个指标,是我做了这么多年交易,最依赖的择时工具。今天我把它们掰开了讲。

13.1 基差率:比基差更“干净”的信号

先说说基差率是什么。

基差 = 现货价格 - 期货价格。这个大家都知道。

但基差有个问题——它受价格水平影响太大。螺纹钢5000块的时候,基差200算正常;螺纹钢3000块的时候,基差200就是极端了。

所以我们需要基差率:

基差率 = (现货价格 - 期货价格) / 现货价格 × 100%

说白了,就是把基差“归一化”了。这样不同品种、不同价格区间,都能放在一起比较。

核心观点:基差率比基差更稳定,更适合做跨品种、跨时间的横向对比。

我个人习惯,把基差率分成三个区间:

  • 基差率 > 3%:强贴水,做多期货(买贴水)的好时机
  • 基差率 < -3%:强升水,做空期货(卖升水)的好时机
  • 基差率在 -1% ~ 1%:中性区间,观望为主

当然,这个阈值不是死的。不同品种波动率不同,需要自己调。我在项目中遇到过,有些品种基差率到2%就已经是极端了,有些要到5%才算。嗯,这里要注意——一定要根据品种特性来设定阈值

13.2 历史分位数:告诉你“现在有多极端”

基差率本身还不够。为什么?

因为“3%”这个数字,在不同市场环境下意义完全不同。

举个例子:

  • 如果过去一年基差率最高才2.5%,那今天到了3%就是极端中的极端
  • 如果过去一年基差率经常到5%,那3%只能算中等偏上

所以我们需要历史分位数。

历史分位数,就是把当前基差率放在过去N天的数据里,看它排在第几位。

分位数 = (当前值在历史数据中的排名 / 总样本数) × 100%

比如:过去100天里,今天的基差率比95天都高,那分位数就是95%。

我个人习惯用90%和10%作为阈值:

分位数区间 信号含义 操作建议
> 90% 基差率处于历史高位 做多期货(买贴水)
< 10% 基差率处于历史低位 做空期货(卖升水)
10% ~ 90% 正常波动区间 观望或轻仓

小技巧:我一般用60天或90天的滚动窗口。太短(比如20天)信号太频繁,太长(比如250天)反应太慢。90天是个不错的平衡点。

13.3 实战组合:基差率 + 分位数 = 双保险

单独用基差率,容易误判。单独用分位数,又可能错过趋势。

我的做法是——两者结合。

具体逻辑:

  1. 第一步:看基差率绝对值。如果基差率 > 3% 或 < -3%,进入候选池
  2. 第二步:看历史分位数。如果分位数 > 90% 或 < 10%,确认信号
  3. 第三步:两个条件都满足,才开仓

你想想看,这样过滤下来,信号质量是不是高了很多?

我曾经用这个组合做过螺纹钢的基差交易。有一次基差率到了4.2%,分位数到了96%。我果断做多期货。结果呢?一周后基差回归到1.5%,单笔盈利超过2%。

当然,也有失手的时候。我记得有一次铁矿石基差率到了5%,分位数98%,我进场了。结果现货突然暴跌,基差反而扩大了。嗯,这就是另一个话题了——基差回归不是必然的,需要配合基本面判断

避坑指南:我曾经在2021年煤炭行情里吃过亏。当时基差率和分位数都到了极端值,我按常规逻辑做多。结果政策干预,期货连续跌停,基差反而拉大。所以——极端行情下,政策风险是第一位的

13.4 代码实现:自动计算基差率与分位数

光说不练假把式。我给你们写个简单的Python代码,可以直接用。

import pandas as pd
import numpy as np

def calc_basis_rate(spot_price, futures_price):
    """计算基差率"""
    return (spot_price - futures_price) / spot_price * 100

def calc_percentile(data, window=90):
    """计算历史分位数"""
    rolling_min = data.rolling(window).min()
    rolling_max = data.rolling(window).max()
    percentile = (data - rolling_min) / (rolling_max - rolling_min) * 100
    return percentile

# 示例用法
df = pd.DataFrame({
    'spot': [5000, 5020, 4980, 5050, 5100],
    'futures': [4850, 4880, 4830, 4900, 4950]
})

df['basis_rate'] = calc_basis_rate(df['spot'], df['futures'])
df['percentile'] = calc_percentile(df['basis_rate'], window=3)

print(df)

这段代码很简单,但很实用。你只需要把现货和期货价格填进去,就能自动算出基差率和分位数。

注意:实际使用时,window参数要根据品种调整。波动大的品种用短窗口(60天),波动小的用长窗口(120天)。

13.5 知识体系图

下面这张图,把基差率与历史分位数的关系、以及实战流程画清楚了。

基差率与历史分位数实战流程 输入:现货 & 期货价格 计算基差率 = (现货 - 期货) / 现货 判断:基差率 > 3% 或 < -3%? 计算历史分位数(90天窗口) 分位数 > 90% 或 < 10% → 开仓 基差率 > 3% → 做多期货 基差率 < -3% → 做空期货 分位数 > 90% → 确认信号 分位数 < 10% → 确认信号

13.6 实战中的几个坑

最后,我总结几个实战中容易踩的坑:

  • 坑一:只看基差率,不看分位数。结果在正常波动区间频繁进出,手续费都亏没了。
  • 坑二:分位数窗口选得太短。信号太多,容易追涨杀跌。
  • 坑三:忽略交割日效应。临近交割,基差会强制收敛,这时候分位数会失效。
  • 坑四:不区分品种。农产品和工业品的基差波动特性完全不同,阈值要分别设定。

我的习惯:每次开仓前,我会问自己三个问题——基差率够极端吗?分位数够高吗?基本面支持吗?三个都答“是”,我才动手。

好了,基差率与历史分位数的实战用法,今天就讲到这里。这两个工具配合使用,能帮你过滤掉大部分无效信号。但记住——工具只是工具,最终决策还是要靠你的判断力。


公众号:蓝海资料掘金营,微信deep3321