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

请求校验基于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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 23:10:14