Python实现股票数据滑动窗口目标标签标注的异常问题排查
算法说明

代码错误根因与修正方案
全量输出HOLD的问题是由4个明显的逻辑错误共同导致的,具体问题和修正方法如下:
错误1:窗口触发条件错误
你写的if counter > window_size会跳过第一个有效窗口,应该调整为if counter >= window_size,当counter等于窗口大小时刚好可以取到第一个长度为11的完整窗口。
错误2:极值判断逻辑完全无效
你在遍历窗口内元素时,每次循环都重新计算当前窗口的最小/最大值rng.min()、rng.max(),而遍历的number本身就是窗口内的元素,不可能小于窗口最小值或大于窗口最大值,因此更新min_idx、max_idx的分支永远不会触发,两个索引值一直保留初始值0,自然无法匹配中间位置。
错误3:索引维度不匹配
np.argmin(rng)返回的是窗口内部的相对偏移下标,而你用来比较的window_middle_idx是整个收盘价数组的全局绝对下标,二者维度不统一,永远不会相等,因此判断条件永远走到HOLD分支。
错误4:极值初始化位置错误
你将极值重置的逻辑写在分支末尾,第一次进入窗口判断时没有正确初始化极值基准,也会导致逻辑异常。
修正后的可运行代码
import numpy as np # 假设closing_price是已定义的收盘价序列 window_size = 11 half_window = window_size // 2 # 窗口一半长度,用来匹配相对中间位 counter = 0 result = [] while counter < len(closing_price): if counter >= window_size: window_begin_idx = counter - window_size window_end_idx = window_begin_idx + window_size - 1 # 取当前窗口的所有值 window_data = closing_price[window_begin_idx:window_end_idx+1] # 直接计算窗口内最小/最大值对应的相对偏移 min_rel_idx = np.argmin(window_data) max_rel_idx = np.argmax(window_data) # 窗口中间的相对偏移固定为half_window,无需计算全局下标 if max_rel_idx == half_window: result.append("SELL") elif min_rel_idx == half_window: result.append("BUY") else: result.append("HOLD") counter += 1
以上代码已经可以正常输出三类标签,不会仅返回HOLD结果,如果需要和原算法逻辑完全对齐,可自行补全窗口前半段的默认标签。
内容的提问来源于stack exchange,提问作者Krishnang K Dalal
相关产品推荐
相关产品推荐

