Smart Finance #1: cómo meto la bolsa en tiempo real dentro de Home Assistant (con Yahoo Finance)

⚠️ Aviso importante antes de continuar Este artículo tiene una finalidad exclusivamente informativa y técnica, basada en mi configuración personal de Home Assistant. No soy asesor financiero y los tickers, precios objetivo y automatizaciones que enseño aquí son ejemplos de mi propio seguimiento, no recomendaciones de compra o venta de ningún activo. La integración de Yahoo Finance usa endpoints no oficiales que pueden cambiar sin aviso, así que antes de replicar nada revisa la documentación oficial de Home Assistant, HACS y del repositorio de la integración.

Llevo un tiempo queriendo escribir esto. En mi artículo "Sobre mí" mencioné de pasada que tengo un ticker de bolsa integrado en Home Assistant, y desde entonces me habéis preguntado varias veces cómo lo tengo montado. Pues toca: hoy estreno oficialmente una sección nueva en el blog, Smart Finance.

La idea es sencilla. En FuegoFinanciero hablo de indexados, fiscalidad, brokers... pero hay otra parte de mí que disfruta tanto o más: la domótica, el hardware DIY y tener el control de mis propios datos sin depender de la app de turno. Smart Finance es donde esas dos cosas se juntan.

En los próximos artículos de esta categoría iré enseñando cosas como un dashboard de patrimonio que corre en mi propio servidor, y el que más ganas tengo de escribir: el ticker físico con ESP32 que ya he mencionado un par de veces. Pero hay que empezar por la base, así que hoy toca lo más aburrido-pero-necesario: cómo conecto el mercado financiero global con mi servidor de Home Assistant.

🏠 El punto de partida: Home Assistant + HACS

Doy por hecho que si estás leyendo esto ya tienes Home Assistant funcionando en casa, con HACS (Home Assistant Community Store) instalado. Si no es tu caso, hay guías de sobra para desplegarlo en una Raspberry Pi o un Mini PC en cuestión de minutos.

La pieza que hace posible todo lo que viene ahora es la integración comunitaria Yahoo Finance para Home Assistant, desarrollada por iprak.


💸 ¿Por qué esta integración y no una API "de pago"?

Cuando busqué alternativas, APIs como AlphaVantage o TwelveData me imponían límites muy bajos en su capa gratuita (25-50 peticiones al día) o directamente pedían suscripción mensual. La integración de iprak tira de los endpoints públicos de Yahoo Finance y me da:

  • Cotizaciones de casi cualquier activo: acciones individuales (USA, Europa...), ETFs indexados (S&P 500, MSCI World, emergentes), fondos con ticker, criptos, divisas y materias primas.
  • Métricas que uso de verdad: precio en tiempo real, dividendos, rango de 52 semanas, variación diaria (absoluta y en %), volumen y conversión de divisa.
  • Control manual del refresco: puedo desactivar el sondeo automático y controlarlo yo mismo con automatizaciones, algo clave para no acabar con bloqueos temporales por saturar la API.

⚙️ Cómo la instalé (dos minutos, en serio)

Abro el panel de Home Assistant.

Entro en HACS > Integraciones.

Pulso Explorar y descargar repositorios.

Escribo Yahoo Finance.

Selecciono iprak/yahoofinance y le doy a Descargar.

Voy a Herramientas para desarrolladores > Reiniciar Home Assistant.


📄 Mi configuration.yaml real

Esta integración no tiene flujo de configuración por interfaz gráfica: todo se define en configuration.yaml, símbolos incluidos. Es lo que hay, pero tampoco me importa, así tengo control total sobre los parámetros avanzados. Esta es mi configuración real, con mi lista de seguimiento completa: acciones individuales que sigo de cerca y algunos ETFs UCITS.

configuration.yaml
yahoofinance:
  include_post_values: false
  include_pre_values: false
  include_dividend_values: true         # Extrae datos y rentabilidad por dividendo
  include_fifty_two_week_values: true   # Extrae máximos y mínimos de 52 semanas
  show_trending_icon: true              # Iconos automáticos de subida/bajada
  decimal_places: 2
  scan_interval: manual                 # ¡Clave! Desactiva el sondeo automático fijo
  symbols:
    # Acciones individuales (Dividend Aristocrats, Tech, Value)
    - HRL
    - TSLA
    - BABA
    - PFE
    - INTC
    - CSCO
    - GOOGL
    - QCOM
    - LMT
    - MSFT
    - BMY
    - GD
    - LEVI
    - NKE
    - NTR
    - PYPL
    - GIS
    - KMB
    - NVO
    - ORCL
    - ADBE
    - UNH
    - MDT
    - AMZN
    - BRK-B
    - CVS
    - TROW
    - ACN
    - ABT
    - MRK
    # ETFs UCITS / Índices en Europa
    - SPY5.DE
    - WEBN.DE
    - XNAS.DE

