python案例统计倒三角回敲次数多少?

wen python案例 1

Python案例:统计"倒三角回敲"次数

"倒三角回敲"是一个技术分析形态的术语,通常指价格先形成倒三角形整理形态后向下突破(回敲)的现象,下面我用一个完整的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(容差)需按品种调整

进阶优化建议

  1. 去重:若同一形态连续多日触发,只保留首次信号
    sig_df = sig_df.drop_duplicates(subset=['support'])
  2. 加入成交量:回敲时成交量放大更可靠
  3. 真实数据:用 akshare / tushare 读取A股数据
  4. 改用 Zigzag 或 pivot 识别拐点:比固定窗口更准确

如果你有具体的股票/期货代码,我可以帮你改成真实数据的版本,或者告诉我你对"倒三角回敲"的具体定义(比如K线级别、周期、是否要成交量配合),我可以进一步定制逻辑。

上一篇综合赛后python案例,控球率低反而赢球?

下一篇当前分类已是最新一篇

抱歉,评论功能暂时关闭!