Skip to content
Advertisement

Random walk generate OverflowError: cannot convert float infinity to integer

I edited a chuck of random walk code from this link (ps: the orginal one works):

import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt
import random

days = 100 # time horizon
random.seed(2022)

def random_walk(startprice):
    price = np.zeros(days)
    
    x = np.round(np.random.uniform(0, 10, days))
    y = np.round(np.random.uniform(0, 10, days))
    
    price[0] = startprice
    for i in range(1, days):
        price[i] = (1 + 0.8*x[i] + 1.5*y[i])*price[i-1]
        # print(price[i])
    return price

fig, axn = plt.subplots(figsize=(10, 6))
for run in range(10):
    axn.plot(random_walk(10), label='time', linewidth='2')

But my edited version throw out an error: OverflowError: cannot convert float infinity to integer, does someone could help to fix this issue? Thanks in advance.

Advertisement

Answer

Well, x[i] can be as large as 10, and so can y[1], so

 (1 + 0.8*x[i] + 1.5*y[i])*price[i-1]

can be as large as (1 + 0.8*10 + 1.5*10)*price[i-1] = 24.0 * price[i-1].

You only need a few hundred of those chained to overflow to infinity:

>>> import math
>>> math.nextafter(math.inf, 0)
1.7976931348623157e+308
>>> math.log(_, 24)
223.3387949931843

Of course they won’t all be 10, but it doesn’t matter all that much: exponential growth quickly explodes regardless. If, e.g., they were all 5 instead:

>>> math.log(1.7976931348623157e+308, 5)
441.0127954671545

The question is more why you don’t expect it to overflow to infinity?

Note that the code you started from did not multiply on each step. It added a “random shock” instead. That’s far better behaved.

User contributions licensed under: CC BY-SA
4 People found this is helpful
Advertisement