0Pricing
AI Agents · Lección

Integración de API de datos de mercado

Alpha Vantage, Yahoo Finance y Polygon.io para datos en tiempo real e históricos.

Integración de API de datos de mercado es una lección gratuita de AI Agents en CoddyKit. Esta es la lección 1 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de AI Agents, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de AI Agents incluye 4 lecciones en total.

Datos de mercado en agentes financieros

Los agentes de análisis financiero necesitan acceder a datos de mercado en tiempo real e históricos. Entre los tipos de datos habituales se incluyen OHLCV (Open/High/Low/Close/Volume), fechas de publicación de resultados, ratios fundamentales y cadenas de opciones.

Varias API proporcionan estos datos: yfinance (gratuita, Yahoo Finance), Polygon.io (de pago y fiable) y Alpha Vantage (con un nivel gratuito disponible).

yfinance: datos históricos de precios

yfinance encapsula la API de Yahoo Finance y es la forma más rápida de empezar. Ticker.history() devuelve un DataFrame de pandas con datos OHLCV.

import yfinance as yf

ticker = yf.Ticker('AAPL')

# 1 year of daily data
history = ticker.history(period='1y')
print(history.tail(3))
#                  Open        High         Low       Close    Volume
# Date
# 2026-05-27  189.1500  190.3200  188.9200  190.0500  55234000
# 2026-05-28  190.4200  191.5600  189.7800  191.1200  62345000
print(f'Rows: {len(history)}')

yfinance: rangos de fechas personalizados

Utilice los parámetros start y end para establecer rangos de fechas personalizados, o interval para obtener datos intradía (1m, 5m, 1h). Tenga en cuenta que los datos intradía están limitados a los últimos 60 días, según el intervalo.

import yfinance as yf

ticker = yf.Ticker('MSFT')

# Custom date range
history = ticker.history(start='2024-01-01', end='2024-12-31')
print(f'Trading days in 2024: {len(history)}')

# Batch multiple tickers
tickers = yf.download(['AAPL', 'MSFT', 'GOOGL'],
                       start='2025-01-01', end='2025-12-31')
print(tickers['Close'].head())

API REST de Polygon.io

Polygon.io proporciona datos de mercado de nivel profesional, con límites de solicitudes más altos y una disponibilidad más fiable que las fuentes gratuitas. Utilícela en agentes financieros destinados a producción.

import requests

POLYGON_KEY = 'YOUR_POLYGON_API_KEY'

def get_polygon_daily(ticker: str, from_date: str, to_date: str) -> list[dict]:
    url = f'https://api.polygon.io/v2/aggs/ticker/{ticker}/range/1/day/{from_date}/{to_date}'
    resp = requests.get(url, params={'apiKey': POLYGON_KEY, 'limit': 365})
    resp.raise_for_status()
    data = resp.json()
    return data.get('results', [])

bars = get_polygon_daily('AAPL', '2025-01-01', '2025-12-31')
print(f'Bars returned: {len(bars)}')
if bars:
    print('Latest close:', bars[-1]['c'])

TIME_SERIES_DAILY de Alpha Vantage

Alpha Vantage ofrece un nivel gratuito (25 llamadas al día) y otro de pago. El endpoint TIME_SERIES_DAILY devuelve datos OHLCV con precios ajustados opcionales.

import requests

ALPHA_KEY = 'YOUR_ALPHA_VANTAGE_KEY'

def get_alpha_vantage_daily(symbol: str, outputsize: str = 'compact') -> dict:
    # outputsize: 'compact' (100 days) or 'full' (20+ years)
    resp = requests.get('https://www.alphavantage.co/query', params={
        'function':   'TIME_SERIES_DAILY_ADJUSTED',
        'symbol':     symbol,
        'outputsize': outputsize,
        'apikey':     ALPHA_KEY
    })
    resp.raise_for_status()
    data = resp.json()
    series = data.get('Time Series (Daily)', {})
    return series   # dict: {date_str: {open, high, low, close, volume, ...}}

Límites de solicitudes y lógica de reintento

