outcometick
Datos históricos de ticks de Polymarket y Predict.fun, además de cotizaciones de backtest y estado, a través de MCP
Documentación
outcometick
El SDK de estrategias TypeScript / JavaScript y la línea de comandos ot para
outcometick.com — datos a nivel de tick para mercados Up/Down de criptomonedas de Polymarket y
Predict.fun.
npm i -g outcometick
ot check . # validate, free, no data
ot run . --data ./polymarket-data-samples # replay locally
ot submit . --assets btc,eth --days 30 # send it to the queue
ot status <run_id> # where it got to
ot fetch <run_id> # download the report
Cambio importante en 2.0: los backtests cubren solo los 35 días archivados más recientes,
y la ventana avanza a medida que los días se archivan. Un --from antes de la
ventana, o --days más largo que ella, se rechaza con E_SCOPE antes de que
se suba nada, y el mensaje nombra la ventana actual. Usa --days <n> para los
n días más recientes; las fechas actuales están en
https://outcometick.com/v1/backtest/capacity?venue=polymarket.
Escribir una estrategia
Totalmente tipado — ot incluye declaraciones de .d.ts, así que una estrategia que pase la verificación de tipos
es una que la cola aceptará.
import { Strategy, Order, type Ctx, type Tick } from "outcometick";
export default class MeanReversion extends Strategy<{ entry_z: number; size: number }> {
private entered = false;
onMarketOpen() { this.entered = false; }
onTick(ctx: Ctx<{ entry_z: number; size: number }>, tick: Tick): Order | null {
const z = ctx.zscore(tick.value, { window: 180 });
if (this.entered || Math.abs(z) < ctx.p.entry_z) return null;
const side = z > 0 ? "DOWN" : "UP";
const limit = ctx.book().best(side);
if (limit === null) return null;
this.entered = true;
return new Order({ side, size: ctx.p.size, limit });
}
}
JavaScript puro también funciona — el runtime es ESM sin paso de compilación.
El propósito de ot check
Ejecuta el mismo validador que ejecuta la cola — el mismo módulo, no una copia. Si pasa localmente, no será rechazado al enviarlo. Eso solo es cierto porque hay una única implementación, que es por lo que el validador y los analizadores estáticos se incluyen en este paquete en lugar de reimplementarse en el lado del cliente.
Qué es ot run y qué no es
Es el mismo motor, el mismo informe y el mismo formato de archivo que usa la cola, contra una copia local del archivo:
curl -L https://github.com/outcometick/polymarket-tick-data-samples/releases/latest/download/polymarket-data-samples.tar.gz | tar xz
No es el sandbox. Localmente tu estrategia se ejecuta como tú, con tus privilegios, en tu máquina — lo cual está bien, porque es tu código. En nuestras máquinas se ejecuta en un contenedor sin red, sin sistema de archivos escribible y con un presupuesto estricto de CPU y tiempo de pared.
Pruebas
npm install && npm test
Requiere python3 en PATH: uno de los dos analizadores estáticos está escrito en
Python, y la CLI lo maneja de la misma manera que la API.
Descargar datos
La otra mitad del paquete: un cliente para la suscripción de datos, en una importación separada porque no tiene nada que ver con escribir una estrategia.
import { DataClient, NO_VALUE } from "outcometick/data";
const ot = new DataClient(); // key from OT_KEY
const meta = await ot.meta(); // what can this key see?
const { files } = await ot.files({
from: "2026-08-01", to: "2026-08-12", // or date: "2026-08-12"
asset: ["BTC", "ETH"], // the BASE symbol, not BTCUSD
dataset: "prices",
interval: ["5m", NO_VALUE], // "5m" alone EXCLUDES the
}); // period-less settlement streams
await ot.download(files[0], { saveTo: files[0].name }); // checksum verified
meta() informa las dimensiones que esta clave puede alcanzar realmente. Ten en cuenta que
intervals contiene solo duraciones reales — el centinela none se informa
por separado bajo filterTokens, así que un llamador que construye un enum a partir de él o
analiza los valores como duraciones nunca encuentra un token.
Las descargas se verifican con checksum: /v1/dl redirige al almacenamiento con el sha256
en un encabezado, y el cliente sigue esa redirección por sí mismo para que el checksum no se
descarte.
Reconstruir un libro de órdenes de Polymarket
book y price_change se almacenan a una cadencia de captura, así que una eliminación puede
caer entre dos fotogramas almacenados y dejar un nivel obsoleto. OrderBook
aplica la regla de reconstrucción documentada: las instantáneas reemplazan la escalera de un token,
los cambios establecen tamaños absolutos (0 elimina), y los niveles cruzados por la mejor oferta/demanda
más reciente (de best_bid_ask y de cada cambio) se descartan. Aliméntalo con
filas de los tres archivos combinados por recv_ms.
import { OrderBook } from "outcometick/data";
const book = new OrderBook();
for (const row of rows) book.apply(row); // parsed objects or JSONL lines
book.ladder(tokenId); // { bids: [{ price, size }], asks: [...] }, best first
book.best(tokenId); // { bid, ask }
Eso elimina cada nivel que los mejores precios han superado, pero no puede
restaurar lo que los fotogramas descartados agregaron o redimensionaron: hasta la próxima instantánea un
nivel, también en la parte superior, puede faltar o llevar un tamaño antiguo (best_bid_ask tiene
solo precios). best() es el mejor nivel de la escalera reconstruida, no la
mejor oferta/demanda más reciente del mercado — lee filas de best_bid_ask para eso.
Historial de operaciones de dinero inteligente
Una suscripción separada con su propia clave: archivos diarios de las operaciones realizadas por los traders de Polymarket mejor clasificados.
const smart = new DataClient({ key: process.env.OT_SMART_KEY });
const { days } = await smart.smartDays(); // newest first
const day = days.find((d) => d.lists.top100?.status === "published")?.day;
if (day) await smart.smartDownload(day, "top100", { saveTo: "top100.csv.zst" }); // verified
Qué son las listas y qué significa cada columna: https://outcometick.com/polymarket-smart-money-data
Servidor MCP
ot mcp es un servidor de Model Context Protocol sobre stdio, para asistentes de codificación
y agentes. Lee, cotiza, valida y descarga; nunca envía un
backtest, porque eso gasta créditos. Necesita Node 24 o más reciente.
{
"mcpServers": {
"outcometick": {
"command": "npx",
"args": ["-y", "outcometick", "mcp"],
"env": {
"OT_KEY": "<data subscription key, optional>",
"OT_BACKTEST_KEY": "<backtest key, optional>"
}
}
}
}
Claude Code: claude mcp add outcometick -e OT_KEY=<data key> -- npx -y outcometick mcp
| Herramienta | Clave | Qué hace |
|---|---|---|
coverage | ninguna | Qué contiene el archivo por venue: activos, conjuntos de datos, rango de días |
plans | ninguna | Planes de suscripción de datos y sus precios en vivo |
backtest_capacity | ninguna | Qué días se pueden probar ahora y qué tan ocupada está la cola |
backtest_quote | ninguna | Cotizar un alcance de backtest en créditos sin enviarlo |
check_strategy | ninguna | Validar un directorio de estrategia con el validador de la cola, localmente |
meta | OT_KEY | La ventana de fechas y los valores de filtro que la clave de datos puede alcanzar |
list_files | OT_KEY | Buscar archivos de archivo que la clave de datos puede descargar |
download_file | OT_KEY | Descargar un archivo y verificar su sha256 |
backtest_runs | OT_BACKTEST_KEY | Ejecuciones recientes bajo la clave de backtest y el saldo de créditos |
backtest_status | OT_BACKTEST_KEY | El estado de una ejecución, créditos y resumen del informe |
¿Escribes tu estrategia en Python en su lugar? El SDK para eso es
pip install outcometick. ot ejecuta
esos también — es la única CLI para ambos lenguajes.
Referencia completa: https://outcometick.com/docs/sdk
Enlaces
- outcometick.com — qué es esto y qué cubren los datos
- Ejecutar un backtest — pega una estrategia, mírala ejecutarse
- Referencia del SDK — manifiesto, hooks,
ctx, límites - API de datos — el archivo que leen estas estrategias
- Discord (inglés y 中文) y Telegram — preguntas y charla sobre estrategias