Trading bot
DRY_RUN ciclo 2026-09-11 08:44
v0.1.0 · 557d7fd arrancado 2026-09-11 16:16 Lima último ciclo 2026-09-11 08:44 último sync 2026-09-11 15:17 sqlite:///./trading.db código que opera: release · 557d7fd Observación: no iniciada (empieza al pasar a PAPER) resumen

Resumen: lo importante en una página

Esta página existe para que cualquiera (tú dentro de dos meses, o alguien que revise el proyecto) entienda el bot en cinco minutos sin leer el plan entero. Todo lo que dice aquí tiene su detalle en las otras páginas: Plan, Estrategia, Runbook, Mejoras.

Qué es y qué no es

  • Es un bot que compra y vende acciones de EE. UU. en una cuenta paper de Alpaca: dinero simulado, 100 000 USD de partida. Nunca ha tocado dinero real y no lo hará sin cumplir la checklist de la Fase 6 del Plan.
  • Su trabajo en esta etapa es validar la operación (que cada pieza haga lo que dice, cada día, sin intervención), no ganar dinero. La estrategia es deliberadamente simple.
  • No lee noticias, no usa inteligencia artificial para decidir, no opera opciones ni cripto (el módulo cripto se probó con backtest y se descartó).

Cómo decide

  • Una decisión por símbolo y por día, con el cierre del día anterior. Universo: 10 símbolos (SPY, QQQ, AAPL, MSFT, NVDA, AMZN, GOOGL, META, JPM, XOM).
  • Compra cuando la media de 20 días cruza sobre la de 50 (o lo hizo en los últimos 5 días), el precio está sobre la media de 200 y hay volumen normal. Máximo 5 posiciones, 10 % del capital cada una, arriesgando 1 % por operación.
  • Al comprar manda un bracket a Alpaca: la orden de compra con su stop (2 × ATR por debajo) y su take-profit (3 × ATR por encima) ya colocados en el bróker. Por eso el stop sobrevive aunque el bot esté apagado.
  • Vende si la media de 20 cruza bajo la de 50, si toca el stop o el objetivo, o a los 40 días.

Cuándo corre y por qué tiene horario

Momento (Lima) Momento (Nueva York) Qué hace
8:35 (verano) / 9:35 (invierno), lunes a viernes 9:35 El ciclo: evalúa los 10 símbolos y manda órdenes si hay señal
cada hora hasta el cierre 10:05 … 15:05 Sync: lee en Alpaca qué se ejecutó (fills, stops, objetivos)
15:05 (verano) / 16:05 (invierno) 16:05 Cierre: foto de la cuenta, resumen del día por Telegram, copia de seguridad

Por qué no corre más horas ni fines de semana:

  1. La bolsa de EE. UU. abre de 9:30 a 16:00 hora de Nueva York, de lunes a viernes, salvo festivos. Fuera de eso no hay precios nuevos ni órdenes que ejecutar.
  2. La estrategia usa barras diarias: decide una vez al día con el cierre y ejecuta en la apertura siguiente. Mirar cada minuto no cambiaría ninguna decisión.
  3. El stop y el objetivo viven en Alpaca. No hace falta un proceso vigilando: el sync horario solo se entera de lo que Alpaca ya hizo.
  4. "Más horas" significaba cripto 24/7. Se probó con datos reales y perdió dinero mientras BTC subía un 81 %; se descartó.
  5. El bot corre gratis en GitHub Actions (2 000 minutos al mes). El horario actual gasta unos 350; un proceso continuo no cabría sin pagar.

Lima está en UTC−5 todo el año; Nueva York cambia con el horario de verano, por eso el ciclo cae a las 8:35 o a las 9:35 según la época. El bot siempre usa el reloj de Alpaca, nunca uno local.

