identificar el gráfico de tendencia alcista o bajista

Estoy intentando leer los datos y trazarlos en un gráfico utilizando python (gráfico de líneas estándar). ¿Alguien puede asesorarme sobre cómo puedo clasificar si ciertos puntos de un gráfico son las tendencias al alza oa la baja en forma programática? ¿Cuál sería la forma más óptima de lograr esto? ¿Seguro que este es un problema resuelto y existe una ecuación matemática para identificarlo?

Aquí hay algunos datos de muestra con algunas tendencias y tendencias bajistas.

x = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30] y = [2,5,7,9,10,13,16,18,21,22,21,20,19,18,17,14,10,9,7,5,7,9,10,12,13,15,16,17,22,27] 

gracias por adelantado

Una forma simple sería observar la ‘tasa de cambio de y con respecto a x’, conocida como la derivada. Por lo general, esto funciona mejor con funciones continuas (suaves), por lo que podría implementarlo con sus datos mediante la interpolación de sus datos con un polinomio de orden n como ya se sugirió. Una implementación simple se vería así:

 import numpy as np import matplotlib.pyplot as plt from scipy.interpolate import interp1d from scipy.misc import derivative x = np.array([1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,\ 16,17,18,19,20,21,22,23,24,25,26,27,28,29,30]) y = np.array([2,5,7,9,10,13,16,18,21,22,21,20,19,18,\ 17,14,10,9,7,5,7,9,10,12,13,15,16,17,22,27]) # Simple interpolation of x and yf = interp1d(x, y) x_fake = np.arange(1.1, 30, 0.1) # derivative of y with respect to x df_dx = derivative(f, x_fake, dx=1e-6) # Plot fig = plt.figure() ax1 = fig.add_subplot(211) ax2 = fig.add_subplot(212) ax1.errorbar(x, y, fmt="o", color="blue", label='Input data') ax1.errorbar(x_fake, f(x_fake), label="Interpolated data", lw=2) ax1.set_xlabel("x") ax1.set_ylabel("y") ax2.errorbar(x_fake, df_dx, lw=2) ax2.errorbar(x_fake, np.array([0 for i in x_fake]), ls="--", lw=2) ax2.set_xlabel("x") ax2.set_ylabel("dy/dx") leg = ax1.legend(loc=2, numpoints=1,scatterpoints=1) leg.draw_frame(False) 

Diagrama diferencial de y

Verá que cuando la gráfica pasa de una “tendencia ascendente” (gradiente positivo) a una “tendencia descendente” (gradiente negativo), la derivada (dy / dx) pasa de positiva a negativa. La transición de esto ocurre en dy / dx = 0, que se muestra mediante la línea discontinua verde. Para las rutinas scipy puedes mirar:

http://docs.scipy.org/doc/scipy/reference/generated/scipy.misc.derivative.html

http://docs.scipy.org/doc/scipy/reference/tutorial/interpolate.html

La diferencia / gradiente de NumPy también debería funcionar, y no requerir la interpolación, pero mostré lo anterior para que pueda tener una idea. Para una descripción matemática completa de la diferenciación / cálculo, mire wikipedia.