Python新手求助:计算并存储价格与MA的特定距离
问题分析与修正方案
你的核心问题是信号判断逻辑错误,导致上穿区间的数据没被正确收集,下穿触发时数组为空。原代码里的条件只捕获了“昨日和今日都在MA上方”的情况,漏掉了上穿当天的起始信号,而且重复判断相同条件,逻辑混乱。
修正后的逻辑梳理
- 上穿信号:昨日价格在MA下方,今日价格站上MA(区间起点,开始收集数据)
- 持续跟踪:价格维持在MA上方时,持续收集每日的价格和价格-MA差值
- 下穿信号:昨日价格在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
相关产品推荐
相关产品推荐

