Ejemplo n.º 1
0
def generate_trendy_pdseries(
        Nlength,
        Tlength,
        Xamplitude,
        Volscale,
        sines=False,
        date_start=pd.datetime(1980, 1, 1),
):
    """
    Generates a trend of length N amplitude X, plus gaussian noise mean zero std. dev (vol scale * amplitude)
    With an arbitrary datetime index

    If sines=True then generates as a sine wave, otherwise straight line

    :param Nlength: total number of returns to generate
    :type Nlength: int

    :param Tlength: Length of each trend
    :type Tlength: int

    :param Xamplitude: Amplitude of each trend
    :type Xamplitude: float

    :param Volscale: Ratio of volatility to amplitude
    :type Volscale: float

    :param sines: Generate a sine wave (if True), or a saw tooth (False). Default False.
    :type sines: bool

    :param date_start: Start date for arbitrary series
    :type date_start: datetime

    :returns: a pd.Series, length Nlength

    >>> generate_trendy_pdseries(10, 5, 5, 0.0)
    1980-01-01    0.0
    1980-01-02    1.0
    1980-01-03    2.0
    1980-01-04    3.0
    1980-01-07    4.0
    1980-01-08    5.0
    1980-01-09    4.0
    1980-01-10    3.0
    1980-01-11    2.0
    1980-01-14    1.0
    Freq: B, dtype: float64

    >>> generate_trendy_pdseries(10, 5, 5, 0.0, True)
    1980-01-01    0.000000e+00
    1980-01-02    1.469463e+00
    1980-01-03    2.377641e+00
    1980-01-04    2.377641e+00
    1980-01-07    1.469463e+00
    1980-01-08    2.220446e-16
    1980-01-09   -1.469463e+00
    1980-01-10   -2.377641e+00
    1980-01-11   -2.377641e+00
    1980-01-14   -1.469463e+00
    Freq: B, dtype: float64
    """

    stdev = Volscale * Xamplitude
    noise_returns_as_list = generate_noise(Nlength, stdev)

    # Can use a different process here if desired
    if sines:
        process_as_list = generate_siney_trends(Nlength, Tlength, Xamplitude)
    else:
        process_as_list = generate_trends(Nlength, Tlength, Xamplitude)

    pd_process = create_arbitrary_pdseries(process_as_list,
                                           date_start=date_start)
    noise_returns = create_arbitrary_pdseries(noise_returns_as_list,
                                              date_start=date_start)

    process_returns = pd_process.diff()
    combined_returns = noise_returns + process_returns

    combined_returns[0] = 0
    combined_price = combined_returns.cumsum()

    return combined_price

    return pdseries
Ejemplo n.º 2
0
def generate_trendy_pdseries(Nlength,
                             Tlength,
                             Xamplitude,
                             Volscale,
                             sines=False,
                             date_start=pd.datetime(1980, 1, 1)):
    """
    Generates a trend of length N amplitude X, plus gaussian noise mean zero std. dev (vol scale * amplitude)
    With an arbitrary datetime index

    If sines=True then generates as a sine wave, otherwise straight line

    :param Nlength: total number of returns to generate
    :type Nlength: int

    :param Tlength: Length of each trend
    :type Tlength: int

    :param Xamplitude: Amplitude of each trend
    :type Xamplitude: float

    :param Volscale: Ratio of volatility to amplitude
    :type Volscale: float

    :param sines: Generate a sine wave (if True), or a saw tooth (False). Default False.
    :type sines: bool

    :param date_start: Start date for arbitrary series
    :type date_start: datetime

    :returns: a pd.Series, length Nlength

    >>> generate_trendy_pdseries(10, 5, 5, 0.0)
    1980-01-01    0.0
    1980-01-02    1.0
    1980-01-03    2.0
    1980-01-04    3.0
    1980-01-07    4.0
    1980-01-08    5.0
    1980-01-09    4.0
    1980-01-10    3.0
    1980-01-11    2.0
    1980-01-14    1.0
    Freq: B, dtype: float64

    >>> generate_trendy_pdseries(10, 5, 5, 0.0, True)
    1980-01-01    0.000000e+00
    1980-01-02    1.469463e+00
    1980-01-03    2.377641e+00
    1980-01-04    2.377641e+00
    1980-01-07    1.469463e+00
    1980-01-08    2.220446e-16
    1980-01-09   -1.469463e+00
    1980-01-10   -2.377641e+00
    1980-01-11   -2.377641e+00
    1980-01-14   -1.469463e+00
    Freq: B, dtype: float64
    """

    stdev = Volscale * Xamplitude
    noise_returns_as_list = generate_noise(Nlength, stdev)

    ## Can use a different process here if desired
    if sines:
        process_as_list = generate_siney_trends(Nlength, Tlength, Xamplitude)
    else:
        process_as_list = generate_trends(Nlength, Tlength, Xamplitude)

    pd_process = create_arbitrary_pdseries(
        process_as_list, date_start=date_start)
    noise_returns = create_arbitrary_pdseries(
        noise_returns_as_list, date_start=date_start)

    process_returns = pd_process.diff()
    combined_returns = noise_returns + process_returns

    combined_returns[0] = 0
    combined_price = combined_returns.cumsum()

    return combined_price

    return pdseries