Emmatassone / GEN-Bots

1 stars 0 forks source link

Propuesta: Análisis financiero automatizado #8

Open chao5monkey opened 1 year ago

chao5monkey commented 1 year ago

Introducción

Este ticket es una propuesta de feature. La tarea consiste en producir y proveer un análisis financiero que permita determinar la solidez financiera de una o varias empresas en base a información públicamente disponible.

Motivación: Una empresa con finanzas estables puede ser una buena oportunidad de inversión si adicionalmente se encuentra que está sub-valuada acorde a diversas técnicas de valuación. Este issue trata principalmente sobre la parte del análisis para determinar el rendimiento financiero; la valuación puede ser definida en un issue separado. Estos features podrían eventualmente ser parte de uno más grande para la identificación automatizada de oportunidades de inversión.

Detalle del procedimiento

1) El usuario provee un conjunto de tickers de empresas.

2) Para el conjunto de empresas definido por el usuario, se recolecta información públicamente disponible. Para el caso de empresas de EE.UU. es posible obtener los reportes anuales en formato XBRL del sitio de la SEC. Para empresas argentinas será necesario identificar otras fuentes.

3) Para cada empresa, utilizando la información recolectada, calcular una variedad de métricas. Utilizando estas métricas, ejecutar una serie de evaluaciones para identificar aspectos positivos y negativos del funcionamiento de la empresa e.g. ❌ cobertura de intereses <= 1, ✅ patrimonio neto >>> pasivos. Sería ideal que estas evaluaciones sean definidas por alguien con experiencia en análisis financiero y value investing.

4) Generar un informe con las distintas evaluaciones organizadas por categoría (definir formato).

Cómo continuar

Sería ideal llegar a un consenso sobre la validez del procedimiento que se describe arriba, y adicionalmente definir en más detalle los items 2, 3 y 4. Alternativamente, si estamos de acuerdo en la validez del proceso, se puede implementar una versión básica pero extensible , empezando con unos pocos criterios y un reporte simple, y eventualmente extender con métricas adicionales.

Pana-Onnti commented 1 year ago

Creo que la dificultad está en definir el endpoint de los datos de argy, el scraper en si mismo. Podemos empezar por ahí.

Tenes pensado como se puede aplicar un LLM a la solucion?

Emmatassone commented 1 year ago

Muy bueno el aporte! Muy ordenado y fácil de entender.

Comentarios

  1. En principio podrian incorporarse estas herramientas en la carpeta estadísticas_de_mercados.
  2. Cuando uno hace value investing lo usual es agarar un conjunto de acciones del mismo rubro. Ejemplo: Se toman todas las acciones del sector bancario:

JPM - JPMorgan Chase & Co., BAC - Bank of America Corporation, C - Citigroup Inc., WFC - Wells Fargo & Co., GS - The Goldman Sachs Group, Inc., MS - Morgan Stanley.

Luego se analizan cuando comprar o vender en términos de las métricas definidas.

Propuesta

Pasos a efectuar:

Ideas a futuro

chao5monkey commented 1 year ago

Gracias Emma por los detalles.

Ahí mandé un PR nuevo (https://github.com/Emmatassone/GE-Bots/pull/16) para empezar a trabajar un poco sobre esto. La idea en principio es definir una capa intermedia que haga más fácil la comunicación entre el que recolecta los datos (de la fuente que sea) y el que los procesa para generar informes, sin tener que crear clases o cosas complejas. La motivación principal es definir algún estándar que nos permita mover data de un lado a otro en dataframes, registros, dicts o lo que sea, sin tener que andar fijándonos en cosas como "ah pero fulanito llamó a la columna roe y yo la llamé return_on_equity" y que se vuelva todo confuso o tedioso porque hay que andar viendo qué nombre se usó acá o allá para x concepto, y si efectivamente fulanito quiso decir lo que yo creo que quiso decir.

La idea es definir y documentar los nombres de conceptos con los que trabajamos como constantes (e.g. NET_INCOME, RETURN_ON_EQUITY) en un solo lugar. Por ejemplo:

"""
NET_INCOME (np.float64), equivalent to the XBRL US GAAP taxonomy concept us-gaap:NetIncomeLoss, defined as the
"portion of profit or loss for the period, net of income taxes, which is attributable to the parent."
"""
NET_INCOME = 'net_income'

"""
RETURN_ON_EQUITY (np.float64) is net income divided by shareholder's equity. In terms of XBRL US GAAP taxonomy 
elements, it can be defined as the ratio us-gaap:NetIncomeLoss / us-gaap:StockholdersEquity.
"""
RETURN_ON_EQUITY = 'return_on_equity'

"""
STOCKHOLDER_EQUITY (np.float64), equivalent to the XBRL US GAAP taxonomy concept us-gaap:StockholdersEquity, defined
as the "amount of equity (deficit) attributable to parent. Excludes temporary equity and equity attributable  to
noncontrolling interest."
"""
STOCKHOLDER_EQUITY = 'stockholder_equity'

Después estos nombres se pueden usar para crear DataFrames por un lado (del lado del recolector de datos):

data = pd.DataFrame([
    {
        concept.TICKER_SYMBOL: 'XYZ',
        concept.PERIOD_START: np.datetime64('2021-01-01'),
        concept.NET_INCOME: 2000.0,
        concept.STOCKHOLDER_EQUITY: 2000.0,
    },
    {
        concept.TICKER_SYMBOL: 'XYZ',
        concept.PERIOD_START: np.datetime64('2022-01-01'),
        concept.NET_INCOME: 1000.0,
        concept.STOCKHOLDER_EQUITY: 2000.0,
    },
])

y métricas del otro (del lado del que genera los reportes o hace algún tipo de análisis):

def return_on_equity(df: pd.DataFrame) -> pd.Series:
    """
    Computes standard RETURN_ON_EQUITY given a dataframe with standard columns NET_INCOME and STOCKHOLDER_EQUITY.
    The result is returned as a pandas series.
    """
    return df[concept.NET_INCOME] / df[concept.STOCKHOLDER_EQUITY]
data[concept.RETURN_ON_EQUITY] = metrics.return_on_equity(data)

Por supuesto, no es más que una propuesta y está todo abierto a debate.

Saludos.