
La mayoría de los traders cree que el cuello de botella es la estrategia.
No lo es.
El cuello de botella es el tiempo entre "tengo una idea" y "esto está corriendo en producción". Escribir código repetitivo, conectar APIs, depurar errores de vectorbt a las 2 de la madrugada. Ahí es donde mueren la mayoría de las estrategias.
Si estás:
esto te importa.
Claude Code no es el chatbot. Es un entorno agéntico que corre en tu terminal, lee tus archivos, y ejecuta código en tu máquina. Para el trading algorítmico, eso cambia lo que es posible.
El verdadero poder viene de las skills — archivos SKILL.md que funcionan como conjuntos de instrucciones, diciéndole a Claude exactamente cómo abordar una tarea específica. Piensa en ellas como recetas: flujos de trabajo paso a paso que Claude sigue automáticamente cuando la tarea encaja. Instalas una, y Claude se transforma en un especialista para ese dominio.
Aquí tienes 5 skills de repositorios públicos que hacen que Claude Code sea genuinamente útil para trading — con los comandos de instalación, las recetas por dentro, y código Python funcional usando EODHD para datos de mercado.
Fuente: tradermonty/claude-trading-skills · ⭐ 16
git clone https://github.com/tradermonty/claude-trading-skills.git
cp -r claude-trading-skills/skills/backtest-expert ~/.claude/skills/
Esta skill convierte a Claude Code en un analista de backtesting dedicado. La receta del SKILL.md le indica a Claude que siga un flujo de trabajo estructurado cada vez que describes una estrategia:
SKILL RECIPE (backtest-expert):
1. Confirm strategy rules and parameters
2. Fetch historical OHLCV data for the specified symbol and period
3. Compute indicator(s) from scratch — no library black boxes
4. Generate entry/exit signals with explicit conditions
5. Run a vectorized backtest: returns, Sharpe, max drawdown, win rate
6. Output equity curve + summary table
7. Flag overfitting risks if in-sample window < 2 years
En la práctica, describes tu idea en lenguaje natural. Claude sigue la receta.
import requests
import pandas as pd
import numpy as np
API_KEY = "YOUR_EODHD_KEY"
# Fetch EOD historical prices via EODHD REST API
url = f"https://eodhd.com/api/eod/AAPL.US"
params = {
"api_token": API_KEY,
"from": "2022-01-01",
"to": "2024-12-31",
"period": "d",
"fmt": "json"
}
data = requests.get(url, params=params).json()
df = pd.DataFrame(data)[["date", "adjusted_close", "volume"]]
df["date"] = pd.to_datetime(df["date"])
df.set_index("date", inplace=True)
df.columns = ["close", "volume"]
# RSI from scratch
delta = df["close"].diff()
gain = delta.clip(lower=0).rolling(14).mean()
loss = -delta.clip(upper=0).rolling(14).mean()
df["rsi"] = 100 - (100 / (1 + gain / loss))
# Signals
df["signal"] = 0
df.loc[df["rsi"] < 30, "signal"] = 1 # buy
df.loc[df["rsi"] > 70, "signal"] = -1 # sell
# Vectorized strategy returns
df["returns"] = df["close"].pct_change()
df["strategy"] = df["signal"].shift(1) * df["returns"]
sharpe = df["strategy"].mean() / df["strategy"].std() * np.sqrt(252)
total = (1 + df["strategy"]).prod() - 1
print(f"Sharpe: {sharpe:.2f} | Total return: {total:.2%}")
A partir de aquí puedes construir: bucles de validación walk-forward, screeners multi-ticker, grids de sensibilidad de parámetros.
Ventajas
Desventajas
Ideal para: cuants que prueban entre 5 y 10 variantes de estrategia a la semana y necesitan resultados reproducibles y comparables entre todas ellas.
Fuente: JoelLewis/finance_skills · plugin trading-operations
npx skills add JoelLewis/finance_skills --plugin trading-operations
Esta skill gestiona toda la capa de ingesta de datos. Su receta estandariza cómo Claude trae y estructura datos de mercado — precios EOD, barras intradía, fundamentales, y cotizaciones en tiempo real — desde un único proveedor.
SKILL RECIPE (market-data-pipeline):
1. Identify data type needed: EOD / intraday / fundamentals / real-time
2. Select the correct EODHD endpoint for that data type
3. Build the request with proper params (symbol format, date range, interval)
4. Normalize response to a DataFrame with standard column names
5. Apply corporate-action adjustments for historical price analysis
6. Cache the result to avoid redundant API calls in the same session
7. Return the DataFrame ready for indicator computation
Los datos malos son el asesino silencioso de los backtests. Sesgo de supervivencia, precios sin ajustar, eventos corporativos que faltan — estos no lanzan errores. Simplemente hacen que tu estrategia parezca mejor de lo que es.
import requests
import pandas as pd
API_KEY = "YOUR_EODHD_KEY"
def fetch_eod(symbol: str, start: str, end: str) -> pd.DataFrame:
r = requests.get(
f"https://eodhd.com/api/eod/{symbol}",
params={"api_token": API_KEY, "from": start, "to": end, "period": "d", "fmt": "json"}
)
df = pd.DataFrame(r.json())
df["date"] = pd.to_datetime(df["date"])
return df.set_index("date")[["open", "high", "low", "close", "adjusted_close", "volume"]]
def fetch_intraday(symbol: str, interval: str = "1m") -> pd.DataFrame:
r = requests.get(
f"https://eodhd.com/api/intraday/{symbol}",
params={"api_token": API_KEY, "interval": interval, "fmt": "json"}
)
df = pd.DataFrame(r.json())
df["datetime"] = pd.to_datetime(df["datetime"])
return df.set_index("datetime")[["open", "high", "low", "close", "volume"]]
def fetch_fundamentals(symbol: str) -> dict:
r = requests.get(
f"https://eodhd.com/api/fundamentals/{symbol}",
params={"api_token": API_KEY, "fmt": "json"}
)
return r.json()
# Usage
aapl = fetch_eod("AAPL.US", "2023-01-01", "2024-12-31")
fund = fetch_fundamentals("AAPL.US")
eps = fund["Highlights"]["EPS"]
print(f"EPS: {eps} | Latest adjusted close: ${aapl['adjusted_close'].iloc[-1]:.2f}")
EODHD cubre más de 70 mercados en todo el mundo — acciones de EE. UU., ETFs, forex, cripto — con precios ajustados por eventos corporativos y un plan gratuito para prototipar.
👉 Empieza con EODHD y consigue un 10% de descuento en cualquier plan de pago: eodhd.com
Ventajas
Desventajas
Ideal para: cualquiera construyendo un sistema serio de backtesting o en vivo que necesite datos de calidad institucional a precios de desarrollador independiente.
Fuente: ScientiaCapital/skills · active/signal-generation
git clone https://github.com/scientiacapital/skills.git
cp -r skills/active/signal-generation ~/.claude/skills/
Tienes una estrategia. Vive en tu cabeza, en una nota de investigación, o en un Pine Script de TradingView. Necesitas tenerla en Python limpio y vectorizado. Esta skill se encarga de la traducción.
SKILL RECIPE (signal-generation):
1. Parse strategy rules from natural language into explicit conditions
2. Map each condition to a pandas/numpy operation
3. Compute indicators using vectorized operations (no row-by-row loops)
4. Build entry and exit Series separately
5. Apply time-of-day or session filters if specified
6. Output DataFrame: [close, *indicators, signal, position]
7. Verify: no lookahead bias (all indicators shifted before signal comparison)
import requests
import pandas as pd
import numpy as np
API_KEY = "YOUR_EODHD_KEY"
r = requests.get(
"https://eodhd.com/api/eod/TSLA.US",
params={"api_token": API_KEY, "from": "2023-01-01", "to": "2024-12-31", "period": "d", "fmt": "json"}
)
df = pd.DataFrame(r.json())
df["date"] = pd.to_datetime(df["date"])
df = df.set_index("date")[["high", "low", "adjusted_close"]].rename(columns={"adjusted_close": "close"})
# EMA crossover + ADX filter - no TA-Lib
def ema(s, n):
return s.ewm(span=n, adjust=False).mean()
def compute_adx(df, n=14):
tr = pd.concat([
df["high"] - df["low"],
(df["high"] - df["close"].shift()).abs(),
(df["low"] - df["close"].shift()).abs()
], axis=1).max(axis=1)
dm_pos = (df["high"] - df["high"].shift()).clip(lower=0)
dm_neg = (df["low"].shift() - df["low"]).clip(lower=0)
atr = tr.ewm(span=n, adjust=False).mean()
di_pos = 100 * dm_pos.ewm(span=n, adjust=False).mean() / atr
di_neg = 100 * dm_neg.ewm(span=n, adjust=False).mean() / atr
dx = (100 * (di_pos - di_neg).abs() / (di_pos + di_neg))
return dx.ewm(span=n, adjust=False).mean()
df["ema20"] = ema(df["close"], 20)
df["ema50"] = ema(df["close"], 50)
df["adx"] = compute_adx(df)
cross_up = (df["ema20"] > df["ema50"]) & (df["ema20"].shift() <= df["ema50"].shift())
adx_confirmed = df["adx"] > 25
df["signal"] = (cross_up & adx_confirmed).astype(int)
print(df[df["signal"] == 1][["close", "ema20", "ema50", "adx"]].tail())
Ventajas
Desventajas
Ideal para: traders que piensan en reglas de estrategia y quieren que Claude gestione la traducción a Python.
Fuente: JoelLewis/finance_skills · plugin wealth-management (skill risk-measurement)
npx skills add JoelLewis/finance_skills --plugin wealth-management
Una estrategia sin gestión de riesgo es especulación con pasos extra. Esta skill le da a Claude un marco de decisión estructurado para cada cálculo de dimensionamiento y exposición.
SKILL RECIPE (risk-management):
1. Calculate ATR-based stop distance for the current setup
2. Apply fixed-fractional sizing (default: 1% account risk per trade)
3. Check portfolio heat: flag if total exposure > 5% of equity
4. Compute Historical VaR (95% confidence) on the current portfolio
5. Output: entry, stop, shares, dollar risk, R-multiple target
6. Define kill-switch threshold: halt new entries if drawdown > X%
import requests
import pandas as pd
import numpy as np
API_KEY = "YOUR_EODHD_KEY"
r = requests.get(
"https://eodhd.com/api/eod/AAPL.US",
params={"api_token": API_KEY, "from": "2024-10-01", "to": "2024-12-31", "period": "d", "fmt": "json"}
)
df = pd.DataFrame(r.json())
df["date"] = pd.to_datetime(df["date"])
df = df.set_index("date")[["high", "low", "adjusted_close"]].rename(columns={"adjusted_close": "close"})
# ATR (14-period)
tr = pd.concat([
df["high"] - df["low"],
(df["high"] - df["close"].shift()).abs(),
(df["low"] - df["close"].shift()).abs()
], axis=1).max(axis=1)
atr = tr.ewm(span=14, adjust=False).mean().iloc[-1]
def size_position(equity, risk_pct, entry, stop):
risk_per_share = abs(entry - stop)
if risk_per_share == 0:
return 0
return int((equity * risk_pct / 100) / risk_per_share)
equity = 10_000
entry_price = df["close"].iloc[-1]
stop_price = entry_price - (2 * atr)
shares = size_position(equity, 1.0, entry_price, stop_price)
print(f"Entry: ${entry_price:.2f}")
print(f"Stop (2×ATR): ${stop_price:.2f} | ATR: ${atr:.2f}")
print(f"Position size: {shares} shares")
print(f"Dollar risk: ${shares * abs(entry_price - stop_price):.2f}")
Ventajas
Desventajas
Ideal para: traders sistemáticos que corren varias estrategias a la vez y necesitan un marco de riesgo consistente y auditable.
Fuente: roman-rr/trading-skills · skill trading-signals
git clone https://github.com/roman-rr/trading-skills.git
cp -r trading-skills/trading-signals ~/.claude/skills/
La última skill cierra el círculo entre investigación y monitorización en vivo. En lugar de correr backtests, vigilas señales en tiempo real y disparas alertas cuando se cumplen las condiciones.
SKILL RECIPE (live-signal-monitor):
1. Fetch real-time quote and recent EOD bars via EODHD REST API
2. Maintain a rolling window of bars in memory
3. Recompute indicator(s) on each new bar
4. Evaluate signal conditions — entry, exit, or hold
5. On signal trigger: log timestamp, symbol, price, indicator values
6. Send alert (print / Telegram / email)
7. Never execute orders directly — output signal only
import requests
import pandas as pd
import numpy as np
import time
from datetime import datetime
API_KEY = "YOUR_EODHD_KEY"
def fetch_live_quote(symbol: str) -> float:
r = requests.get(
f"https://eodhd.com/api/real-time/{symbol}",
params={"api_token": API_KEY, "fmt": "json"}
)
return r.json().get("close", None)
def fetch_recent_eod(symbol: str, n: int = 30) -> pd.Series:
r = requests.get(
f"https://eodhd.com/api/eod/{symbol}",
params={"api_token": API_KEY, "period": "d", "fmt": "json"}
)
df = pd.DataFrame(r.json()).tail(n)
df["date"] = pd.to_datetime(df["date"])
return df.set_index("date")["adjusted_close"].rename("close")
def compute_rsi(series, n=14):
delta = series.diff()
gain = delta.clip(lower=0).rolling(n).mean()
loss = -delta.clip(upper=0).rolling(n).mean()
return 100 - (100 / (1 + gain / loss))
symbol = "AAPL.US"
print(f"Monitoring {symbol} | {datetime.now():%Y-%m-%d %H:%M}")
while True:
close_series = fetch_recent_eod(symbol, n=30)
live_price = fetch_live_quote(symbol) or close_series.iloc[-1]
# Append live price as today's bar
today = pd.Timestamp.now().normalize()
close_series[today] = live_price
rsi = compute_rsi(close_series).iloc[-1]
status = "OVERSOLD → BUY WATCH" if rsi < 30 else "OVERBOUGHT → SELL WATCH" if rsi > 70 else "NEUTRAL"
print(f"[{datetime.now():%H:%M:%S}] {symbol} | ${live_price:.2f} | RSI: {rsi:.1f} | {status}")
if rsi < 30:
print(f" 🔔 ALERT: RSI oversold at {rsi:.1f} - review entry")
time.sleep(60)
Combina esto con un bot de Telegram y tienes detección de señales automatizada corriendo 24/7 — sin vigilar gráficos a mano.
👉 Empieza con EODHD y desbloquea un 10% de descuento en cualquier plan de pago: eodhd.com
Ventajas
Desventajas
Ideal para: traders de swing e intradía que quieren detección de señales automatizada sin construir un sistema de ejecución completo.
Las skills de Claude Code no son magia. Son recetas estructuradas que eliminan el impuesto de "averiguarlo desde cero" en cada proyecto nuevo.
Cinco skills. Una capa de datos fiable. El cuello de botella se desplaza de la implementación a lo que siempre debería haber sido: decidir qué estrategias merece la pena probar.
A la mayoría de los cuants no les faltan ideas. Les falta el ancho de banda para implementarlas lo bastante rápido como para encontrar las que de verdad funcionan.
Eso es lo que cambia.
¿Buscas contenido técnico para tu empresa? Puedo ayudarte — LinkedIn · kevinmenesesgonzalez@gmail.com