code: def make_commodity_future_info(first_sid,
                                 root_symbols,
                                 years,
                                 month_codes=None,
                                 multiplier=500):
      
      nineteen_days = pd.Timedelta(days=19)
      one_year = pd.Timedelta(days=365)
      return make_future_info(
          first_sid=first_sid,
          root_symbols=root_symbols,
          years=years,
          notice_date_func=lambda dt: dt - MonthBegin(2) + nineteen_days,
          expiration_date_func=lambda dt: dt - MonthBegin(1) + nineteen_days,
          start_date_func=lambda dt: dt - one_year,
          month_codes=month_codes,
          multiplier=multiplier,
      )
docs: Make futures testing data that simulates the notice/expiration date
      behavior of physical commodities like oil.
  
      Parameters
      ----------
      first_sid : int
          The first sid to use for assigning sids to the created contracts.
      root_symbols : list[str]
          A list of root symbols for which to create futures.
      years : list[int or str]
          Years (e.g. 2014), for which to produce individual contracts.
      month_codes : dict[str -> [1..12]], optional
          Dictionary of month codes for which to create contracts.  Entries
          should be strings mapped to values from 1 (January) to 12 (December).
          Default is zipline.futures.CMES_CODE_TO_MONTH
      multiplier : int
          The contract multiplier.
  
      Expiration dates are on the 20th of the month prior to the month code.
      Notice dates are are on the 20th two months prior to the month code.
      Start dates are one year before the contract month.
  
      See Also
      --------
      make_future_info