Pandas计算Fibonacci回撤位结果错误,求问题排查与修正
问题分析与修正
你的代码核心错误在于不必要的groupby(["DateTime"])操作,这直接导致计算范围被限制在每个DateTime分组内,而非你需要的从数据集起始到当前行的全局历史序列。
错误原因
当你使用groupby(["DateTime"])后,expanding(1)会在每个DateTime分组内部进行滚动扩展计算:
- 如果
DateTime是唯一时间戳,每个分组仅包含一行数据,此时x.max()和x.min()都是当前行的Close值,计算结果会等于Close(显然不符合你的预期); - 如果
DateTime是日期(同一天的所有数据共用一个DateTime值),分组内的expanding只会统计当天从起始到当前点的高低点,而非整个数据集的历史高低点,这就会出现你看到的结果偏差。
修正后的代码
去掉groupby操作,直接对整个Close列应用expanding计算,这样就能获取从数据集开头到当前行的全部历史数据的高低点:
def fibonacci(x, v=0.786): closemax = x.max() closemin = x.min() return closemax - ((closemax - closemin) * v) # 直接对Close列做全局expanding计算 data_2["fibonacci786up"] = data_2["Close"].expanding(1).apply(lambda x: fibonacci(x, 0.786)).values
验证逻辑
修正后,expanding(1)会逐行累积从第一行到当前行的所有Close数据,此时x.max()和x.min()就是你需要的历史高低点,代入你给出的示例数值:
0.98433 - ((0.98433 - 0.96725) * 0.786) = 0.9709051200000001
就能得到符合预期的结果。
内容的提问来源于stack exchange,提问作者Niko
相关产品推荐
相关产品推荐

