Saltar al contenido
Home » Blog » Como crear un analizador de sentimientos de las noticas para la bolsa

Como crear un analizador de sentimientos de las noticas para la bolsa

    Está claro que las noticias son algo importante para la bolsa, es decir, algo de lo que hay que preocuparse. Una noticia positiva puede hacer que un valor en bolsa se dispare, mientras que una negativa puede hacer que se hunda irremediablemente.

    Tener en cuenta las noticias que se producen en el mundo de la bolsa relacionadas con determinadas acciones puede hacer que nuestro trading mejore enormemente. Por tanto, tenemos que contar con un sistema que detecte cuando una noticia es positiva o negativa, es decir un analizador de sentimientos, y eso es lo que vamos a aprender en esta entrada.

    La librería Vader

    Aunque al principio parece que estamos hablando de Star Wars, nada más lejos de la realidad. Vader viene de “Valence Aware Dictionary and sEntiment Reasoner” y es la librería que usa Python para el análisis de sentimientos.

    Esta librería se basa en reglas y un poderoso lexicón para realizar sus análisis y determinar si una noticia es positiva, negativa y neutra. El resultado que nos devolverá Vader va desde -1 a 1, siendo -1 una noticia muy negativa, 0 una noticia neutra, y 1 una noticia muy positiva.

    En términos de precisión, cuando se han realizado las pruebas Vader ha demostrado incluso ser más preciso que un humano. Esta librería tiene un porcentaje de acierto con la métrica F1 de un 96%, mientras que los evaluadores humanos tienen un 84% al intentar etiquetar una noticia como positiva, negativa o neutra.

    Para trabajar con esta librería hay que realizar el siguiente import:

    from vaderSentiment.vaderSentiment import SentimentIntensityAnalyzer
    # Si es la primera vez deberemos descargarnos el lexicon con las siguientes dos líneas
    # Después se pueden comentar
    import nltk
    nltk.download('vader_lexicon')

    Con esto ya hemos importado las librerías necesarias, y el funcionamiento es muy sencillo. Solo se necesita instanciar la clase “SentimentIntensityAnalyzer” y luego llamar al metodo para que nos devuelva el análisis de la frase que vamos a analizar:

    analyzer = SentimentIntensityAnalyzer()
    analyzer.polarity_scores('Hello World')

    La salida de este comando es algo similar a esto:

    {'neg': 0.0, 'neu': 1.0, 'pos': 0.0, 'compound': 0.0}

    Vemos que la salida es un diccionario con cuatro variables:

    • Negatividad: Siendo 0 cuando no es negativo y 1 cuando es completamente negativo
    • Neutralidad: El cual será 0 cuando no es neutral y 1 cuando es completamente neutral
    • Positividad: Que será 0 cuando no es positivo y 1 cuando es completamente positivo
    • Compuesto: Será -1 cuando el comentario sea completamente negativo, 0 cuando sea completamente neutro y 1 cuando sea totalmente positivo.

    Si cambiamos la frase anterior a algo más positivo podemos observar como cambia la salida para reflejar este cambio:

    >>> analyzer.polarity_scores("Good world!!!")
    {'neg': 0.0, 'neu': 0.209, 'pos': 0.791, 'compound': 0.5826}

    Como vemos la forma de reflejar este cambio a una frase más positiva se realiza bajando el componente de neutralidad (a casi un 20%) y subiendo el de positividad (a un 80%). Si además miramos el valor compuesto vemos que es de un 58% de positividad, dando por hecho que la frase es positiva.

    La librería Textblob

    Otra librería que realiza análisis de sentimientos en python es Textblob. Esta librería no está tan dedicada como la anterior al análisis del sentimiento, sino que se basa más en el procesamiento del lenguaje natural. Aun así, tiene una parte para el análisis de sentimientos, que es donde nosotros le vamos a sacar provecho en este post.

    Al igual que Vader, Textblob utiliza la librería NLTK (Natural Lenguage Toolkit) para conseguir su lexicón, así que al igual que hicimos con Vader tendrémos que descargar el lexicón la primera vez que la utilicemos.

    from textblob import TextBlob

    Una vez que ya tenemos esta librería importada la forma de funcionar es muy sencilla:

    analisis = TextBlob('Hello World')
    analisis.sentiment

    Este código tendrá la siguiente salida:

    Sentiment(polarity=0.0, subjectivity=0.0)

    Como podemos ver la salida de Textblob es diferente a la de Vader, ya que nos devuelve dos valores:

    • Polaridad: Donde -1 es para una frase completamente negativa y 1 para una completamente positiva
    • Subjetividad: Donde es 0 si se trata de una opinión personal y 1 si contiene información fáctica.

    Como vemos Textblob nos da más información que Vader en lo referente a si una frase parece una opinión o no. Con lo que si metemos una frase más positiva el resultado sería así:

    >>> analisis = TextBlob('Good World')
    >>> analisis.sentiment
    Sentiment(polarity=0.7, subjectivity=0.6000000000000001)

    Y si metemos una opinión personal:

    >>> analisis = TextBlob('I think this World sucks!!')
    >>> analisis.sentiment
    Sentiment(polarity=-0.46875, subjectivity=0.3)

    Analizador de sentimientos

    ¿Y cómo podemos utilizar esto para la bolsa? Existen webs que están mostrando continuamente noticias de la bolsa, incluso alguna que tiene una API para que podamos descargarnos las noticias directamente. Aquí vamos a dar una muestra con la web “financial modeling prep” que en cuestión de segundos os permite crear una cuenta con acceso a muchos datos.

    La forma de conexión para descargar los datos de las noticias es la siguiente:

    response = requests.get('https://financialmodelingprep.com/api/v3/stock_news?limit=100&apikey=VUESTRA_API_KEY')
    response = response.json()
    news = pd.DataFrame(response)

    Una vez que ya tenemos las noticias en la variable ‘news’ podeis tener el título para pasárselo al analizador con:

    >>> analyzer.polarity_scores(news['title'])

    Una vez que ya tenemos esto es muy sencillo crear un script que nos vaya mostrando las noticias.

    Dataframe analizador de sentimientos de noticias con el sentimiento ya incluido

    Conclusiones

    Pues esto ha sido todo, como veis es muy sencillo conseguir un analizador de sentimientos para las noticias. A partir de ahora ya es cuestión de echarle imaginación y de donde podéis sacar titulares que os puedan servir para determinar si una acción suba o baje, como Twitter, reddit o similares.

    En una próxima entrada analizaré los principales sitios de noticias sobre los valores de la bolsa, y que tengan una API decente para nuestros fines

    Como siempre cualquier duda o aclaración la podéis dejar en los comentarios.

    ¡No te pierdas ningún post!

    ¡No enviamos spam! Lee nuestra política de privacidad para más información.

    Deja una respuesta

    Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *