C#按时间顺序查找股票低点到高点价差的技术方法问询
高效解决股票时间序列低点-高点价差计算问题
你的需求本质是在时间序列中,找到每个后续存在更高价格的低点与对应高点的价差(delta),核心是替代O(n²)的暴力循环,以下是两种成熟的高效解法:
方法一:单调栈(Monotonic Stack)—— 匹配首个后续高点
单调栈是处理这类“前后极值匹配”问题的标准高效方案,时间复杂度为O(n),每个数据点仅入栈和出栈一次。
思路
维护一个单调递减栈,存储价格及其索引。遍历每个价格时:
- 如果当前价格大于栈顶价格,说明栈顶的低点找到了后续的首个高点,计算两者的delta并记录。
- 弹出栈顶后继续比较,直到栈为空或当前价格不大于栈顶价格。
- 将当前价格和索引压入栈中,作为新的低点候选。
代码示例(基于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
相关产品推荐
相关产品推荐

