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

Python新手求助:计算并存储价格与MA的特定距离

问题分析与修正方案

你的核心问题是信号判断逻辑错误,导致上穿区间的数据没被正确收集,下穿触发时数组为空。原代码里的条件只捕获了“昨日和今日都在MA上方”的情况,漏掉了上穿当天的起始信号,而且重复判断相同条件,逻辑混乱。

修正后的逻辑梳理

  1. 上穿信号:昨日价格在MA下方,今日价格站上MA(区间起点,开始收集数据)
  2. 持续跟踪:价格维持在MA上方时,持续收集每日的价格和价格-MA差值
  3. 下穿信号:昨日价格在MA上方,今日价格跌破MA(区间终点,计算峰值并重置数组)

修正代码

import numpy as np
import pandas as pd

# 初始化存储数组
price = []
diff = []
peak_diff = []  # 价格与MA的峰值距离
peak_to_trough = []  # 价格最高点至下穿时价格的距离

for i in range(len(data)):
    # 直接提取单行数据,简化取值操作
    row = data.iloc[i]
    close_yest = row["Close Yesterday"]
    ma_yest = row["MA Yesterday"]
    close_today = row["Close"]
    ma_today = row["MA"]

    # 1. 上穿信号:昨日在MA下,今日在MA上 → 启动数据收集
    if close_yest < ma_yest and close_today > ma_today:
        price.append(close_today)
        diff.append(close_today - ma_today)
    
    # 2. 持续在MA上方:昨日和今日都在MA上 → 继续收集
    elif close_yest > ma_yest and close_today > ma_today:
        price.append(close_today)
        diff.append(close_today - ma_today)
    
    # 3. 下穿信号:昨日在MA上,今日在MA下 → 计算指标并重置
    elif close_yest > ma_yest and close_today < ma_today:
        # 先检查数组非空,避免空数组导致的报错
        if price and diff:
            peak_diff.append(np.max(diff))
            peak_to_trough.append(np.max(price) - close_today)
            # 重置数组,准备下一个区间的收集
            price = []
            diff = []

关键改进点

  • 用data.iloc[i]直接提取单行数据,避免了切片取值的冗余操作
  • 拆分三种清晰的信号场景,逻辑不再混乱
  • 增加数组非空检查,防止下穿时因无数据触发np.max()报错
  • 上穿当天直接加入今日数据,确保区间从信号触发日开始完整收集

内容的提问来源于stack exchange,提问作者Steven Pham

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 00:55:22