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

HerramientaClaveQué hace
coverageningunaQué contiene el archivo por venue: activos, conjuntos de datos, rango de días
plansningunaPlanes de suscripción de datos y sus precios en vivo
backtest_capacityningunaQué días se pueden probar ahora y qué tan ocupada está la cola
backtest_quoteningunaCotizar un alcance de backtest en créditos sin enviarlo
check_strategyningunaValidar un directorio de estrategia con el validador de la cola, localmente
metaOT_KEYLa ventana de fechas y los valores de filtro que la clave de datos puede alcanzar
list_filesOT_KEYBuscar archivos de archivo que la clave de datos puede descargar
download_fileOT_KEYDescargar un archivo y verificar su sha256
backtest_runsOT_BACKTEST_KEYEjecuciones recientes bajo la clave de backtest y el saldo de créditos
backtest_statusOT_BACKTEST_KEYEl 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