Todas las API de datos de mercado aplican límites de solicitudes. Si los supera, recibirá el error 429 (Too Many Requests). Implemente siempre un retroceso exponencial y respete los límites.

import time, requests
from requests.adapters import HTTPAdapter
from urllib3.util.retry import Retry

def make_rate_limited_session(calls_per_minute: int = 5) -> requests.Session:
    session = requests.Session()
    retry = Retry(
        total=3,
        backoff_factor=2,         # 1s, 2s, 4s waits
        status_forcelist=[429, 500, 502, 503, 504]
    )
    adapter = HTTPAdapter(max_retries=retry)
    session.mount('https://', adapter)
    session._calls_per_min = calls_per_minute
    session._min_interval  = 60.0 / calls_per_minute
    session._last_call     = 0.0
    return session

def rate_limited_get(session, url, **kwargs):
    elapsed = time.time() - session._last_call
    if elapsed < session._min_interval:
        time.sleep(session._min_interval - elapsed)
    session._last_call = time.time()
    return session.get(url, **kwargs)

Almacenamiento en caché de datos de mercado

Los datos históricos son inmutables: el precio de cierre de ayer nunca cambia. Almacénelos en caché para evitar llamadas redundantes a la API. Utilice una caché sencilla en disco, indexada por (ticker, date_range).

import hashlib, json, os

CACHE_DIR = '/tmp/market_cache'
os.makedirs(CACHE_DIR, exist_ok=True)

def cache_key(ticker: str, start: str, end: str) -> str:
    return hashlib.md5(f'{ticker}_{start}_{end}'.encode()).hexdigest()

def get_cached(ticker: str, start: str, end: str):
    key = cache_key(ticker, start, end)
    path = os.path.join(CACHE_DIR, f'{key}.json')
    if os.path.exists(path):
        with open(path) as f:
            return json.load(f)
    return None

def set_cached(ticker: str, start: str, end: str, data):
    key = cache_key(ticker, start, end)
    path = os.path.join(CACHE_DIR, f'{key}.json')
    with open(path, 'w') as f:
        json.dump(data, f)

if __name__ == '__main__':
    set_cached('AAPL', '2024-01-01', '2024-01-31', {'close': [150, 151, 149]})
    cached = get_cached('AAPL', '2024-01-01', '2024-01-31')
    print('Cached data for AAPL:', cached)
    print('Cache miss for MSFT:', get_cached('MSFT', '2024-01-01', '2024-01-31'))

Gestión del horario de negociación y las brechas de mercado

Los mercados cierran los fines de semana y los días festivos. Los rangos de fechas que abarcan días sin negociación presentan brechas en los datos. Detecte y gestione siempre estas brechas, en lugar de asumir que los datos diarios son continuos.

import pandas as pd
from pandas.tseries.offsets import BDay

def detect_gaps(history: pd.DataFrame) -> list[str]:
    if history.empty:
        return []
    date_range = pd.date_range(
        start=history.index.min(),
        end=history.index.max(),
        freq=BDay()  # Business days only
    )
    missing = date_range.difference(history.index)
    return [str(d.date()) for d in missing]

import yfinance as yf
history = yf.Ticker('AAPL').history(start='2024-12-23', end='2025-01-07')
gaps = detect_gaps(history)
print('Missing business days (holidays):', gaps)

Creación de una herramienta de datos de mercado para agentes

Registre un recuperador de datos de mercado como herramienta del agente. El LLM puede llamarlo para recuperar datos y, después, utilizar otra herramienta (de análisis) para procesar el resultado.

import yfinance as yf, json

