第十三章 盘面择时(一):基差率与历史分位数的实战用法
做基差交易,择时是核心中的核心。
很多人问我:“老张,基差策略到底什么时候进场?什么时候该跑?”
我的回答很简单——看基差率,看历史分位数。
这两个指标,是我做了这么多年交易,最依赖的择时工具。今天我把它们掰开了讲。
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 实战组合:基差率 + 分位数 = 双保险
单独用基差率,容易误判。单独用分位数,又可能错过趋势。
我的做法是——两者结合。
具体逻辑:
- 第一步:看基差率绝对值。如果基差率 > 3% 或 < -3%,进入候选池
- 第二步:看历史分位数。如果分位数 > 90% 或 < 10%,确认信号
- 第三步:两个条件都满足,才开仓
你想想看,这样过滤下来,信号质量是不是高了很多?
我曾经用这个组合做过螺纹钢的基差交易。有一次基差率到了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 知识体系图
下面这张图,把基差率与历史分位数的关系、以及实战流程画清楚了。
13.6 实战中的几个坑
最后,我总结几个实战中容易踩的坑:
- 坑一:只看基差率,不看分位数。结果在正常波动区间频繁进出,手续费都亏没了。
- 坑二:分位数窗口选得太短。信号太多,容易追涨杀跌。
- 坑三:忽略交割日效应。临近交割,基差会强制收敛,这时候分位数会失效。
- 坑四:不区分品种。农产品和工业品的基差波动特性完全不同,阈值要分别设定。
我的习惯:每次开仓前,我会问自己三个问题——基差率够极端吗?分位数够高吗?基本面支持吗?三个都答“是”,我才动手。
好了,基差率与历史分位数的实战用法,今天就讲到这里。这两个工具配合使用,能帮你过滤掉大部分无效信号。但记住——工具只是工具,最终决策还是要靠你的判断力。
公众号:蓝海资料掘金营,微信deep3321