💡 ¿Por qué scan_interval: manual?

Si tienes más de 30 tickers y Home Assistant consulta a Yahoo cada 30 segundos las 24 horas del día — incluso de madrugada o en fin de semana — acabas con bloqueos temporales por rate limit. Poniendo el escaneo en manual, soy yo quien decide cuándo refrescar, con la automatización que ves justo debajo.


🤖 Automatizaciones que tengo montadas de verdad

Aquí es donde Home Assistant le da mil vueltas a cualquier app de bolsa del móvil.

Refresco inteligente según si el mercado está abierto

En vez de refrescar a ciegas, tengo una automatización que detecta si el mercado europeo o el estadounidense está abierto. Con mercado abierto refresca cada 5 minutos; en pre/post-market cada 15; y de madrugada hace un par de llamadas de control y deja descansar el servicio el resto del tiempo.

Para el tramo europeo me basta con comprobar la hora local, pero para saber si Wall Street está abierta necesito algo más fino — ahí es donde entra en juego un sensor que no viene de fábrica: binary_sensor.bolsa_usa_abierta.

Cada sensor de la integración trae un atributo llamado marketState, con valores como PRE, REGULAR, POST o CLOSED según en qué fase esté la sesión de Wall Street en cada momento. En vez de repetir esa comprobación dentro de cada automatización, la envolví una sola vez en un sensor de plantilla (binary_sensor tipo template) que se apoya en MSFT, uno de los valores que ya tengo en seguimiento, como referencia del estado del mercado:

configuration.yaml (sensor auxiliar)
template:
  - binary_sensor:
      - name: "Bolsa USA Abierta"
        unique_id: bolsa_usa_abierta
        state: >-
          {{ state_attr('sensor.yahoofinance_msft', 'marketState') == 'REGULAR' }}

Con esto tengo un simple on/off que puedo reutilizar en cualquier automatización — incluida la de más abajo — sin repetir la plantilla cada vez. Si sigues otro símbolo distinto a MSFT, cambia el entity_id por el tuyo; cualquier acción de bolsa americana que tengas en symbols te vale igual de bien, ya que el marketState es el mismo para toda la sesión de Wall Street.

refresco-inteligente-mercado.yaml
alias: 'Finanzas: Refresco Inteligente de Mercado (EU + USA) V2'
description: >-
  Resuelve el problema del "huevo y la gallina" con el marketState. Actualiza
  cada 5 min en mercado abierto (Europa o cuando MSFT confirme REGULAR). Asegura
  llamadas en pre/post market y detecta los cambios DST.
triggers:
  - trigger: time_pattern
    minutes: /5
    id: cinco_minutos
  - trigger: time_pattern
    minutes: /15
    id: quince_minutos
  - trigger: time
    at:
      - '03:00:00'
      - '04:00:00'
    id: cierre_total
conditions:
  - condition: time
    weekday:
      - mon
      - tue
      - wed
      - thu
      - fri
actions:
  - choose:
      # Tramo 1: Mercado en vivo -> Cada 5 minutos
      - conditions:
          - condition: trigger
            id: cinco_minutos
          - condition: or
            conditions:
              - condition: time
                after: '08:59:00'
                before: '17:31:00'
              - condition: state
                entity_id: binary_sensor.bolsa_usa_abierta
                state: 'on'
        sequence:
          - action: yahoofinance.refresh_symbols
            data: {}

      # Tramo 2: Pre-market / After-hours -> Cada 15 minutos
      - conditions:
          - condition: trigger
            id: quince_minutos
          - condition: not
            conditions:
              - condition: or
                conditions:
                  - condition: time
                    after: '08:59:00'
                    before: '17:31:00'
                  - condition: state
                    entity_id: binary_sensor.bolsa_usa_abierta
                    state: 'on'
          - condition: or
            conditions:
              - condition: time
                after: '08:00:00'
                before: '09:00:00'
              - condition: time
                after: '13:30:00'
                before: '16:00:00'
              - condition: time
                after: '22:00:00'
                before: '02:30:00'
        sequence:
          - action: yahoofinance.refresh_symbols
            data: {}

      # Tramo 3: Cierres nocturnos
      - conditions:
          - condition: trigger
            id: cierre_total
        sequence:
          - action: yahoofinance.refresh_symbols
            data: {}
