Análisis Financiero en n8n

Análisis Financiero en n8n
Photo by Fabian Blank / Unsplash

Todo siempre tiene una historia, esta es mi historia con n8n.

Hace un par de meses un amigo me habló de n8n, le dije que lo iba a instalar y que luego le iba a dar credenciales para que lo usara. Nunca lo hice 😅. Es decir, lo instalé pero no le di credenciales jiji.

Luego de ver un montón de opiniones, decidí instalarlo en Freya y comenzar a jugar para ver qué salía. Al inicio no tenía mucha idea de como usarlo pero poco a poco, leyendo su documentación, viendo videos y usando chatGPT/claude/gemini, logré hacer mi primer flujo. En este primer flujo:

  1. Descargo un PDF
  2. Obtengo información del PDF
  3. Proceso la información
  4. La envío a una hoja de spreadsheet

Este flujo ha venido funcionando sin ninguna intervención por más de 2 meses, y, por esto, siento que ya viene siendo momento de hablar sobre n8n por acá.

Para el post de hoy quiero hablar sobre un proceso que venía haciendo con otro amigo, todos los días nos hablamos y nos preguntamos sobre información de mercados, las preguntas normalmente son:

  • ¿Cómo van los mercados hoy?
  • ¿Qué ha pasado?
  • Porqué subió/bajó SP500/Google/Apple/etc

Actualmente tenemos un canal de Telegram donde un bot envía información sobre fiducias en Bancolombia. Teniendo en cuenta todo esto, hace unos días se me ocurrió la idea de seguir aprendiendo n8n, usar IA para generar un informe corto de los mercados 😄.

Antes de continuar, quiero mostrar el resultado del flujo en n8n.

Resultado del flujo de n8n

Paso 1. Obtener información

Primero que todo, es necesario buscar alguna fuente de información. Queremos tener información actualizada día a día de los mercados, exactamente de: Apple, Google y SP500.

Buscando un poco encontré varios servicios que mediante un token y una API, permiten saber sobre el mercado de acciones. Veamos un ejemplo con AlphaVantage.

https://www.alphavantage.co/query?function=GLOBAL_QUOTE&symbol=AAPL&apikey=123

Petición a alphavantage

[
   {
      "Global Quote": {
         "01. symbol": "AAPL",
         "02. open": "253.9000",
         "03. high": "255.4930",
         "04. low": "248.0700",
         "05. price": "248.8000",
         "06. volume": "46625044",
         "07. latest trading day": "2026-03-27",
         "08. previous close": "252.8900",
         "09. change": "-4.0900",
         "10. change percent": "-1.6173%"
      }
   }
]

Ejemplo de respuesta en JSON

Además del precio de la acción, queremos conocer noticias sobre Apple/Google/SP500. Similar a AlphaVantage, también existen APIs que retornan información de noticias. En este caso, usaremos NewsAPI

https://newsapi.org/v2/everything?q=apple%20OR%20%22apple%20inc%22%20OR%20aapl%20OR%20iphone%20OR%20macbook&searchIn=title,description&language=en&sortBy=relevancy&from=2026-03-25&to=2026-03-27&apiKey=123

Petición a NewsAPI

[
   {
      "articles": [
         {
            "author": "Mike Pearl",
            "content": "A new report says some version of the long-awaited new, AI-powered Siri will debut on June 8 at Apples Worldwide Developers Conference (WWDC) at the same time iOS 27 is also scheduled to be shown to … [+2546 chars]",
            "description": "Anonymous sources make one version of new Siri sound like it’s everywhere—kinda like Gemini in Google products.",
            "publishedAt": "2026-03-25T10:30:55Z",
            "source": {
               "id": null,
               "name": "Gizmodo.com"
            },
            "title": "Report: Apple Is Testing Features That Will Put Siri All Over Your iPhone Experience",
            "url": "https://gizmodo.com/report-apple-is-testing-features-that-will-put-siri-all-over-your-iphone-experience-2000737754",
            "urlToImage": "https://gizmodo.com/app/uploads/2026/02/siri-1200x675.jpg"
         }
      ],
      "status": "ok",
      "totalResults": 717
   }
]

Ejemplo de respuesta en JSON

Y listo, ahora ya tenemos la información que necesitamos y con esto completamos el primer paso.

Paso 2. Procesar y armar el Prompt

