Cómo realizar análisis de opinión sobre noticias del mercado de valores

Construyendo el modelo

Ahora, vamos a sumergirnos y construir nuestro modelo. Utilizamos las siguientes bibliotecas de Python para construir el modelo:

  • Peticiones
  • Hermosa sopa
  • Modelo

Paso 1: Cree una lista de la URL de la sección de noticias de las compañías componentes

Identificamos las compañías que componen el índice NIFTY Pharma y creamos un diccionario en Python que contiene los nombres de las compañías como claves, mientras que los valores del diccionario comprenden la abreviatura de la compañía respectiva utilizada por el sitio del portal financiero para formar la URL de la sección de noticias. Con este diccionario, creamos una lista de Python de las URL de la sección de noticias para todas las empresas de componentes.

importar csv
tiempo de importación
solicitudes de importación
desde bs4 import BeautifulSoup
from pattern.en import ngrams

Base_url = “http://www.moneycontrol.com”

# Construye un diccionario de compañías y sus nombres abreviados
compañías = {‘cadilahealthcare’: ‘CHC’, ‘piramalenterprises’: ‘PH05’,
‘glenmarkpharma’: ‘GP08’, ‘glaxosmithklinepharmaceuticals’: ‘GSK’,
«sunpharmaceuticalindustries»: «SPI», «lupinlaboratories»: «LL»,
‘cipla’: ‘C’, ‘aurobindopharma’: ‘AP’,
‘drreddyslaboratories’: ‘DRL’, ‘divislaboratories’: ‘DL03’}

