如何用Numpy判断当前价格是否为前K个价格中的最大/最小值?
解决Numpy滑动窗口下的极值判断问题
你可以用Numpy的np.lib.stride_tricks.sliding_window_view来实现滑动窗口的极值计算,配合简单的条件判断就能得到目标结果。以下是针对你需求的完整实现:
import numpy as np def generate_signal(prices, k): n = len(prices) signals = np.zeros(n, dtype=int) # 当k大于数组长度时直接返回全0数组(可选边界处理) if k > n: return signals # 生成滑动窗口,每个窗口包含当前位置及前k-1个元素 windows = np.lib.stride_tricks.sliding_window_view(prices, window_shape=k) # 计算每个窗口的最大值和最小值 window_max = np.max(windows, axis=1) window_min = np.min(windows, axis=1) # 获取对应位置的价格(窗口的最后一个元素) current_prices = prices[k-1:] # 赋值信号:最大值为1,最小值为-1 signals[k-1:] = np.where(current_prices == window_max, 1, np.where(current_prices == window_min, -1, 0)) return signals # 测试你的示例 prices = np.array([1,2,3,2,1,6]) k = 3 print(generate_signal(prices, k)) # 输出: [0 0 1 0 -1 1]
关键步骤解释:
- 滑动窗口生成:
sliding_window_view会将输入数组转换为形状为(n-k+1, k)的二维数组,每一行对应一个长度为k的滑动窗口。比如你的示例数组会生成窗口:[[1,2,3], [2,3,2], [3,2,1], [2,1,6]]。 - 极值计算:对每个窗口沿轴1计算最大/最小值,得到和窗口数量一致的极值数组。
- 信号赋值:用嵌套
np.where完成多条件判断,将符合最大值的位置设为1,最小值设为-1,其余为0,最后把结果赋值给信号数组的对应位置(从第k-1位开始)。
兼容旧版本Numpy(<1.20)的替代方案:
如果你的Numpy版本不支持sliding_window_view,可以用np.lib.stride_tricks.as_strided手动构造滑动窗口(注意需确保数组是连续的):
def generate_signal_old(prices, k): n = len(prices) signals = np.zeros(n, dtype=int) if k > n: return signals # 手动构造滑动窗口 stride = prices.strides[0] windows = np.lib.stride_tricks.as_strided(prices, shape=(n - k + 1, k), strides=(stride, stride)) window_max = np.max(windows, axis=1) window_min = np.min(windows, axis=1) current_prices = prices[k-1:] signals[k-1:] = np.where(current_prices == window_max, 1, np.where(current_prices == window_min, -1, 0)) return signals
这样就能完美满足你的需求,前k-1个元素默认设为0,后续元素根据是否是前k个价格的最大/最小值输出对应信号。
内容的提问来源于stack exchange,提问作者MUHAMMAD LABEEB
相关产品推荐
相关产品推荐

