Files
polymarket-bot/docs/informe-final.md
T
chemavx dc3b17e10c docs: captura de Grafana (90d) + nota sobre el panel Win Rate vacío
El panel Win Rate estuvo vacío los 81 días por diseño, no por bug: la API
emite win_rate: null hasta >=10 mercados resueltos (hubo 2) y Grafana no
renderiza null. Documentado en el informe final.
2026-07-06 11:45:16 +00:00

172 lines
8.7 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Informe final de paper trading — polymarket-bot
**Snapshot: 2026-07-06** · Generado desde la base de datos de producción con el bot
aún operativo, como parte de la Fase 1 del plan de decomisión (bloqueo ISP de
Polymarket en España, mayo 2026).
---
## ⚠️ Advertencia de tamaño muestral (léase primero)
**12 trades ejecutados, de los cuales solo 2 llegaron a resolución, no constituyen
evidencia estadística de nada.** Ni el P&L positivo demuestra que la estrategia
funcione, ni su ausencia lo habría refutado. El propio bot lo sabía: sus criterios
de promoción a dinero real exigían ≥10 mercados resueltos y ≥30 días de
observación (`promotion_ready: false`, win rate y Sharpe deliberadamente
reportados como `n/a (insufficient_sample)` en toda la instrumentación).
El valor demostrable de este proyecto no está en el P&L: está en la
infraestructura de evaluación, el pipeline de datos y la disciplina de gates que
impidió que el bot tradease sin ventaja medible. Este informe presenta el P&L
como lo que es — **una anécdota** — y dedica el grueso al sistema.
---
## 1. Resultados de trading (anecdóticos)
Bankroll simulado: **$10.000** (USDC virtual) · Capital desplegado: **$2.447** ·
Periodo de actividad: **1422 de abril de 2026** (los 12 trades se abrieron en 9
días; después, el endurecimiento de los gates de edge y confianza dejó el bot en
0 trades — funcionando, evaluando ~1.350 ciclos/día, sin encontrar ventaja neta
que superara sus propios umbrales).
### P&L realizado: **+$247,78** (2 mercados resueltos)
| Mercado | Dirección | Entrada | Resultado | P&L neto |
|---|---|---|---|---|
| Will Ken Paxton win the 2026 Texas Republican Primary? | BUY_YES | 0,618 | ✅ YES (2026-06-11) | **+$299,06** |
| Will NVIDIA be the largest company in the world…? | BUY_NO | 0,156 | ❌ YES (2026-06-30) | **$51,28** |
P&L neto de comisiones (2% simulado por lado). 1 acierto / 1 fallo: n=2.
### P&L no realizado (mark-to-market): **+$809,59** (5 posiciones abiertas)
Marcado a los precios reales de Polymarket (Gamma API) el 2026-07-06. Estas
posiciones **no están cerradas**: el número de abajo cambiaría cada día que los
mercados sigan moviéndose, y varios no resuelven hasta noviembre de 2026.
| Mercado | Dirección | Entrada | Precio actual (lado) | Coste neto | MTM P&L |
|---|---|---|---|---|---|
| Karen Bass gana la alcaldía de LA 2026 | BUY_YES | 0,268 | 0,595 | $510,00 | **+$600,07** |
| OpenAI IPO antes del 31-dic-2026 | BUY_NO | 0,618 | 0,785 | $510,00 | **+$125,11** |
| Demócratas ganan el Senado de Texas 2026 | BUY_YES | 0,418 | 0,435 | $509,49 | **+$10,32** |
| Demócratas ganan gobernación de Ohio 2026 | BUY_NO | 0,458 | 0,520 | $407,74 | **+$46,12** |
| Republicanos ganan gobernación de Nebraska 2026 | BUY_NO | 0,158 | 0,170 | $510,00 | **+$27,97** |
> Nota metodológica: el tracker interno reportaba `unrealized_pnl_est = +$522,73`,
> pero esa cifra es la **expectativa del propio modelo a fecha de entrada**
> (edge_net × coste), no un marcado a mercado. La tabla de arriba usa precios
> reales de mercado del día del snapshot, que es el criterio honesto. Ambas
> cifras coinciden en el signo; ninguna de las dos es un resultado realizado.
### Los otros 5 cierres (sin P&L): la historia real de abril
De los 7 trades cerrados, solo 2 cerraron por resolución. Los otros 5 los cerró
el propio bot al detectar defectos en su lógica — y son la parte más
instructiva del histórico:
- **3 por conflicto de familia**: dos posiciones sobre mercados hermanos del
mismo evento (p. ej. YES-demócratas y YES-republicanos en la misma
gobernación) — el agrupador de familias los detectó y cerró el lado débil.
- **2 por el bug de inversión de Manifold**: la señal cruzada de Manifold se
aplicaba invertida en mercados espejo. Detectado por instrumentación, las
posiciones afectadas se cerraron y el matching se movió a modo
observacional-only con auditoría completa (165.538 filas en
`manifold_match_audit`).
- **1 excluido de métricas** (`invalid_manifold_match_legacy`, P&L $0,00).
Después de esa semana el bot no volvió a operar: los gates endurecidos
(edge neto > mínimo por régimen, confianza ≥ 0,55, guardrail de noticias
prior±0,25) filtraron el 100% de las ~223.000 evaluaciones posteriores.
**Un sistema de paper trading cuyo resultado principal es "no tradees sin
ventaja" es un resultado**, y está instrumentado hasta el último skip.
---
## 2. El sistema (el activo real)
### Pipeline de señales
| Métrica | Valor (snapshot 2026-07-06) |
|---|---|
| Ciclos de evaluación archivados | **5.356** (cadencia ~64 s) |
| Evaluaciones mercado-ciclo archivadas | **222.738** |
| Mercados distintos evaluados | 87 (events 114,9k · politics 96,0k · crypto/finance 7,7k · tech 4,2k evaluaciones) |
| Archivo `signals` operativo desde | 2026-07-02 (replay R0) — crece ~55k filas/día |
| Histórico de métricas diarias | **81 días** (2026-04-14 → 2026-07-06, `metrics_daily`) |
| Snapshots de contexto externo | 5.356 (BTC, dominancia, Fear&Greed por ciclo) |
Cada evaluación archiva el prior, la probabilidad estimada, el edge bruto/neto,
la descomposición por feature (Fear&Greed, momentum, noticias, Manifold,
dominancia BTC en log-odds), el gate que la bloqueó y el contexto de mercado —
suficiente para reproducir la decisión completa offline.
### Motor de replay (R0R2, julio 2026)
- Inyección de reloj + replay determinista de ciclos archivados:
**22.697/22.697 decisiones idénticas** al reproducir el histórico.
- Joiner diario de resoluciones (CronJob 00:30 UTC) contra la Gamma API:
cobertura de outcomes 9/87 mercados al snapshot, creciendo sola.
- Diseñado para calibrar sobre **todas** las evaluaciones (no solo trades),
esquivando el problema del n=12.
### Estrategia (congelada desde 2026-07-03)
Prior desde el precio de Polymarket → ajuste bayesiano en log-odds con señales
externas (GNews con presupuesto de 5 consultas/día y guardrail prior±0,25;
Fear&Greed; momentum BTC; Manifold observacional) → gates en cascada: prior
extremo, edge bruto por régimen de volatilidad, edge neto tras comisión 2% y
spread, confianza mínima 0,55, conflictos de familia, guard de reentrada.
Sizing por Kelly fraccionado con techo por posición.
### Infraestructura
3 imágenes (bot / API FastAPI / dashboard) construidas por Gitea Actions solo
cuando cambian sus fuentes, desplegadas por ArgoCD (prune + selfHeal) en k3s;
PostgreSQL 16 en StatefulSet; secrets vía Infisical operator; smoke test
PostSync contra la API; backups nocturnos con sync offsite (rclone → MEGA);
observabilidad en Grafana + uptime-kuma + notificaciones Telegram (deploys,
checkpoints del bot, fallos de sync). Retención de métricas y join de outcomes
como CronJobs. **88 días de uptime del StatefulSet al snapshot.**
Detalle honesto de observabilidad: el panel *Win Rate* del dashboard de Grafana
(`docs/dashboard-grafana-2026-07-06.png`) pasó vacío los 81 días. No es una
query rota: la API emite `win_rate: null` hasta tener ≥10 mercados resueltos
(hubo 2), y Grafana no pinta nada con un null. El panel vacío es el criterio
de promoción del bot aplicándose a su propia monitorización.
---
## 3. Estado de la base de datos al snapshot
| Tabla | Filas | Contenido |
|---|---|---|
| `signals` | 222.549* | Archivo de evaluaciones por ciclo (desde 2026-07-02) |
| `manifold_match_audit` | 165.538 | Auditoría completa del matching Polymarket↔Manifold |
| `replay_decisions` | 22.697 | Decisiones reproducidas por el motor de replay |
| `ext_snapshots` | 5.353* | Contexto externo por ciclo |
| `metrics_daily` | 516 | Cierres diarios (81 días) + snapshots intradía de hoy |
| `markets` | 87 | Universo evaluado |
| `trades` | 12 | Ledger completo de paper trades |
| `market_outcomes` | 9 | Resoluciones UMA-final joineadas |
| `replay_runs` / `manifold_eval_cooldown` / `checkpoint_alerts` | 1 / 76 / 3 | Metadatos |
\* La BD sigue viva; las tablas por ciclo crecen ~55k y ~1,3k filas/día
respectivamente. Backup verificado del 2026-07-06 en
`/data/backups/backups/polymarket-decommission/` (pg_dump -Fc + CSV.gz +
checksums; restore de prueba con recuentos idénticos 11/11 tablas). El dump
final se hará en la Fase 3, justo antes del apagado.
---
## 4. Conclusión
El proyecto se archiva por una causa externa (bloqueo regulatorio del origen de
datos), no por fracaso técnico. Lo que queda: un motor de evaluación bayesiano
determinista y auditable, un pipeline de datos que archivó cada decisión con su
contexto completo, y la evidencia — anecdótica en P&L, sólida en ingeniería —
de que el sistema prefería no operar antes que operar sin ventaja. Todos los
módulos centrales (edge, familias, replay, observabilidad) son agnósticos de la
fuente y quedan listos para un eventual pivote a Manifold
(`docs/pivot-manifold.md`, Fase 5).