倒三角回敲”的统计脚本,我需要先确认一下您所指的具体场景,因为在不同的领域(如体育战术、游戏操作、金融交易或打谱软件),“倒三角回敲”含义完全不同。

为了给您最精准的脚本,请您先确认是以下哪种情况:
乒乓球/网球(体育战术) 指对方回球形成“倒三角”落点(通常指对方回球到您正手位小三角或反手位小三角),然后您进行“回敲”(即主动发力拍击)的次数统计。
台球/斯诺克(库边反弹) 指母球吃一库或两库后,通过“倒三角”路径回敲目标球的次数。
金融交易(K线形态) 指行情走出“倒三角形”收敛形态后,价格向下或向上突破(回敲)的次数。
围棋/象棋(AI复盘) 指某特定棋形(倒三角形状)落子后,对方“回敲”(应对)的频次。
如果您是指“金融交易K线形态”(最常用),请看以下实用脚本(Python):
这个脚本用于统计在“倒三角收敛形态”形成期间,价格触及上下两条趋势线的回敲次数(即假突破或试探次数)。
import pandas as pd
import numpy as np
def count_triangle_whipsaw(df, lookback=30, touch_tolerance=0.002):
"""
统计倒三角(收敛)形态中的回敲次数。
参数:
df: 包含 'high', 'low', 'close' 的DataFrame(按时间升序)
lookback: 回看周期(用于确定三角形态范围)
touch_tolerance: 价格触及趋势线的容差(如0.002代表0.2%)
返回:
whipsaw_count: 回敲次数
breakdown_count: 向下破位次数
breakdown_flag: 是否已破位(True表示三角已失效)
"""
if len(df) < lookback:
return 0, 0, False
# 取最近lookback根K线
window = df.iloc[-lookback:].reset_index(drop=True)
highs = window['high'].values
lows = window['low'].values
closes = window['close'].values
n = len(window)
# 1. 识别倒三角(上趋势线下降,下趋势线上升)
# 上趋势线:连接第一个高点和最后一个高点(或回归斜率)
# 简单方法:线性回归斜率
x = np.arange(n)
# 上轨斜率(应<0,即下降)
slope_upper = np.polyfit(x, highs, 1)[0]
# 下轨斜率(应>0,即上升)
slope_lower = np.polyfit(x, lows, 1)[0]
# 判断是否为倒三角(上轨向下,下轨向上)
if slope_upper >= 0 or slope_lower <= 0:
# 不是倒三角,直接返回
return 0, 0, False
# 2. 计算上下轨在每根K线的理论值
upper_line = np.polyval(np.polyfit(x, highs, 1), x)
lower_line = np.polyval(np.polyfit(x, lows, 1), x)
# 3. 统计回敲次数
whipsaw_count = 0 # 触及上轨后又回到内部(向下回敲),或触及下轨后又回到内部(向上回敲)
breakdown_count = 0 # 向下突破下轨(收盘价跌破)
# 从第二根K线开始判断(第一根是起点)
for i in range(1, n-1): # 不判断最后一根,因为需要看后续
# 判断是否突破下轨(破位)
if closes[i] < lower_line[i] * (1 - touch_tolerance):
breakdown_count += 1
# 出现破位,三角形态终结
if breakdown_count == 1:
return whipsaw_count, breakdown_count, True
# 判断是否触及上轨(向上试探)
touched_upper = highs[i] >= upper_line[i] * (1 - touch_tolerance)
# 判断是否触及下轨(向下试探)
touched_lower = lows[i] <= lower_line[i] * (1 + touch_tolerance)
# 如果是向上触及上轨,且之前没有连续多次触及,且之后价格回落(没收在上轨上方),记一次向上回敲
if touched_upper:
# 简化:只要触及且没有突破前高,就算一次向上回敲
whipsaw_count += 1
# 如果是向下触及下轨,且之后价格反弹(没收在下轨下方),记一次向下回敲
if touched_lower and not (closes[i] < lower_line[i] * (1 - touch_tolerance)):
whipsaw_count += 1
return whipsaw_count, breakdown_count, False
# ========== 使用示例 ==========
if __name__ == "__main__":
# 模拟数据(实际使用时替换为您的行情数据)
# 这里生成一个典型的倒三角形态
np.random.seed(42)
n = 30
# 制造收敛:高点逐渐降低,低点逐渐抬高
highs = np.linspace(105, 100, n) + np.random.normal(0, 0.3, n)
lows = np.linspace(95, 99, n) + np.random.normal(0, 0.3, n)
closes = (highs + lows) / 2 + np.random.normal(0, 0.5, n)
df = pd.DataFrame({
'high': highs,
'low': lows,
'close': closes
})
whipsaw, breakdown, ended = count_triangle_whipsaw(df, lookback=n)
print(f"倒三角形态统计结果:")
print(f"回敲次数(上下轨触碰且收复): {whipsaw} 次")
print(f"向下破位次数: {breakdown} 次")
print(f"是否已破位: {'是' if ended else '否'}")
# 更进一步:统计最后一次回敲后到破位的时间间隔
# 这个需要根据您的需求继续扩展
如果您是指“乒乓球/网球战术统计”(视频分析),用这个简化版:
假设您有一份记录每次回球落点的表格(列:击球方、落点区域),统计“倒三角”落点后我方主动发力(回敲)的次数:
import pandas as pd
def count_backhand_triangle_attack(df):
"""
df: 包含 columns=['击球方', '落点区域', '是否主动发力']
落点区域: 1-反手小三角, 2-反手底线, 3-中路, 4-正手小三角, 5-正手底线
"""
# 倒三角落点:反手小三角(1) 或 正手小三角(4)
triangle_zones = [1, 4]
# 我方(假设我方为A,对方为B)
# 对方回球到小三角,我方下一拍是否主动发力
count = 0
for i in range(len(df)-1):
current_row = df.iloc[i]
next_row = df.iloc[i+1]
# 对方(B)回球到倒三角区域
if current_row['击球方'] == 'B' and current_row['落点区域'] in triangle_zones:
# 我方(A)下一拍是否主动发力(回敲)
if next_row['击球方'] == 'A' and next_row['是否主动发力'] == True:
count += 1
return count
请告诉我您的具体场景(体育/游戏/金融/棋类),以及您手中数据的形式(是K线数据、比赛视频标记、还是游戏日志),我可以立刻为您量身定制最精准的统计脚本,回复个关键词或描述下背景即可。