title: QuantLib Python Hull White Model - RuntimeError: time (20) is past max curve time (19)
body: <p>I tried using QuantLib-python to run several iterations of a Hull-White model. I followed along with the code and blog here:
  <a href="http://gouthamanbalaraman.com/blog/hull-white-simulation-quantlib-python.html" rel="nofollow noreferrer">http://gouthamanbalaraman.com/blog/hull-white-simulation-quantlib-python.html</a></p>
  <p>I made some edits from Balaraman's code on the site. Namely, I changed the spot_curve from being a FlatForward to a ZeroCurve. Now I keep getting an error. I am trying to model the zero curve data as seen in my code below.</p>
  <p><strong>Does anyone know how to fix this and implement the zero curve in QuantLib-python?</strong></p>
  <pre><code>from QuantLib import *
  import utils
  import numpy as np
  %matplotlib inline
  
  ##Assign all variables
  sigma = 0.015
  a = 0.1
  timestep = 30
  length = 30 # in years
  day_count = Thirty360()
  start_date = Date(19, 11, 1989)
  calendar = UnitedStates()
  interpolation = Linear()
  compounding = Compounded
  compoundingFrequency = Annual
  
  dates = [Date(19,11,1990), Date(19,11,1991), Date(19,11,1992), 
           Date(19,11,1993), Date(19,11,1994), Date(19,11,1995), 
           Date(19,11,1996), Date(19,11,1997), Date(19,11,1998),
           Date(19,11,1999), Date(19,11,2000), Date(19,11,2001),
           Date(19,11,2002), Date(19,11,2003), Date(19,11,2004),
           Date(19,11,2005), Date(19,11,2006), Date(19,11,2007),
           Date(19,11,2008), Date(19,11,2009)]
  
  zeros = [0.115974,0.118913,0.120676,0.121751,0.122455,0.122988,
           0.12347,0.123972,0.124527,0.125147,0.125831,0.126573,
           0.127359,0.128178,0.129016,0.129863,0.130708,0.131544,
           0.132364,0.133162]
  
  
  
  #setup spot curve. Notable difference is the ZeroCurve instead of FlatForward
  
  spot_curve = ZeroCurve(dates, zeros, day_count, calendar, interpolation, compounding, compoundingFrequency)
  spot_curve_handle = YieldTermStructureHandle(spot_curve)
  
  
  
  #The Hull-White process is constructed by passing the term-structure, a and sigma. 
  #To create the path generator, one has to provide a random sequence generator along 
  #with other simulation inputs such as timestep and `length.
  
  hw_process = HullWhiteProcess(spot_curve_handle, a, sigma)
  rng = GaussianRandomSequenceGenerator(
      UniformRandomSequenceGenerator(timestep, UniformRandomGenerator()))
  seq = GaussianPathGenerator(hw_process, length, timestep, rng, False)
  
  
  #define generate paths function
  def generate_paths(num_paths, timestep):
      arr = np.zeros((num_paths, timestep+1))
      for i in range(num_paths):
          sample_path = seq.next()
          path = sample_path.value()
          time = [path.time(j) for j in range(len(path))]
          value = [path[j] for j in range(len(path))]
          arr[i, :] = np.array(value)
      return np.array(time), arr
  
  
  #plotting short rates
  num_paths = 100
  paths = generate_paths(num_paths, timestep)
  fig, ax = utils.plot()
  for i in range(num_paths):
      ax.plot(time, paths[i, :], lw=0.8, alpha=0.6)
  ax.set_title(&quot;Hull-White Short Rate Simulation&quot;);
  </code></pre>
  <pre><code>---------------------------------------------------------------------------
  RuntimeError                              Traceback (most recent call last)
  &lt;ipython-input-3-366fe665a669&gt; in &lt;module&gt;
       62 #plotting short rates
       63 num_paths = 100
  ---&gt; 64 paths = generate_paths(num_paths, timestep)
       65 fig, ax = utils.plot()
       66 for i in range(num_paths):
  
  &lt;ipython-input-3-366fe665a669&gt; in generate_paths(num_paths, timestep)
       52     arr = np.zeros((num_paths, timestep+1))
       53     for i in range(num_paths):
  ---&gt; 54         sample_path = seq.next()
       55         path = sample_path.value()
       56         time = [path.time(j) for j in range(len(path))]
  
  ~/opt/anaconda3/lib/python3.7/site-packages/QuantLib/QuantLib.py in next(self)
    22328 
    22329     def next(self):
  &gt; 22330         return _QuantLib.GaussianPathGenerator_next(self)
    22331 
    22332     def antithetic(self):
  
  RuntimeError: time (20) is past max curve time (19)
  </code></pre>