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
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