# Cree una lista de las URL de la sección de noticias de las compañías respectivas
url_list = [‘http://www.moneycontrol.com/company-article/{}/news/{}#{}’.format(k,v,v) para k, v en companies.iteritems ()]
imprimir url_list

Paso 2: Extraiga los enlaces de artículos relevantes de la página de la sección de noticias de la compañía

Usando la lista de Python de las URL de la sección de noticias, ejecutamos un bucle Python For que hace sonar el portal con cada URL en nuestra lista de Python. Usamos la función request.get de la biblioteca de solicitudes de Python (que es una biblioteca HTTP simple). El módulo de solicitudes le permite enviar solicitudes HTTP / 1.1. Se pueden agregar encabezados, datos de formularios, archivos multiparte y parámetros con simples diccionarios de Python, y también acceder a los datos de respuesta de la misma manera.

El texto del objeto de respuesta se aplica para crear un objeto Beautiful Soup . Beautiful Soup es una biblioteca de Python para extraer datos de archivos HTML y XML. Funciona con un analizador dado para proporcionar formas de navegar, buscar y modificar el árbol de análisis.

El análisis HTML básicamente significa tomar el código HTML y extraer información relevante como el título de la página, párrafos en la página, encabezados, enlaces, texto en negrita, etc.

La página web de la sección de noticias en el sitio del portal financiero contiene 20 artículos de noticias por página. Apuntamos solo a la primera página de la sección de noticias, y nuestro objetivo es extraer los enlaces para todos los artículos de noticias que aparecen en la primera página usando el HTML analizado. Inspeccionamos el HTML y utilizamos el método find_all en el código para buscar una etiqueta que tenga el nombre de la clase CSS como “arial11_summ”. Esto nos permite extraer los 20 enlaces web.

Las fortunas del sector farmacéutico indio intensivo en I + D están impulsadas por las ventas en el mercado estadounidense y por las aprobaciones / rechazos de nuevos medicamentos por parte de la Administración de Alimentos y Medicamentos de EE. UU. Por lo tanto, seleccionaremos solo aquellos artículos de noticias relacionados con la Administración de Drogas y Alimentos de los Estados Unidos (USFDA) y el mercado de los Estados Unidos. Usando palabras clave como “EE. UU.”, “EE. UU.” Y “USFDA” en una declaración If que está anidada en Python For Loop, nos da nuestra lista final de todos los artículos de noticias relevantes.

# Crear una lista vacía que contendrá los artículos de noticias seleccionados
List_of_links = []

# Extraiga los enlaces de artículos de noticias relevantes de la sección de noticias de compañías seleccionadas
para las URL en url_list:
html = request.get (urls)
soup = BeautifulSoup (html.text, ‘html.parser’) # Crear un objeto BeautifulSoup

# Recupere una lista de todos los enlaces y los títulos de los enlaces respectivos
word1, word2, word3 = “US”, “USA”, “USFDA”

sub_links = soup.find_all (‘a’, class _ = ‘arial11_summ’)
para enlaces en sub_links:
sp = BeautifulSoup (str (links), ‘html.parser’) # primero se convierte en una cadena
etiqueta = sp.a
si word1 en la etiqueta [‘title’] o word2 en la etiqueta [‘title’] o word3 en la etiqueta [‘title’]:
category_links = Base_url + etiqueta [“href”]
List_of_links.append (category_links)
tiempo de dormir (3)

# Imprima la lista seleccionada de enlaces de artículos de noticias
#for p en List_of_links: imprimir p

Paso 3: elimine los artículos de noticias duplicados según el título de la noticia

Puede suceder que el portal financiero publique artículos de noticias importantes relacionados con el sector farmacéutico en general en la página web de la sección de noticias de cada compañía farmacéutica. Por lo tanto, se hace necesario eliminar los artículos de noticias duplicados que aparecen en nuestra lista de Python antes de ejecutar nuestro modelo de análisis de sentimientos. Llamamos a la función set en nuestra lista de Python que generamos en el Paso 2 para darnos una lista sin artículos de noticias duplicados.

# Eliminar los artículos de noticias duplicados basados ​​en el título de noticias
unique_links = list (set (List_of_links))
para q en unique_links: imprimir q

# Crear un diccionario de palabras positivas / negativas relacionadas con el sector farmacéutico
lector = csv.reader (abierto (‘dict.csv’, ‘r’))
pharma_dict = dict ((filas [0], filas [1]) para filas en el lector)

# Crear una lista vacía que luego se llenará con enlaces a artículos de noticias y valores de polaridad (pos / neg)
df = []
imprimir df

Paso 4: extraiga el texto principal de los artículos de noticias seleccionados

En este paso ejecutamos un Python For Loop y para cada URL de artículo de noticias, llamamos a request.get () en la URL y luego convertimos el texto del objeto de respuesta en un objeto Beautiful Soup. Finalmente, extraemos el texto principal usando los métodos find y get_text del módulo Beautiful Soup.

# Abra los artículos de noticias elegidos y extraiga el texto principal
para enlaces seleccionados en enlaces únicos:
results_url = selected_links
#print results_url

resultados = solicitudes.get (resultados_url)
results_text = BeautifulSoup (results.text)
extract_text = results_text.find (clase _ = ‘arti_cont’)
final_text = extract_text.get_text ()

Paso 5: preprocese el texto extraído

Utilizaremos la función n-gramas del módulo Patrón para preprocesar nuestro texto extraído. La función ngrams () devuelve una lista de n-gramas (es decir, tuplas de n palabras sucesivas) de la cadena dada. Como estamos construyendo un modelo simple, usamos un valor de uno para el argumento n en la función n-gramas. El módulo Patrón contiene otras funciones útiles para el preprocesamiento, como analizar, tokenizar, etiquetar, etc., que se pueden explorar para realizar un análisis en profundidad.

# Preprocesamiento del texto extraído utilizando la función ngrams del paquete de patrones
final_text1 = ngrams (texto_final, n = 1, puntuación = “.,;:!? () [] {}` ” \ “@ # $ ^ & * + – | = ~ _”, continuo = Falso)
#print final_text1

Paso 6: Calcule la puntuación del análisis de opinión utilizando un enfoque de diccionario simple

Para calcular la polaridad general de un artículo de noticias, utilizamos el método del diccionario. En este enfoque, una lista de palabras positivas / negativas ayuda a determinar la polaridad de un texto dado. Este diccionario se crea utilizando las palabras que son específicas del sector farmacéutico. El código verifica las palabras positivas / negativas del diccionario con el texto procesado del artículo de noticias.

# Comprobando si alguna de las palabras en el texto del artículo de noticias coincide con las palabras en el diccionario Pharma (pos / neg)
new_dict = {}
puntaje positivo, puntaje negativo = 0,0

para x en final_text1:
if pharma_dict.has_key (x [0]):
new_dict [x [0]] = pharma_dict [x [0]]

lista_ positiva = []; lista_negativa = [];
para clave, valor en new_dict.items ():
if value == ‘positive’: positive_list.append (key)
if value == ‘negative’: negative_list.append (key)

# Calcular el puntaje positivo, el puntaje negativo para cada artículo de noticias
puntaje positivo = len (lista positiva); puntuación_negativa = len (lista_negativa);
#print positive_list; imprimir lista_negativa;
#print positive_score; imprimir puntaje negativo;

Paso 7: crear una lista de Python de salida del modelo

El resultado final del modelo se completa en una lista de Python. La lista contiene la URL, el puntaje positivo y el puntaje negativo para cada uno de los artículos de noticias seleccionados en los que realizamos un análisis de opinión.

# Agregar la lista vacía para crear el resultado final del análisis de opinión
var_nos = [resultados_url, puntaje positivo, puntaje negativo]
df.append (var_nos)

# Imprima la lista final del Análisis de sentimientos
para artículo en df:
imprimir (artículo)

Salida final

Paso 8: Grafica las devoluciones de NIFTY vs NIFTY Pharma

A continuación se muestra una gráfica de NIFTY vs NIFTY Pharma para los meses de octubre a noviembre de 2016. En nuestra gráfica de NIFTY Pharma hemos dibujado flechas que destacan algunos de los comunicados de prensa en los que ejecutamos nuestro modelo de análisis de sentimientos. El impacto de la incertidumbre con respecto a los resultados de las elecciones presidenciales de EE. UU. Y las noticias negativas para el sector de Indian Pharma que emanan de los EE. UU. Son claramente visibles en NIFTY Pharma, ya que cayó sustancialmente desde los máximos alcanzados a fines de octubre de 2016. Por lo tanto, nuestro intento de medir la dirección del Índice Pharma usando el modelo de análisis de Sentimiento en lenguaje de programación Python nos está dando resultados precisos (más o menos).

Fuente: https://www.quantinsti.com/blog/…

Es solo otro conjunto de datos para realizar análisis de sentimientos. Es posible que el vocabulario utilizado en las noticias del mercado de valores deba polarizarse con puntajes de opinión manualmente. En general, las listas de palabras de opinión como SentiWordNet, y herramientas como Stanford Sentiment Treebank (Deeply Moving: Deep Learning for Sentiment Analysis) funcionarían de forma inmediata para el problema de clasificación de noticias. Pero no estarán en su mejor momento, pero encontrará mucho espacio para mejoras en términos de mejorar el vocabulario de sentimientos o combinar múltiples técnicas de clasificación (conjuntos).

Por favor, consulte finsents.com. Ofrecemos un portal gratuito y premium, con más de 40 mil acciones analizadas diariamente, así como acceso a datos sin procesar y / o API

Casa

Puede probar CityFALCON para el análisis. Lo uso para el análisis de acciones tecnológicas.
Agrega noticias de todas las fuentes en línea y fuentes financieras de Twitter. Como sabemos, Twitter es la principal fuente de noticias financieras, pero este sitio solo nos proporciona los tweets relevantes con su puntuación. Noticias financieras en tiempo real y tweets para comerciantes e inversores activos