第四章:价差形态识别——双底/双顶、头肩顶/底、三角形、旗形与楔形
做跨期套利这么多年,我越来越觉得:价差图表的形态分析,其实比单品种的K线形态更可靠。为什么?因为价差剔除了很多市场噪音,它反映的是两个合约之间相对力量的博弈。说白了,形态就是市场情绪的“心电图”。
今天咱们就聊聊几种最常见的价差形态。我个人习惯是把它们分成两类:反转形态和持续形态。双底双顶、头肩顶底属于前者,三角形、旗形、楔形属于后者。嗯,咱们一个一个来。
核心观点:形态识别不是为了预测,而是为了制定交易计划。看到形态,你要问自己三个问题——止损设在哪?目标看多少?如果形态失败怎么办?
4.1 双底与双顶形态
双底和双顶,是价差分析里最基础的反转形态。我在项目中遇到过好几次,价差在某个区间来回震荡两次,然后突然突破——嗯,机会就来了。
双底形态(W底):
- 价差两次下探到相近的低点,然后反弹
- 第二次低点的成交量通常比第一次小(说明抛压衰竭)
- 突破颈线(两个高点之间的水平线)是入场信号
- 目标涨幅 ≈ 颈线到最低点的垂直距离
双顶形态(M顶):
- 价差两次上冲到相近的高点,然后回落
- 第二次高点的成交量通常小于第一次
- 跌破颈线是做空信号
- 目标跌幅 ≈ 颈线到最高点的垂直距离
实战技巧:我一般不会在第一次触碰颈线时就入场。等价格突破颈线后,回踩确认再进场,成功率会高很多。曾经有一次我太着急,在双底刚突破颈线时就追进去,结果被假突破打止损——从那以后,我就养成了等回踩的习惯。
4.2 头肩顶与头肩底形态
头肩形态是反转信号里最可靠的之一。你想想看,三个波峰/波谷,中间那个最高/最低,左右两个差不多高——这不就是市场从趋势到反转的完整过程吗?
头肩顶:
- 左肩:价差上涨后回落,形成第一个高点
- 头部:价差继续上涨创出新高,然后回落
- 右肩:价差再次反弹,但无法突破头部高点
- 跌破颈线(连接左肩和头部之间的回调低点)→ 确认反转
头肩底(倒头肩):
- 左肩:价差下跌后反弹,形成第一个低点
- 头部:价差继续下跌创出新低,然后反弹
- 右肩:价差再次回落,但无法跌破头部低点
- 突破颈线 → 确认反转向上
| 形态 | 颈线方向 | 目标测量 | 常见陷阱 |
|---|---|---|---|
| 头肩顶 | 水平或略向下 | 头部到颈线的垂直距离 | 右肩成交量放大可能是假突破 |
| 头肩底 | 水平或略向上 | 头部到颈线的垂直距离 | 突破时量能不足容易回踩失败 |
避坑指南:我曾经在头肩底形态中犯过一个错误——右肩还没完全形成就提前入场。结果价差继续下跌,打穿了左肩的低点。记住:头肩形态必须等颈线被明确突破,否则都是猜测。
4.3 三角形整理形态
三角形形态在价差分析里出现频率很高。它代表市场在某个区间内收敛,多空双方暂时达成平衡。说白了,就是暴风雨前的宁静。
三种常见三角形:
- 对称三角形:上边线向下倾斜,下边线向上倾斜。突破方向不确定,哪个方向先突破就跟哪个方向。
- 上升三角形:上边线水平,下边线向上倾斜。通常向上突破的概率更大。
- 下降三角形:下边线水平,上边线向下倾斜。通常向下突破的概率更大。
我个人习惯用布林带配合三角形来确认突破。当布林带收窄到极致,同时价格在三角形末端运行,这时候一旦放量突破,往往就是一波大行情。
量化小技巧:可以用ATR(平均真实波幅)来量化三角形的收敛程度。当ATR降到过去20日的最低水平时,说明三角形已经整理充分,突破在即。
4.4 旗形与楔形形态
旗形和楔形都是持续形态,意味着它们出现在趋势中间,而不是趋势末端。嗯,这里要注意区分。
旗形:
- 形态像一面旗帜:价格快速上涨/下跌后,进入一个窄幅整理通道
- 通道方向与主趋势相反(上升趋势中的旗形向下倾斜)
- 突破方向与主趋势一致
- 目标涨幅 ≈ 旗杆的长度(从突破点到整理开始的距离)
楔形:
- 与旗形类似,但通道的两条边线是收敛的
- 上升楔形(看跌):高点逐步降低,低点逐步抬高,最终向下突破
- 下降楔形(看涨):高点逐步降低,低点逐步抬高,最终向上突破
我记得有一次做螺纹钢的跨期套利,价差在上升趋势中形成了一个下降楔形。当时很多人觉得价差要反转了,但我一看成交量在萎缩,就知道这是典型的持续形态。果然,突破后价差继续上涨了200多点。
4.5 形态识别的量化实现
光靠肉眼识别形态,效率太低。我一般会用代码来辅助识别。下面是一个简单的双底识别逻辑:
def detect_double_bottom(spread_series, lookback=20):
"""
检测双底形态
spread_series: 价差序列
lookback: 回溯周期
"""
# 找到局部低点
lows = []
for i in range(lookback, len(spread_series)-lookback):
if spread_series[i] == min(spread_series[i-lookback:i+lookback]):
lows.append((i, spread_series[i]))
# 检查是否有两个相近的低点
double_bottoms = []
for i in range(len(lows)-1):
idx1, price1 = lows[i]
idx2, price2 = lows[i+1]
# 两个低点价格相差不超过5%
if abs(price1 - price2) / max(price1, price2) < 0.05:
# 两个低点之间至少间隔10个周期
if idx2 - idx1 >= 10:
# 中间有反弹高点
mid_high = max(spread_series[idx1:idx2])
if mid_high > max(price1, price2) * 1.02:
double_bottoms.append((idx1, idx2))
return double_bottoms
参数调优建议:上面代码里的5%和10个周期,是我根据螺纹钢和铁矿石的价差数据调出来的。不同品种的参数差异很大,建议你用历史数据回测一下,找到最适合的参数组合。
4.6 形态识别的核心逻辑框架
下面这张图是我自己总结的形态识别决策流程,你可以把它当作一个检查清单来用:
这个流程的核心逻辑很简单:先判断趋势方向,再确定形态类型,最后用突破信号来确认入场。我建议你把这张图打印出来贴在显示器旁边,每次看到疑似形态时,按流程走一遍,能过滤掉很多假信号。
最后说一句:形态识别不是万能的。我见过太多人沉迷于数浪、画线,结果忽略了最根本的东西——价差的均值回归特性和基本面驱动因素。形态只是工具,不是信仰。用得好,它是你的利器;用得不好,它就是你的枷锁。