Pandas判断区间价格是否突破斜率趋势线并新增Break列
Pandas 趋势线突破判断实现方案
核心逻辑梳理
- 首先统一两个数据集的日期格式,避免日期匹配错误
- 逐行处理斜率表的每一组区间数据:筛选出对应时间范围内的交易日,基于给定斜率计算每日趋势线投影价格
- 突破判定规则:区间内只要存在任意一天满足
趋势线投影价格 < 当日最高价 * 0.996,即标记为突破(True),否则为False
完整实现代码
import pandas as pd import numpy as np # 1. 加载原始数据集 slopes = {'slope': [-1.6541925161, -3.118229956, -1.607413448], 'Date1': ['2021-12-16', '2021-12-29', '2021-12-13'], 'Date2': ['2021-12-23', '2021-12-31', '2021-12-17'], 'Date3': ['2021-12-28', '2022-01-03', '2021-12-27'], } slope_and_dates = pd.DataFrame(slopes) Historical_prices = { 'Date': ['10/12/2021', '13/12/2021', '14/12/2021', '15/12/2021', '16/12/2021', '17/12/2021', '20/12/2021', '21/12/2021', '22/12/2021', '23/12/2021', '27/12/2021', '28/12/2021', '29/12/2021', '30/12/2021', '31/12/2021', '3/1/2022'], 'High': [1020.97998, 1005, 966.409973, 978.75, 994.97998, 960.659973, 921.690002, 939.5, 1015.659973, 1072.97998, 1117, 1119, 1104, 1095.550049, 1082, 1079], } Dates = pd.DataFrame(Historical_prices) # 2. 统一日期格式(关键步骤,否则日期匹配会出错) # slope_and_dates的日期是年-月-日格式,直接转datetime slope_and_dates[['Date1', 'Date2', 'Date3']] = slope_and_dates[['Date1', 'Date2', 'Date3']].apply(pd.to_datetime) # Dates的日期是日/月/年格式,转datetime需要指定dayfirst=True Dates['Date'] = pd.to_datetime(Dates['Date'], dayfirst=True) # 把Dates转成日期为索引的结构,方便快速取值 Dates = Dates.set_index('Date').sort_index() # 3. 逐行计算突破标记 break_flags = [] for _, row in slope_and_dates.iterrows(): d1 = row['Date1'] d3 = row['Date3'] slope = row['slope'] # 筛选[Date1, Date3]闭区间内的所有交易日 interval_data = Dates.loc[d1:d3].copy() # 取区间起点的最高价作为趋势线起点价格 p_start = interval_data.loc[d1, 'High'] # 计算每个交易日距离起点的自然日差 interval_data['delta_days'] = (interval_data.index - d1).days # 计算当日趋势线投影价格 interval_data['proj_price'] = p_start + slope * interval_data['delta_days'] # 判断是否存在突破 has_break = (interval_data['proj_price'] < interval_data['High'] * 0.996).any() break_flags.append(has_break) # 把结果写入原表 slope_and_dates['Break'] = break_flags # 打印结果 print(slope_and_dates)
代码说明
- 日期格式转换是核心前置步骤:由于两个表的日期字符串格式不一致,必须统一转成pandas的datetime类型才能正确做区间筛选
- 趋势线计算逻辑:以区间起点Date1对应的最高价为基准,每过1自然日,趋势线价格变动等于给定的slope值,和区间内实际价格无关
- 判定逻辑用
.any()实现:只要区间内有1天满足突破条件,就标记为True,不需要手动遍历所有日期做判断
运行结果
运行后输出的slope_and_dates表如下:
slope Date1 Date2 Date3 Break 0 -1.654193 2021-12-16 2021-12-23 2021-12-28 True 1 -3.118230 2021-12-29 2021-12-31 2022-01-03 False 2 -1.607413 2021-12-13 2021-12-17 2021-12-27 True
内容的提问来源于stack exchange,提问作者Artrade
相关产品推荐
相关产品推荐