def get_market_data_tool(ticker: str, period: str = '1y') -> str:
    cached = get_cached(ticker, period, 'yfinance')
    if cached:
        return json.dumps(cached)
    try:
        hist = yf.Ticker(ticker).history(period=period)
        if hist.empty:
            return json.dumps({'error': f'No data for {ticker}'})
        result = {
            'ticker':     ticker,
            'period':     period,
            'start':      str(hist.index.min().date()),
            'end':        str(hist.index.max().date()),
            'latest_close': float(hist['Close'].iloc[-1]),
            'pct_change_ytd': float((hist['Close'].iloc[-1] / hist['Close'].iloc[0] - 1) * 100),
            'rows':       len(hist)
        }
        set_cached(ticker, period, 'yfinance', result)
        return json.dumps(result)
    except Exception as e:
        return json.dumps({'error': str(e)})

Datos fundamentales de yfinance

Además de datos de precios, yfinance proporciona datos fundamentales: ratio P/E, beneficios por acción, capitalización bursátil y mucho más. Los datos fundamentales enriquecen el análisis de un agente más allá de la mera evolución de los precios.

import yfinance as yf

ticker = yf.Ticker('AAPL')
info  = ticker.info

print('Market Cap:      ', info.get('marketCap'))
print('P/E Ratio:       ', info.get('trailingPE'))
print('EPS:             ', info.get('trailingEps'))
print('52-Week High:    ', info.get('fiftyTwoWeekHigh'))
print('52-Week Low:     ', info.get('fiftyTwoWeekLow'))
print('Dividend Yield:  ', info.get('dividendYield'))
print('Analyst Target:  ', info.get('targetMeanPrice'))

Gestión de errores: tickers excluidos de cotización e inválidos

No todos los símbolos ticker son válidos ni cotizan actualmente. Una empresa excluida de cotización devuelve un historial vacío. Valide siempre la respuesta antes de continuar con el análisis.

import yfinance as yf

def safe_fetch(ticker_symbol: str, period: str = '1y') -> dict:
    try:
        ticker = yf.Ticker(ticker_symbol)
        history = ticker.history(period=period)

        if history.empty:
            return {
                'error': f'No data for {ticker_symbol}. May be delisted or invalid.',
                'ticker': ticker_symbol
            }
        return {
            'ticker':       ticker_symbol,
            'latest_close': float(history['Close'].iloc[-1]),
            'data_start':   str(history.index.min().date()),
            'bars':         len(history)
        }
    except Exception as e:
        return {'error': str(e), 'ticker': ticker_symbol}

print(safe_fetch('AAPL'))    # valid
print(safe_fetch('INVALID')) # returns error dict

¿Qué devuelve el valor «compact» de outputsize en el endpoint TIME_SERIES_DAILY de Alpha Vantage?

Comprender los parámetros de tamaño de salida de las API es importante para gestionar el ancho de banda, la latencia y las cuotas de API en los agentes financieros.

Resumen de la integración de API de datos de mercado

Utilice yfinance para crear prototipos rápidamente (es gratuita), Polygon.io para producción (es fiable y de pago) y Alpha Vantage como opción con nivel gratuito. Implemente siempre limitación de solicitudes, almacenamiento en caché en disco para los datos históricos y detección de brechas en los días sin negociación.

Exponga la recuperación como una herramienta del agente para que el LLM pueda solicitar datos cuando los necesite.

Preguntas frecuentes

¿La lección «Integración de API de datos de mercado» es gratis?

Sí — el texto completo de «Integración de API de datos de mercado» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de AI Agents, actualiza a CoddyKit PRO. El curso de AI Agents incluye 4 lecciones en total.

¿Qué aprenderé en «Integración de API de datos de mercado»?

Alpha Vantage, Yahoo Finance y Polygon.io para datos en tiempo real e históricos. Practicas AI Agents con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.

¿Necesito experiencia previa para empezar AI Agents?

No se requiere experiencia previa. AI Agents en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 1 de 4.

¿Cuánto tiempo toma la lección «Integración de API de datos de mercado»?

La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.

¿Puedo escribir y ejecutar código en esta lección de AI Agents?

Sí. Cada lección de AI Agents incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.

Todas las lecciones de este curso

  1. Integración de API de datos de mercado
  2. Herramientas de agentes para analizar carteras
  3. Controles de riesgo y cumplimiento normativo
  4. Backtesting de decisiones de agentes
← Volver a AI Agents