You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 05:45:42