请求校验基于Python的均线金叉/死叉检测及计算函数
函数校验分析与改进建议
一、calculate_moving_average函数问题与优化
存在的问题
- 直接修改原数据:函数内直接给传入的
data添加列,会导致外部的原DataFrame被意外修改,引发不可预期的副作用。 - 无参数校验:未对
period做合法性检查(比如非正整数的情况),会直接导致rolling操作抛出错误。 - 未处理空值场景:若
Close列存在空值,计算出的移动平均线会包含NaN,但函数未做任何提示或处理。
优化后的代码
def calculate_moving_average(data, period): # 参数合法性校验 if not isinstance(period, int) or period <= 0: raise ValueError("period必须是正整数") # 复制原DataFrame,避免修改原数据 data_copy = data.copy() # 计算移动平均线 data_copy[f"Moving_{period}"] = data_copy["Close"].rolling(period).mean() return data_copy
二、check_golden_cross函数问题与优化
存在的问题
- 硬编码均线列名:固定使用
Moving_50和Moving_200,无法适配其他周期的均线交叉判断,灵活性不足。 - 未处理NaN值:移动平均线的前
period-1行是NaN,直接参与比较会导致逻辑错误(NaN参与比较结果为False),需跳过无效行。 - 依赖数据排序:默认假设输入
data按时间升序排列,但未做校验或提示,若数据顺序错误,交叉判断完全失效。
优化后的代码
import pandas as pd def check_golden_cross(data, short_period=50, long_period=200): golden_crosses = [] death_crosses = [] short_col = f"Moving_{short_period}" long_col = f"Moving_{long_period}" # 检查必要列是否存在 if short_col not in data.columns or long_col not in data.columns: raise ValueError(f"数据中缺少{short_col}或{long_col}列") # 从均线有效值的起始位置开始遍历 start_idx = max(short_period, long_period) - 1 for i in range(start_idx + 1, len(data.index)): short_curr = data[short_col][i] short_prev = data[short_col][i-1] long_curr = data[long_col][i] long_prev = data[long_col][i-1] # 跳过包含NaN的行 if pd.isna(short_curr) or pd.isna(short_prev) or pd.isna(long_curr) or pd.isna(long_prev): continue # 金叉判断:短均线上穿长均线 if short_curr >= long_curr and short_prev <= long_prev: golden_crosses.append(data.index[i]) # 死叉判断:短均线下穿长均线 elif short_curr <= long_curr and short_prev >= long_prev: death_crosses.append(data.index[i]) return golden_crosses, death_crosses
额外提示
- 使用前务必确保
data按时间升序排列,否则交叉日期判断会完全错误。 - 若处理大数据集,可改用向量化操作替代循环(比如结合
diff和shift),大幅提升计算效率。
内容的提问来源于stack exchange,提问作者Jeshuwa Bradley
相关产品推荐
相关产品推荐

