| name | alpaca-data |
| description | Market Data API de Alpaca: acciones, crypto, opciones. Historical y real-time data para 5000+ stocks. |
| license | MIT |
Alpaca Data — Market Data API
API de datos de mercado con datos históricos y en tiempo real para acciones, crypto y opciones.
Base URL: https://data.alpaca.markets
SDK: pip install alpaca-py
Docs: docs.alpaca.markets
Autenticación
Obtener API Keys
- Ir a app.alpaca.markets
- Crear cuenta (paper trading es gratis)
- Ir a "API Keys" → Generate New Keys
- Guardar API Key y Secret Key
Configuración
import os
from alpaca.data.historical import StockHistoricalDataClient
API_KEY = os.getenv("APCA_API_KEY_ID")
SECRET_KEY = os.getenv("APCA_API_SECRET_KEY")
client = StockHistoricalDataClient(API_KEY, SECRET_KEY)
from alpaca.data.historical import CryptoHistoricalDataClient
crypto_client = CryptoHistoricalDataClient()
⚠️ NUNCA hardcodear keys en código que se comparte.
Rate Limits
| Plan | Requests/Min | Datos |
|---|
| Free (IEX) | 200 | ~5 años historia, 1 exchange |
| Paid (SIP) | Mayor | Todas las bolsas US, ~7 años |
Recomendaciones
- Cachear datos — los datos históricos no cambian
- Batch requests — pedir múltiples símbolos en una llamada
- Usar
limit=10000 — máximo por request
- Paginar con
next_page_token — para datos grandes
Data Feeds
| Feed | Descripción | Costo |
|---|
iex | Investors Exchange (~2.5% del volumen) | Gratis |
sip | Todas las bolsas US (consolidado) | Paid |
boats | Blue Ocean ATS (horas extendidas) | Paid |
otc | Over-the-counter | Paid |
Free tier = solo IEX
Historical Stock Data
Bars (OHLCV)
from alpaca.data.requests import StockBarsRequest
from alpaca.data.timeframe import TimeFrame
from datetime import datetime
request = StockBarsRequest(
symbol_or_symbols=["AAPL", "GOOGL"],
timeframe=TimeFrame.Day,
start=datetime(2023, 1, 1),
end=datetime(2024, 12, 31),
feed="iex"
)
bars = client.get_stock_bars(request)
df = bars.df
TimeFrames disponibles:
TimeFrame.Minute / TimeFrame(5, TimeFrame.Minute)
TimeFrame.Hour
TimeFrame.Day
TimeFrame.Week
TimeFrame.Month
Quotes (Bid/Ask)
from alpaca.data.requests import StockQuotesRequest
request = StockQuotesRequest(
symbol_or_symbols=["AAPL"],
start=datetime(2024, 1, 1),
end=datetime(2024, 1, 31),
feed="iex"
)
quotes = client.get_stock_quotes(request)
Trades
from alpaca.data.requests import StockTradesRequest
request = StockTradesRequest(
symbol_or_symbols=["AAPL"],
start=datetime(2024, 1, 1),
feed="iex"
)
trades = client.get_stock_trades(request)
Latest Data
bars = client.get_stock_latest_bar(["AAPL", "GOOGL"])
quotes = client.get_stock_latest_quote(["AAPL"])
trades = client.get_stock_latest_trade(["AAPL"])
Snapshots
from alpaca.data.requests import SnapshotRequest
request = SnapshotRequest(
symbol_or_symbols=["AAPL", "GOOGL"]
)
snapshots = client.get_snapshot(request)
Historical Crypto Data
No requiere API keys
from alpaca.data.historical import CryptoHistoricalDataClient
from alpaca.data.requests import CryptoBarsRequest
from alpaca.data.timeframe import TimeFrame
from datetime import datetime
client = CryptoHistoricalDataClient()
request = CryptoBarsRequest(
symbol_or_symbols=["BTC/USD", "ETH/USD"],
timeframe=TimeFrame.Day,
start=datetime(2023, 1, 1),
end=datetime(2024, 12, 31)
)
bars = client.get_crypto_bars(request)
df = bars.df
Crypto Orderbook
from alpaca.data.requests import CryptoLatestQuoteRequest
request = CryptoLatestQuoteRequest(symbol_or_symbols=["BTC/USD"])
quotes = client.get_crypto_latest_quote(request)
Historical Options Data
Option Chains
from alpaca.data.requests import OptionContractsRequest
request = OptionContractsRequest(
underlying_symbols=["AAPL"],
expiration_date_gte="2024-01-01",
expiration_date_lte="2024-12-31",
strike_price_gte=100,
strike_price_lte=200
)
contracts = client.get_option_contracts(request)
Option Bars/Trades/Quotes
from alpaca.data.requests import OptionBarsRequest
contract_id = "6e58f870-fe73-4583-81e4-b9a37892c36f"
request = OptionBarsRequest(
symbol_or_contract_ids=[contract_id],
start=datetime(2024, 1, 1),
end=datetime(2024, 1, 31)
)
bars = client.get_option_bars(request)
Options Tickers Reference
Ver ./references/options_reference.md para:
- Símbolos de opciones (AAPL240119C00100000)
- Parámetros de filtrado
- Trading levels requeridos
News
from alpaca.data.requests import StockNewsRequest
request = StockNewsRequest(
symbol_or_symbols=["AAPL", "GOOGL"],
start=datetime(2024, 1, 1),
end=datetime(2024, 1, 31)
)
news = client.get_stock_news(request)
Screener
from alpaca.data.requests import MostActivesRequest
request = MostActivesRequest(
by="volume",
top=10,
date="2024-01-15"
)
movers = client.get_most_actives(request)
WebSocket Real-Time (Opcional)
from alpaca.data.stream import StockDataStream
ws = StockDataStream(API_KEY, SECRET_KEY)
async def handle_bar(bar):
print(bar)
ws.subscribe_bars(handle_bar, "AAPL", "GOOGL")
ws.run()
Scripts de Descarga
Usá los scripts en ./scripts/:
python ./scripts/download_stock_bars.py --symbols AAPL,GOOGL --days 365 --output data/
python ./scripts/download_crypto_bars.py --symbols BTC,ETH --days 90 --output data/
python ./scripts/download_options.py --symbol AAPL --output data/
Errores Comunes
| Error | Causa | Solución |
|---|
| 403 Forbidden | Keys inválidas o sin permisos | Verificar API keys |
| 429 Too Many Requests | Rate limit | Esperar, usar cache |
| Empty response | Sin datos para el símbolo | Verificar símbolo |
| "options_enabled" | Symbol sin opciones | Usar símbolo con opciones |
Comparación con Otras APIs
| Feature | Alpaca | Alpha Vantage | Data912 |
|---|
| Free tier | ✅ IEX (1 exchange) | ✅ 25/day | ✅ Todo ARS |
| Stocks US | ✅ | ✅ | ❌ |
| Crypto | ✅ | ✅ | ❌ |
| Opciones | ✅ | ❌ | ❌ |
| Historical depth | ~5 años IEX | Limitado | Limitado |
| SDK Python | ✅ alpaca-py | ✅ | ❌ |
Elegí Alpaca para: datos de EE.UU. (stocks, crypto, opciones), datos intraday.
Elegí Data912 para: datos del mercado argentino.
Elegí Alpha Vantage para: indicadores técnicos, forex.