Find the maximum price change over any 1 to 5 day rolling window The code below solves the following task

Find the maximum price change over any 1 to 5 day rolling window, over a 1000 day period.

To be clear &quot;any 1 to 5 day rolling window&quot; means t[i:i + j] where j can range from 1 to 5. Rather than t[i:i + 5] if it were just &quot;any 5 day rolling window&quot;.
I used NumPy native functions to do this. But I've used a for-loop for the inner iteration.
import numpy as np
import numpy.random as npr

prices = npr.random([1000,1])*1000

max_array = np.zeros([(prices.size-5),1])
for index, elem in np.ndenumerate(prices[:-5,:]):
    local_max = 0.0
    for i in range(1,6,1):
        price_return = prices[(index[0] + i),0] / elem
        local_max = max(local_max, price_return)
    max_array[index[0]] = local_max
global_max = np.amax(max_array)

Can I somehow eliminate the inner for loop and use NumPy vectorization instead?
I also don't particularly like using &quot;index[0]&quot; to extract the actual index of the current loop from the tuple object that is returned into the variable &quot;index&quot; via the call:

for index, elem in np.ndenumerate(prices[:-5,:]):
A first pass will see (as Vishesh suggests) collapsing one dimension, and properly unpacking the index tuple:
import numpy as np

# Window size
W = 5

prices = np.arange(1, 10)  # npr.random([1000,1])*1000

max_array = np.zeros(prices.size-W)
for (index,), elem in np.ndenumerate(prices[:-W]):
    local_max = 0
    for i in range(1, W+1):
        price_return = prices[index + i] / elem
        local_max = max(local_max, price_return)
    max_array[index] = local_max
global_max = np.amax(max_array)

I've also replaced your random array with a simple one so that this is repeatable and verifiable. You should make your window size parametric or at least configurable via constant.
Unfortunately, none of the native Numpy options are great. Your best bet is to use Pandas:
import numpy as np
import pandas as pd

# Window size
W = 5

rolled = (
    pd.Series(prices)
    .rolling(window=W)
    .min()
    .to_numpy()
)
max_array = prices[1-W:] / rolled[W-1:-1]

I have tested this to be equivalent. Note that you need to start with a rolling minimum in the denominator to get a maximum numerator.