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

C#按时间顺序查找股票低点到高点价差的技术方法问询

高效解决股票时间序列低点-高点价差计算问题

你的需求本质是在时间序列中,找到每个后续存在更高价格的低点与对应高点的价差(delta),核心是替代O(n²)的暴力循环,以下是两种成熟的高效解法:

方法一:单调栈(Monotonic Stack)—— 匹配首个后续高点

单调栈是处理这类“前后极值匹配”问题的标准高效方案,时间复杂度为O(n),每个数据点仅入栈和出栈一次。

思路

维护一个单调递减栈,存储价格及其索引。遍历每个价格时:

  1. 如果当前价格大于栈顶价格,说明栈顶的低点找到了后续的首个高点,计算两者的delta并记录。
  2. 弹出栈顶后继续比较,直到栈为空或当前价格不大于栈顶价格。
  3. 将当前价格和索引压入栈中,作为新的低点候选。

代码示例(基于Pandas)

import pandas as pd

# 模拟股票数据(实际替换为你的数据集)
df = pd.DataFrame({
    'datetime': pd.date_range(start='2024-01-01', periods=10, freq='D'),
    'price': [100, 95, 97, 102, 105, 103, 98, 101, 106, 104]
})

stack = []
delta_results = []

for idx, row in df.iterrows():
    current_price = row['price']
    # 匹配所有当前价格高于的栈内低点
    while stack and current_price > stack[-1][0]:
        low_price, low_idx = stack.pop()
        delta_results.append({
            'low_datetime': df.loc[low_idx, 'datetime'],
            'low_price': low_price,
            'high_datetime': row['datetime'],
            'high_price': current_price,
            'delta': current_price - low_price
        })
    stack.append((current_price, idx))

# 转换为结构化结果
delta_df = pd.DataFrame(delta_results)
print(delta_df)

方法二:反向累积最大值—— 匹配后续最高高点

如果你的需求是找到每个低点到后续所有高点中的最大值的价差,可以用反向遍历累积最大值的方式,同样是O(n)时间复杂度。

代码示例

# 计算每个位置之后的最高价格
df['future_max_price'] = df['price'][::-1].cummax()[::-1]
# 仅保留后续存在更高价格的记录并计算delta
df['delta'] = df['future_max_price'] - df['price']
df = df[df['delta'] > 0]

# 输出结果
print(df[['datetime', 'price', 'future_max_price', 'delta']])

类库辅助方案

如果需要先识别结构化的高低点(如周期内的摆动高低点),可以使用TA-Lib技术分析库辅助,但核心的价差匹配仍需结合上述算法:

import talib

# 识别5周期内的摆动低点和高点
df['swing_low'] = talib.SWINGLOW(df['price'], timeperiod=5)
df['swing_high'] = talib.SWINGHIGH(df['price'], timeperiod=5)

# 对识别出的摆动高低点,用单调栈或双指针法匹配后续高点

以上方案均避免了嵌套循环的低效问题,能轻松处理大规模股票数据。

内容的提问来源于stack exchange,提问作者Masoric

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 00:42:49