Algoritmo para detectar tendencias

Nucklear

Buenas, estaba intentando diseñar un algoritmo que detecte tendencias dado un array de valores (valores de 10 a -10) pero no tengo muy claro como hacerlo y antes de romperme la cabeza quiero preguntar por si alguien conoce alguna librería o hay alguna forma fácil de hacerlo.

Lo que necesito a grandes rasgos es:

  • Que el algoritmo devuelva si la tendencia de la serie de datos es alcista o bajista (por cada tramo analizado)
  • Que ademas de la tendencia devuelva la incidencia de esta que será un entero en una escala de 0 a 10

Como yo lo tenía pensado era tomando X numero de valores anteriores y haciendo una media movil de ellos compararla con el valor actual, pero no me convence para nada.

¿Alguna idea o ejemplo?

Deoxys

¿No puedes hacer una regresión lineal con la librería matemática que sea y usar eso?

1 respuesta
Nucklear

#2 ¿Pero la regresion lineal no me dará la tendencia global del dataset que yo le pase? Yo lo que necesito es detectar los cambios de tendencia. Igual no lo explique bien en #1

1 respuesta
Deoxys

#3 pues en lugar de pasarle todo el dataset le pasas los últimos X datos, ¿No?

1 respuesta
HeXaN

Seguramente scikit-learn o alguna de esas lo tengan ya implementado.

1 1 respuesta
Nucklear

#4 Si, eso es verdad, que es como lo tenia pensado, pero el problema es que lo necesito en tiempo real. A ver si con un ejemplo lo explico mejor:

[0, 1, 2, 3, 4, 3, 2.5,  1, -1, -4, 0]

Digamos que tenemos esa lista:

  • Los primeros 5 elementos tienen una tendencia alcista, a partir del 6 elemento comienza una bajada con una incidencia suave y luego se incrementa y del penúltimo al ultimo hay un alza fuerte.

  • Hay que tener en cuenta que los valores se van leyendo a medida que avanza el tiempo.

Lo que quería lograr era detectar los cambios cuando la curva cambia de dirección y la nueva fuerza que tiene.

PD: Estoy con python por si alguien conoce librerías.

1 respuesta
HeXaN

#6 Hombre, si es en tiempo real, te vale con comparar con el último, ¿no?

1 respuesta
Deoxys

Entonces imagino que dependerá de la aplicación que le vayas a dar, pero podrías hacer algo como

  • Comparar el nuevo valor para ver si hay un cambio de tendencia
  • Si no, mirar a ver cuánto lleva la tendencia actual
  • Tener varios indicadores para tendencias a corto, medio y largo plazo

A lo mejor hay alguna librería que te haga el trabajo, pero si esas tres cosas te valen...

(Que imagino que si sólo es eso ya lo habrías hecho y que el problema va más allá, pero bueno, por ir soltando cosas)

1 respuesta
Nucklear

#7 #8 Si, asi mas o menos es como lo tengo ahora, hago la media movil de los ultimos tres valores y le doy mas peso al último. Lo de la media lo hago por suavizar un poco la curva y evitar ruidos.

El mayor problema que le veo a esto es que si la variación es de un solo valor en realidad la tendencia no se habría invertido, de ahi que buscase meter la incidencia de la variación.

Por poner un ejemplo, en el siguiente array:

[0, 1, 2, 1.999, 2.1, 2.5, 3]

Al llegar al cuarto valor hay un cambio de tendencia pero la incidencia es minima y la tendencia global sigue siendo a la alza.

Igual me estoy complicando de mas y podría calcular un porcentaje de la incidencia y descartar valores bajos evitando el ruido.

Mi duda viene mas bien a que estoy casi seguro de que hay una forma de hacer esto bien matematicamente hablando y no quería reinventar la rueda, pero no encuentro nada que se parezca a lo que quiero.

1 respuesta
HeXaN

#9 Hombre, siempre puedes calcular un rango de variación para el cual tú crees que la tendencia no cambia. Supongo que algo por ahí habrá hecho, pero no creo que tardes demasiado en programarlo.

Edit: quizá puedas hacer algo con el interpolate de scipy o quizá algo así:

 x = [12, 34, 29, 38, 34, 51, 29, 34, 47, 34, 55, 94, 68, 81]
trend = [b - a for a, b in zip(x[::1], x[1::1])]
trend
[22, -5, 9, -4, 17, -22, 5, 13, -13, 21, 39, -26, 13]

Donde cada índice represente el cambio de un índice a otro y luego ya juegas con eso como quieras.

2 respuestas
Nucklear

#10 Pues no es mala esa opción, voy a adaptarla a lo que necesito y a ver si me sirve para lo que quiero. Muchas gracias

Deoxys

#10 el ::1 te lo puedes comer en los índices, que no pasa nada :P

Soltrac

Por que no usas los millones de algoritmos que se usan para la bolsa?

1 respuesta
HeXaN

#13 Quizá porque los desconozca, llámame loco.

1 respuesta
Soltrac

#14 dudo q los desconozca.... El conoce bitcointalk y en el apartado de desarrollo hay siempre proyectos open-source de bots de trading e implementan los algoritmos para detectar cuando comprar y cuando vender.

1 respuesta
Nucklear

#15 Eso es justo lo que busco, pero no lo encuentro. ¿Tu has visto alguno? Estoy usando pyalgotrade para backtesting y no trae nada implementado.

1 respuesta
HeXaN

#16 ¿Algo de esto te serviría?

1 respuesta
Nucklear

#17 Creo que podria usar esto que es basicamente lo que tu decias pero pasado a porcentaje:

stratData['cc'] = 100*ohlc['close'].pct_change() # close-to-close change in %

Y bueno decir que no sería la diferencia de precios de cierre sino de un indicador pero bueno

1 respuesta
HeXaN

#18 Pues ya contarás a ver qué tal.

Soltrac

Por ejemplo.....

https://github.com/Galts-Gulch/avarice?files=1

Tienes el ema, el. Macd y alguno q otro más implementado

1 respuesta
Nucklear

#20 Si, eso ya lo hace pyalgotrade, pero yo lo que necesito es por ejemplo detectar estos cambios de tendencia en el histograma de la MACD.

1 respuesta
HeXaN

#21 Esos cambios, con lo que te he propuesto antes, creo que no tendrías problemas en sacarlos.

7 días después
Phatality

Análisis de series temporales bro. Tienes la librería sklearn como dice el compa en #5 y toda la suite de R.

Usuarios habituales

  • Phatality
  • HeXaN
  • Nucklear
  • Soltrac
  • Deoxys