Dónde ver cada cosa

  • Mientras corre: GitHub → Actions → Bot → el job en curso → paso "Job". Una línea por símbolo en el momento en que se decide.
  • En segundos: Telegram. Cada ciclo manda órdenes, rechazos y la bitácora completa. Comandos: /status, /bitacora 20, /resumen, /kill, /resume, /nota, /mejora, /watch.
  • Al minuto: el panel (https://trading-bot-9jt.pages.dev), publicado 1–2 minutos después de cada job y recargado solo cada minuto. La barra superior dice qué modo, qué rama y qué commit operan, cuándo fue el último ciclo y en qué día de la observación vamos.

Cómo leer una línea de la bitácora

AAPL HOLD · sin tendencia alcista: SMA20 bajo SMA50; SMA20=316.72 SMA50=317.99 → no hubo señal: la media de 20 está por debajo de la de 50. Estado no_signal.

NVDA HOLD · cruce antiguo: SMA20 sobre SMA50 desde hace más de 5 barras (no se persigue el precio) → tampoco hay señal: la tendencia ya existía; el cruce fue hace semanas y la regla solo entra en los 5 días siguientes al cruce. Estado no_signal.

NVDA BUY ✅ x12 @ 181.20 · SMA20 cruzó sobre SMA50, precio > SMA200, volumen OK → señal de compra aprobada por riesgo: 12 acciones a ~181,20 con bracket. Estado approved.

XOM BUY ⛔ · máximo de posiciones abiertas alcanzado (5/5) → hubo señal, pero una regla la vetó. Estado rejected; la regla va siempre en el motivo.

Qué significa un día sin señales

Es lo normal. La estrategia da unas 25 señales al año sobre 10 símbolos: una cada dos semanas. Un HOLD tiene dos motivos posibles: cruce antiguo (la media de 20 ya está sobre la de 50 desde hace más de 5 días; entrar ahora sería perseguir el precio) o sin tendencia (la media de 20 está por debajo de la de 50). En la columna Resultado aparece no_signal: la estrategia no vio nada, así que el riesgo no tuvo nada que evaluar. Solo rejected significa "hubo señal y una regla la vetó". Y en DRY_RUN, aunque hubiera señal, no se envía ninguna orden.

Los números honestos (backtest con las mismas reglas que el bot)

Ventana Resultado Drawdown Sharpe Ops SPY
Fuera de muestra 2023 → 2026 +11.1 % −3.6 % 0.93 92 +101 %
Sin NVDA ni GOOGL +3.1 % −4.0 % 0.34 75 +101 %
Dentro de muestra 2020-07 → 2022-12 +1.2 % −5.1 % 0.24 27 +18 %

Lectura: pierde mucho menos que el índice, pero gana mucho menos; dos acciones ponen la mayor parte del resultado; la muestra de entrenamiento es tan pequeña que no vale para decidir nada. Los datos gratuitos empiezan en julio de 2020. La ventana 2023 → 2026 se usó para elegir el modo de salida, así que la única validación limpia que queda es la observación en paper con reglas congeladas.

Reglas de riesgo

Regla Valor Qué pasa
Tamaño por posición 10 % del capital Tope de cada compra
Riesgo por operación 1 % del capital Define cuántas acciones, según la distancia al stop
Posiciones abiertas 5 (cuenta las que están en vuelo) La sexta compra se rechaza
Pérdida diaria −2 % Kill switch hasta el día siguiente; las ventas siguen
Drawdown desde el máximo −10 % Kill switch manual: sin compras hasta que revises y mandes /resume (que fija el pico en la equity actual)
Hueco de apertura 3 % Si el precio se alejó de la señal, no se entra
Posición sin stop en Alpaca Aviso y, en el siguiente ciclo, el bot la cierra (a menos que repongas el stop antes)
Kill switch manual /kill Sin compras; /resume lo quita

Qué puede cambiar durante la observación (definición de "congelada")

  • Reinicia los 60 días: cualquier cambio en strategy/, risk/, execution/, portfolio/ o en los parámetros de tamaño y riesgo de config.py. Da igual lo pequeño que sea.
  • No reinicia: panel (web/), avisos (notify/), informes, fiabilidad, comandos, docs, workflows y tests. Son operación y lectura, no decisión.
  • La fecha y el commit congelado quedan en el journal (nota observacion) y en la barra del panel. Lo nuevo (filtro de régimen, S&P 500) vive en ramas y solo produce backtests hasta diciembre.

Cosas que ya están cubiertas y conviene saber

  • Dos jobs nunca corren a la vez (grupo de concurrencia compartido; probado).
  • El backtest aplica el mismo filtro de hueco del 3 % y el mismo desplazamiento de stop que el bot.
  • Una orden aceptada por Alpaca cuya respuesta se perdió no se duplica ni se trata como desconocida: el id es el mismo cada vez y el sync la adopta.
  • Cada incidente o simulacro se anota en docs/INCIDENTS.md con formato fijo; el informe mensual los cuenta.

Observación y dinero real

  • DRY_RUN (ahora): el bot decide y registra pero no manda órdenes. Tres ciclos: 11, 12 y 14 de septiembre de 2026.
  • PAPER (desde el 15): manda órdenes reales a la cuenta simulada. Empiezan solos los 60 días hábiles de observación y la rama release queda congelada: nada cambia salvo arreglos de operación.
  • Dinero real solo si: 3 a 6 meses de paper con el mismo código, resultado ≥ 0 tras costos, drawdown < 10 %, sin NVDA ni GOOGL el resultado sigue ≥ 0, cero incidentes el último mes, Alpaca acepta cuenta real desde Perú, un contador ha explicado los impuestos, y capital que se pueda perder por completo (1 500–2 000 USD). Checklist con fechas en el Plan, Fase 6.
  • Descartado: cripto, trailing stop como salida por defecto, filtro de noticias, Hugging Face y Oracle como servidores. Probado y en espera: filtro de régimen (SPY bajo su media de 200).

Glosario

  • Paper: cuenta simulada con dinero ficticio, mismas reglas de mercado.
  • Bracket: orden de compra que lleva pegados un stop y un objetivo; los tres viven en el bróker.
  • Stop / take-profit: precio al que se vende con pérdida limitada / con ganancia fijada.
  • ATR: rango medio diario del precio; mide cuánto se mueve una acción.
  • Drawdown: caída desde el máximo anterior de la cuenta.
  • Sharpe: rendimiento por unidad de riesgo; por encima de 1 es bueno, por debajo de 0,5 flojo.
  • Dentro / fuera de muestra (IS / OOS): datos usados para ajustar / datos no usados para ajustar.
  • Exposición: porcentaje del tiempo con dinero invertido.
  • Expectancy: ganancia media por operación cerrada.
  • Régimen: mercado alcista o bajista según SPY frente a su media de 200 días.
  • Kill switch: freno: sin compras nuevas hasta que se levante.
  • PDT: regla de EE. UU. que limita las compras y ventas en el mismo día en cuentas pequeñas.

Fuente: docs/RESUMEN.md · modificado hace 0 min. Se lee del disco en cada carga: git pull lo actualiza sin reiniciar.

trading-bot v0.1.0 · 2026-09-11 16:16 Lima (21:16 UTC)