Python实现TradingView中Laguerre PPO函数遇KeyError报错求助
问题分析与解决方案
错误原因
你的Python代码无法正确模拟Pine Script中lag函数的递归逻辑:
- Pine Script的
nz(L0[1])是取上一根K线的L0值,属于逐行递归计算; - 你用向量式的
shift()操作无法实现这种依赖前序结果的递归,且初始空DataFrame的shift操作会导致计算结果异常,最终lagfunction返回的无效数据无法成功写入dataframe['lmas'],触发KeyError。
修改后的代码
import pandas as pd Short = 0.1 Long = 0.3 def lagfunction(g, p: pd.Series) -> pd.Series: # 初始化递归变量,对应Pine Script的nz(...)默认填充0 prev_L0 = 0.0 prev_L1 = 0.0 prev_L2 = 0.0 prev_L3 = 0.0 result = [] for val in p: # 完全匹配Pine Script的逐bar计算逻辑 curr_L0 = (1 - g) * val + g * prev_L0 curr_L1 = -g * curr_L0 + prev_L0 + g * prev_L1 curr_L2 = -g * curr_L1 + prev_L1 + g * prev_L2 curr_L3 = -g * curr_L2 + prev_L2 + g * prev_L3 f = (curr_L0 + 2 * curr_L1 + 2 * curr_L2 + curr_L3) / 6 result.append(f) # 更新前序值,供下一根bar计算使用 prev_L0, prev_L1, prev_L2, prev_L3 = curr_L0, curr_L1, curr_L2, curr_L3 return pd.Series(result, index=p.index) # 假设dataframe已包含high、low列 dataframe['hl2'] = (dataframe['high'] + dataframe['low']) / 2 dataframe['lmas'] = lagfunction(Short, dataframe['hl2']) dataframe['lmal'] = lagfunction(Long, dataframe['hl2']) dataframe['ppoT'] = (dataframe['lmas'] - dataframe['lmal']) / dataframe['lmal'] * 100
关键修改点
- 将输入参数
p的类型从DataFrame改为Series(hl2是单列数据,用Series更合理); - 用逐行迭代模拟Pine Script的递归逻辑,每一步计算都依赖上一行的L0-L3值;
- 初始化递归的前序值为0,对应Pine Script中
nz()函数的默认填充行为; - 返回带索引的Series,确保能与原dataframe的索引匹配,成功写入新列。
内容的提问来源于stack exchange,提问作者adsjr
相关产品推荐
相关产品推荐

