def create_grid(start, stop, frequency):
    """
    create_grid - returns an evenly grid in a list, with a number of points per year
    equal to the frequency. For example, frequency = 2 means semiannual.

    For example, create an annual grid from years 0 -> 5 (inclusive)
    >>> create_grid(0., 5., 1)
    [0.0, 1.0, 2.0, 3.0, 4.0, 5.0]

    Create a semi-annual grid with frequency = 2
    >>> create_grid(0., 2., 2)
    [0.0, 0.5, 1.0, 1.5, 2.0]

    Negative time is allowed.
    >>> create_grid(-1., 0, 4)
    [-1.0, -0.75, -0.5, -0.25, 0.0]

    Note that dates are aligned to the start date, and if the end point is not an even number of
    time steps from the start, the interval terminates at the last equally-spaced point before the
    stop point.
    >>> create_grid(10., 11.1, 1)
    [10.0, 11.0]
    >>> create_grid(10., 11.6, 2)
    [10.0, 10.5, 11.0, 11.5]

    Raises a ValueError if the stop point is before the start point.
    >>> create_grid(1., 0., 1)
    Traceback (most recent call last):
    ...
    ValueError: Stop point must be after start

    NOTE: There are similar functions in NumPy (arange, ...), but I do not want to introduce
    a major dependence on non-standard libraries here.

    :param start: float
    :param stop: float
    :param frequency: int
    :return: list
    """
    if stop < start:
        raise ValueError('Stop point must be after start')
    frequency = float(frequency)
    start = float(start)
    interval = int(frequency * (stop - start))
    #  Generate an integer grid
    out = range(0, interval + 1)
    # return to original time interval as floats
    return [start + float(x) / frequency for x in out]