En este paso, en n8n usaremos un nodo de tipo merge para agrupar la información y un nodo de código para procesar y armar el prompt.

Este sería el resumen del system prompt y del user prompt.

Eres un analista financiero conciso. Generas reportes de mercado en español para Telegram.

REGLAS:
- Usa solo HTML que Telegram soporta: <b>, <i>, <pre>, emojis
- NO uses markdown, asteriscos, ni otros tags
- La tabla va dentro de <pre></pre> alineada con espacios
- Basa el análisis de cada activo en las noticias provistas
- NO incluyas referencias [1] [2] ni ningún número entre corchetes en el texto del análisis
- Los links ya están incluidos al final de cada sección, no necesitas citarlos en el texto
- Si hay pocas o ninguna noticia, basa el análisis en el movimiento del precio
- Sé directo y conciso
- IMPORTANTE: al final del análisis de cada activo incluye exactamente el bloque de links que te doy, sin modificarlo`

Ejemplo de system prompt

Genera un reporte de mercado para Telegram con estos datos reales:

Fecha: ${fecha}
AAPL: $${aapl.price} | cambio: ${aapl.change} (${aapl.changePct}) | tendencia: ${aapl.trend}
GOOGL: $${googl.price} | cambio: ${googl.change} (${googl.changePct}) | tendencia: ${googl.trend}
SPY: $${spy.price} | cambio: ${spy.change} (${spy.changePct}) | tendencia: ${spy.trend}

Noticias Apple:
${aaplNews.text}

Noticias Google:
${googlNews.text}

Noticias S&P 500:
${spyNews.text}

Usa exactamente este formato, respetando los bloques de links al pie de cada sección:

<b>📊 Reporte de Mercado — ${fecha}</b>

<pre>
Activo  Precio      Cambio
AAPL    $${aapl.price}    ${aapl.trend} ${aapl.changePct}
GOOGL   $${googl.price}   ${googl.trend} ${googl.changePct}
SPY     $${spy.price}    ${spy.trend} ${spy.changePct}
</pre>

<b>🍎 Apple (AAPL)</b>
[análisis 2-3 líneas sin referencias numéricas]
${aaplNews.linksHtml}

<b>🔍 Google (GOOGL)</b>
[análisis 2-3 líneas sin referencias numéricas]
${googlNews.linksHtml}

<b>📊 S&P 500 (SPY)</b>
[análisis 2-3 líneas sin referencias numéricas]
${spyNews.linksHtml}

Ejemplo de user prompt

Por último, en el nodo de código, armaríamos el JSON para llamar al API con el LLM

llmBody = {
  model: 'google/gemini-2.5-flash-lite',
  messages: [
    { role: 'system', content: systemPrompt },
    { role: 'user', content: userPrompt }
  ],
  max_tokens: 2000
};

Ejemplo de llamado al LLM

Inicialmente estoy probando gemini-2.5-flash-lite aprovechando que es bastante económico, puedes utilizar cualquier otro 😛.

Paso 3. Envío a Telegram

En mi caso, tengo un canal de Telegram privado y tengo un bot que tiene acceso a ese canal, entonces lo que hacemos en este nodo es simplemente configurar credenciales del bot y enviarlo al canal.

💡
Me parece que la forma más fácil para obtener el id del canal es entrando https://web.telegram.org/.

Paso 4. Probar

Mi workflow final se ve algo similar a esto.

Vista del workflow

Estuve ajustando varias cosas para que funcionara de la forma en que quería, algunas notas/pensamientos:

  • Fue necesario agregar un nodo de tipo wait ya que el API tiene rate limiting
  • Es mejor realizar pruebas de cada nodo de forma manual para ir validando que funciona. Así no gastamos tokens ni llamados a las APIs de forma innecesaria.
  • Es recomendado preguntarle a Claude/ChatGPT/Gemini u otro LLM (las cuentas gratuitas son bastante útiles 😉).

Métricas del LLM

Actualmente uso OpenRouter por comodidad pero fácilmente se podría usar desde Ollama local hasta OpenAI/Claude/Gemini. Por acá muestro un par de ejecuciones y el costo usando diferentes modelos.

Costo de tres llamados
Tokens usados

Dejo el código de n8n en caso que quieras importar el JSON y modificarlo 🙂.

Ejemplo de market agent en n8n
Ejemplo de market agent en n8n. GitHub Gist: instantly share code, notes, and snippets.