mode: restart
Radar de acciones: aviso cuando una acción toca mi precio objetivo

Tengo una lista de unas 30 empresas que sigo de cerca. Para cada una fijo, mediante un input_number, el precio al que estaría dispuesto a comprar, y me olvido completamente de mirar la cotización a diario. Cuando el precio cae hasta esa zona, Home Assistant me manda una notificación al móvil con el margen de descuento respecto a mi objetivo

radar-acciones-objetivo.yaml
alias: '🎯 Radar Acciones: Objetivo Alcanzado'
description: >-
  Notifica si una acción individual toca el precio objetivo fijado en los
  ayudantes para comprar en HeyTrade
# Trigger de tipo "template": se reevalúa cada vez que cambia cualquier sensor de Yahoo Finance
triggers:
  - value_template: >-
      {% set acciones = ['hrl', 'tsla', 'baba', 'pfe', 'intc', 'csco', 'googl',
      'qcom', 'lmt', 'msft', 'bmy', 'gd', 'levi', 'nke', 'ntr', 'pypl', 'gis',
      'kmb', 'nvo', 'orcl', 'adbe', 'unh', 'mdt', 'mrk', 'abt', 'acn', 'trow',
      'cvs', 'amzn', 'brkb'] %}
      {# Lista de tickers que sigo en mi Radar — debe coincidir con tus input_number.target_* #}
      {% set ns = namespace(triggered=false) %}
      {% for ticker in acciones %}
        {# Comparo el precio actual de Yahoo Finance con el objetivo que fijé a mano en un input_number #}
        {% set precio = state_attr('sensor.yahoofinance_' ~ ticker, 'regularMarketPrice') | float(0) %}
        {% set objetivo = states('input_number.target_' ~ ticker) | float(0) %}
        {% if objetivo > 0 and precio > 0 and precio <= objetivo %}
          {% set ns.triggered = true %}
        {% endif %}
      {% endfor %}
      {{ ns.triggered }}
    trigger: template
actions:
  - variables:
      ticker_id: >-
        {% set acciones = ['hrl', 'tsla', 'baba', 'pfe', 'intc', 'csco',
        'googl', 'qcom', 'lmt', 'msft', 'bmy', 'gd', 'levi', 'nke', 'ntr',
        'pypl', 'gis', 'kmb', 'nvo', 'orcl', 'adbe', 'unh', 'mdt', 'mrk', 'abt',
        'acn', 'trow', 'cvs', 'amzn', 'brkb'] %}
        {# Repito la misma lista para localizar exactamente qué ticker disparó la alerta #}
        {% set ns = namespace(ticker='') %}
        {% for ticker in acciones %}
          {% set precio = state_attr('sensor.yahoofinance_' ~ ticker, 'regularMarketPrice') | float(0) %}
          {% set objetivo = states('input_number.target_' ~ ticker) | float(0) %}
          {% if objetivo > 0 and precio > 0 and precio <= objetivo and ns.ticker == '' %}
            {% set ns.ticker = ticker %}
          {% endif %}
        {% endfor %}
        {{ ns.ticker }}
      # El friendly_name trae "Yahoo Finance " delante por defecto, se lo quito para que quede más limpio en la notificación
      nombre: >-
        {{ state_attr('sensor.yahoofinance_' ~ ticker_id, 'friendly_name') |
        replace('Yahoo Finance ', '') }}
      precio_actual: >-
        {{ state_attr('sensor.yahoofinance_' ~ ticker_id, 'regularMarketPrice') | float(0) }}
      precio_objetivo: '{{ states(''input_number.target_'' ~ ticker_id) | float(0) }}'
      porcentaje_bajo_objetivo: >-
        {{ (((precio_objetivo - precio_actual) / precio_objetivo) * 100) | round(2) }}
  - data:
      title: '🎯 Objetivo Alcanzado: {{ ticker_id | upper }}'
      message: >-
        La acción {{ nombre }} ha entrado en tu zona de precio.

        💰 Precio Actual: {{ precio_actual }} $
        🎯 Tu Objetivo: {{ precio_objetivo }} $
        📉 Margen: {{ porcentaje_bajo_objetivo }}% por debajo del objetivo.

        ¿Operamos en HeyTrade?
      # Estos campos solo personalizan el aspecto de la notificación en Android, son opcionales
      data:
        color: '#2ecc71'
        notification_icon: mdi:target-variant
        ttl: 0
        priority: high
        channel: Radar_Acciones
    # Cambia esto por tu propio notify.mobile_app_<tu_dispositivo> (lo ves en Ajustes > Dispositivos y servicios > Notificaciones)
    action: notify.mobile_app_tu_movil
# parallel + max 10 permite que salten varias alertas a la vez si varios tickers tocan objetivo el mismo día
mode: parallel
max: 10

Sí, el mensaje me pregunta literalmente si opero en HeyTrade — es mi broker principal para bolsa americana, y ya conté en su día por qué lo elegí. Nada me impide comprar, la decisión sigue siendo mía; la automatización solo me evita estar mirando cotizaciones todo el día.


🌐 Ideas más locas que se me ocurren (para otro día)

Todo lo de arriba es lo que tengo montado y probado. Pero en cuanto tienes datos de bolsa en tiempo real dentro de Home Assistant, mezclados con todo lo demás que ya controlas en casa, empiezan a ocurrírsete cosas que no tienen nada que ver con mirar un número en una app. Ninguna de estas la tengo montada todavía, pero técnicamente son perfectamente factibles con lo que ya he contado en este artículo:

  • Un "semáforo" físico del mercado en el despacho. Una tira LED que va virando de verde a rojo según cómo va mi cartera en el día, para saber de un vistazo si toca cara seria en las videollamadas sin mirar el móvil.
  • Notificación con retraso a propósito, no instantánea. Después del palo de Viacom, sé que la primera reacción a una caída fuerte suele ser la peor. Se me ocurre una automatización que, si una acción se desploma de golpe, no me avise en el momento sino dos horas después — tiempo de sobra para que se me pase el impulso de vender por pánico.
  • Un "modo aniversario" para no repetir errores. Una automatización que cada año, en la fecha en la que compré Viacom, me mande una notificación con el mensaje "hoy hace X años cometiste esta cagada, no la repitas" — una especie de recordatorio automático de mis propios sesgos, sin depender de que me acuerde yo solo.

 🚀 Y esto es solo el principio

Las posibilidades no terminan aquí. Algunas cosas que tengo en la cabeza para próximos artículos de Smart Finance:

  • Patrimonio en tiempo real y 100% privado: un sensor que multiplica mis títulos por el precio en vivo, sin meter mis claves bancarias en ninguna app de terceros. Algo parecido a lo que ya cuento en mi cartera real, pero actualizado al segundo.
  • Dashboards con Mini-Graph-Card: paneles limpios en Lovelace para seguir mis ETFs favoritos de un vistazo.

La gracia de meter tus finanzas en Home Assistant es que dejan de ser una app estática en el móvil y se convierten en un sistema vivo, conectado con todo lo demás que ya tienes automatizado en casa.


 🔌  Próximamente en Smart Finance: el ticker físico con ESP32

Para cerrar este primer artículo, un adelanto de lo que viene: en el siguiente de la serie doy el salto al hardware y enseño cómo monté un monitor físico de escritorio con un ESP32 y pantalla a color de apenas unos euros. Se conecta por Wi-Fi a este mismo Home Assistant vía ESPHome y muestra mis cotizaciones favoritas sin tener que tocar el móvil.

¿Ya tienes Home Assistant metido en algo de tus finanzas o te parece una locura innecesaria? Cuéntame en los comentarios qué activos sigues tú o qué automatización te gustaría montar, igual sale el próximo artículo de ahí.


⚠️ Aviso legal Este artículo tiene una finalidad exclusivamente informativa y técnica, basada en mi configuración personal. No constituye asesoramiento financiero ni recomendación de inversión: los tickers y precios objetivo mostrados son ejemplos de mi propio seguimiento, no una lista de valores a comprar. La integración de Yahoo Finance para Home Assistant es un proyecto de la comunidad que usa endpoints no oficiales, por lo que su funcionamiento puede cambiar sin previo aviso. Antes de replicar cualquier automatización, revisa la documentación oficial de Home Assistant, HACS y del repositorio del proyecto, y adapta el código a tu propia instalación — no me hago responsable de errores de configuración en tu sistema.

🔥 ¿Cómo tengo montada mi cartera ahora mismo?

Lo cuento en el boletín, sin filtros: qué tengo, cuánto, y por qué. Sin humo, sin afiliados ocultos.

Deja un comentario

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