第四章:价格模式识别——开盘价、收盘价、最高价、最低价的关系与K线形态量化
各位同学,今天我们聊点实在的。
价格模式识别,说白了就是读懂K线背后的博弈语言。我做了这么多年量化,发现一个有意思的现象:很多人盯着各种复杂指标,却忽略了最原始、最直接的价格信息——开盘价、收盘价、最高价、最低价。这四个价格,其实藏着市场最真实的情绪。
4.1 四个价格的基本关系
先看最基础的东西。一根K线,四个价格:O(开盘)、C(收盘)、H(最高)、L(最低)。它们之间的关系,直接反映了多空力量的对比。
我个人习惯把关系分成几类:
- 实体大小:|C - O|,代表多空谁占了上风。实体越大,力量越强。
- 上下影线:H - max(O, C) 和 min(O, C) - L,代表被拒绝的价格区间。影线越长,说明那个方向的阻力越大。
- 位置关系:收盘价在最高价附近,还是最低价附近?这直接告诉你收盘时的市场情绪。
我在项目中遇到过一种情况:某只股票连续三天出现长上影线,但收盘价始终没跌破前低。很多人觉得是顶部信号,我反而觉得是主力在洗盘。为什么?因为每次冲高回落,成交量都在萎缩——说明抛压其实不大。后来果然突破了。
核心要点:四个价格不是孤立存在的。它们的相对位置,比绝对值更重要。
4.2 K线形态的量化表达
K线形态,很多人觉得是玄学。其实不是。你想想看,任何形态都可以用数学表达式来描述。关键是你怎么定义它。
我常用的量化方法:
- 定义形态特征:比如锤子线,下影线长度是实体的2倍以上,上影线很短或没有。
- 设定阈值:影线/实体比例、实体/总范围比例等。
- 组合条件:多个条件同时满足,才判定为某种形态。
举个例子,锤子线的量化表达:
def is_hammer(open, high, low, close):
"""
判断是否为锤子线
条件:
1. 下影线长度 >= 实体长度的2倍
2. 上影线长度 <= 实体长度的0.3倍
3. 实体不能太小(总范围的10%以上)
"""
body = abs(close - open)
upper_shadow = high - max(open, close)
lower_shadow = min(open, close) - low
total_range = high - low
if total_range == 0:
return False
condition1 = lower_shadow >= 2 * body
condition2 = upper_shadow <= 0.3 * body
condition3 = body >= 0.1 * total_range
return condition1 and condition2 and condition3
小技巧:阈值不要设得太死。我一般会留10%-20%的浮动空间,因为真实市场数据没那么完美。
4.3 常见K线形态的量化模板
下面是我整理的一些常用形态量化模板。嗯,这里要注意,这些模板不是万能的,需要根据你的交易品种和时间周期做调整。
| 形态名称 | 量化条件 | 信号含义 |
|---|---|---|
| 锤子线 | 下影线 ≥ 2×实体,上影线 ≤ 0.3×实体 | 底部反转(看涨) |
| 倒锤子线 | 上影线 ≥ 2×实体,下影线 ≤ 0.3×实体 | 底部反转(看涨) |
| 十字星 | 实体 ≤ 总范围的5% | 多空平衡,可能变盘 |
| 吞没形态 | 当前实体完全覆盖前一根实体 | 趋势反转 |
| 孕线 | 当前实体完全被前一根实体包含 | 趋势减弱 |
我曾经犯过一个错误:把十字星的阈值设成了10%。结果发现很多普通K线也被识别成了十字星,信号质量很差。后来改成5%,效果好了很多。所以阈值这东西,一定要回测验证。
4.4 多K线组合的量化
单根K线信号太弱,我一般会看组合。比如三只乌鸦、红三兵、上升三法这些。
组合形态的量化思路:
- 连续条件:连续N根K线满足某种特征
- 相对位置:每根K线的开盘价/收盘价相对于前一根的位置
- 形态约束:比如三只乌鸦要求每根收盘价都在前一根实体下方
举个例子,红三兵的量化:
def three_white_soldiers(df, n=3):
"""
红三兵:连续3根阳线,每根收盘价高于前一根
且每根开盘价在前一根实体范围内
"""
if len(df) < n:
return False
for i in range(-n+1, 1):
# 必须是阳线
if df['close'].iloc[i] <= df['open'].iloc[i]:
return False
# 收盘价依次抬高
if i > -n+1 and df['close'].iloc[i] <= df['close'].iloc[i-1]:
return False
# 开盘价在前一根实体范围内
if i > -n+1:
prev_open = df['open'].iloc[i-1]
prev_close = df['close'].iloc[i-1]
if not (min(prev_open, prev_close) <= df['open'].iloc[i] <= max(prev_open, prev_close)):
return False
return True
避坑指南:我曾经用这个红三兵策略做回测,发现胜率只有40%。后来仔细分析,发现很多红三兵出现在高位,其实是主力拉高出货。所以一定要结合位置判断——在低位出现的红三兵才有意义。
4.5 知识体系结构图
下面这张图,是我对本章知识体系的梳理。你可以把它当作一个思维导图来看。
4.6 实战中的注意事项
最后,说几点实战经验:
- 不要迷信形态:形态只是概率,不是确定性。我见过完美的锤子线之后继续暴跌的案例。
- 结合成交量:形态+成交量,信号质量会提升很多。比如锤子线配合放量,反转概率更高。
- 注意时间周期:日线级别的形态和分钟级别的形态,含义完全不同。别搞混了。
- 回测验证:任何形态策略,一定要做回测。我习惯用过去3年的数据做样本内测试,再用1年数据做样本外验证。
总结一下:价格模式识别,本质上是把市场参与者的行为模式,用数学语言表达出来。你不需要记住所有形态,但一定要理解背后的逻辑——多空博弈、供需关系、情绪变化。把这些想明白了,形态自然就活了。