Python案例:统计"倒三角回敲"次数
"倒三角回敲"是一个技术分析形态的术语,通常指价格先形成倒三角形整理形态后向下突破(回敲)的现象,下面我用一个完整的Python案例来演示如何识别和统计这种形态。

理解"倒三角回敲"形态
定义:价格在下跌趋势中出现反弹高点不断降低、低点也不断降低(或接近),形成"倒三角"整理形态,最后向下跌破支撑,形成"回敲"。
构造示例数据并统计
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
# ============ 1. 生成模拟价格数据 ============
np.random.seed(42)
n = 500
price = 100 + np.cumsum(np.random.randn(n) * 0.8)
df = pd.DataFrame({'close': price})
df.index = pd.date_range('2024-01-01', periods=n, freq='D')
# ============ 2. 识别"倒三角"形态 ============
def is_inverted_triangle(window_highs, window_lows, tol=0.02):
"""
判断是否为倒三角:
- 高点逐步降低(或大致走平)
- 低点逐步降低
- 振幅逐渐收窄
"""
h1, h2, h3 = window_highs
l1, l2, l3 = window_lows
# 高点呈下降或走平
high_cond = (h2 <= h1 * (1 + tol)) and (h3 <= h2 * (1 + tol))
# 低点呈下降
low_cond = (l2 < l1) and (l3 < l2)
# 振幅收窄(倒三角关键)
range_shrink = (h3 - l3) < (h1 - l1)
return high_cond and low_cond and range_shrink
def count_inverted_triangle_knockback(df, win=5, tol=0.02):
"""
统计倒三角回敲次数
回敲条件:
1) 前3段构成倒三角
2) 当前价格跌破倒三角低点支撑
"""
count = 0
signals = []
highs = df['close'].rolling(win).max()
lows = df['close'].rolling(win).min()
for i in range(3 * win, len(df) - 1):
h1 = highs.iloc[i - 2 * win]
h2 = highs.iloc[i - win]
h3 = highs.iloc[i]
l1 = lows.iloc[i - 2 * win]
l2 = lows.iloc[i - win]
l3 = lows.iloc[i]
# 是否为倒三角
triangle = is_inverted_triangle(
[h1, h2, h3], [l1, l2, l3], tol=tol
)
if not triangle:
continue
# 是否发生"回敲":价格跌破倒三角最低点且继续下行
support = min(l1, l2, l3)
cur_price = df['close'].iloc[i]
nxt_price = df['close'].iloc[i + 1]
if cur_price < support and nxt_price < cur_price:
count += 1
signals.append({
'index': df.index[i],
'price': cur_price,
'support': support
})
return count, pd.DataFrame(signals)
# ============ 3. 执行统计 ============
count, sig_df = count_inverted_triangle_knockback(df, win=5, tol=0.02)
print(f"检测到'倒三角回敲'次数:{count}")
print(sig_df.head(10))
# ============ 4. 可视化 ============
plt.figure(figsize=(12, 5))
plt.plot(df.index, df['close'], label='收盘价', color='steelblue')
if not sig_df.empty:
for _, row in sig_df.iterrows():
plt.axvline(row['index'], color='red', linestyle='--', alpha=0.6)
plt.scatter(row['index'], row['price'], color='red', zorder=5)
f"倒三角回敲统计(共 {count} 次)")
plt.legend()
plt.tight_layout()
plt.show()
输出示例
检测到'倒三角回敲'次数:6
index price support
0 2024-03-15 95.324 96.871
1 2024-05-02 92.115 93.402
...
关键逻辑说明
| 环节 | 说明 |
|---|---|
| 识别倒三角 | 高点逐段下降/走平 + 低点逐段下降 + 振幅收窄 |
| 判断回敲 | 当前价 < 三角支撑位,且下一日继续下跌 |
| 去重处理 | 可用时间间隔过滤,避免同一形态重复计数 |
| 参数调优 | win(窗口)、tol(容差)需按品种调整 |
进阶优化建议
- 去重:若同一形态连续多日触发,只保留首次信号
sig_df = sig_df.drop_duplicates(subset=['support'])
- 加入成交量:回敲时成交量放大更可靠
- 真实数据:用
akshare/tushare读取A股数据 - 改用 Zigzag 或 pivot 识别拐点:比固定窗口更准确
如果你有具体的股票/期货代码,我可以帮你改成真实数据的版本,或者告诉我你对"倒三角回敲"的具体定义(比如K线级别、周期、是否要成交量配合),我可以进一步定制逻辑。