PolymarketClickHouse Workshops

07 Analyste de marché IA

Confiez vos tables de marché en direct à un ClickHouse Agent, faites-lui détecter et étudier un mouvement de façon autonome, puis arbitrez sa réponse avec du SQL déterministe.

Votre ordinateur
Terminal macOS : Exécutez les commandes de l’atelier dans le Terminal avec zsh ou bash.

Point de départ

Le collecteur est sain en mode live, degraded ou fixture, les requêtes du Module 05 répondent et vous êtes connecté à l'organisation propriétaire de polymarket-workshop. Aucune nouvelle clé API ni aucun processus local : ClickHouse Agents s'exécute dans Cloud avec l'identité créée au Module 00.

Pourquoi

Le Module 05 répondait à quatre questions déjà écrites. Le marché n'attend pas votre liste. Le bon modèle est celui d'un analyste d'astreinte : remarquer un mouvement, formuler une hypothèse, écrire les requêtes qui la testent et rendre un verdict étayé. Cette boucle peut aussi échouer en silence ; les deux dernières étapes arbitrent donc l'agent au lieu de lui faire confiance.

Étape 1 — Ouvrir ClickHouse Agents et connecter ce service

open 'https://ai.clickhouse.cloud'

La console Cloud mène au même endroit : votre service, puis ClickHouse agents.

Créez un agent nommé Polymarket analyst, ajoutez l'outil ClickHouse, pointez-le vers polymarket-workshop et vérifiez l'état Connected. Sans outil connecté, l'agent devine votre schéma. Collez ces instructions ; chaque ligne évite une erreur fréquente :

You answer questions about live public prediction-market data in the polymarket database
of this service. Rules:
- Probability is the quote midpoint: polymarket.price_ticks where midpoint > 0, or the
  merged close of polymarket.market_midpoints_1m. A last_trade_price tick is not one.
- market_midpoints_1m holds AggregateFunction states. Read them only through
  argMinMerge(open), maxMerge(high), minMerge(low), argMaxMerge(close) and
  countMerge(updates), grouped by minute, token_id.
- Metadata comes from polymarket.markets FINAL, trades from polymarket.trades_clean.
- One condition_id per market, one token_id per outcome. A Yes move and its No
  counterpart are one event, not two findings.
- Timestamps are UTC and the newest minute is usually still filling.
- Show the SQL you ran and the age of the data behind every number.
- Public-data analysis only. Never give trading advice.

Étape 2 — Premier échange : le laisser trouver le mouvement

Using the ClickHouse tool, find the largest midpoint move in the last 30 minutes of
polymarket.market_midpoints_1m. For each token_id compare the merged close of the most
recent complete minute with the merged close five minutes earlier. Report the question,
the outcome, the token_id, both probabilities in percent, the move in percentage points,
and the two minutes you compared. Show the SQL.

Résultat attendu : un résultat nommé, un mouvement signé en points et du SQL qui fusionne les états agrégés au lieu de sélectionner leurs colonnes brutes.

Étape 3 — Deuxième échange : lui faire étudier sa propre découverte

Investigate that move before you believe it. From polymarket.price_ticks report the
latest best_bid, best_ask, spread in percentage points, and quote age in seconds for that
token_id. From polymarket.trades_clean compare matched volume as price * size over the
five minutes covering the move against the previous five minutes. Then give a verdict of
corroborated, weakly corroborated, or likely artifact, and name the evidence behind it.

Vous n'avez pas indiqué comment combiner les trois signaux. Ce choix en fait un agent plutôt qu'une simple interface texte-vers-SQL.

Étape 4 — Troisième échange : lui faire attaquer son propre verdict

List every assumption in that verdict that could be wrong, and for each one the single
query that would falsify it. Run the two you consider most likely to be wrong, then tell
me whether the verdict survives.

Une réponse utile cite la dernière minute partielle, l'âge de la cotation et le faible nombre de mises à jour derrière une minute mince. Notez si le verdict résiste.

Étape 5 — Arbitrer l'agent avec du SQL déterministe

Exécutez ceci dans SQL Console de Cloud. La requête répond à l'Étape 2 sans agent ; sa première ligne est votre référence :

WITH per_minute AS
(
    SELECT
        token_id,
        minute,
        argMaxMerge(close) AS close_midpoint
    FROM polymarket.market_midpoints_1m
    WHERE minute >= now() - INTERVAL 30 MINUTE
      AND minute < toStartOfMinute(now())
    GROUP BY token_id, minute
)
SELECT
    m.question,
    m.outcome,
    p.token_id,
    round(argMax(p.close_midpoint, p.minute) * 100, 2) AS latest_percent,
    round(argMin(p.close_midpoint, p.minute) * 100, 2) AS oldest_percent,
    round(latest_percent - oldest_percent, 2) AS move_points,
    min(p.minute) AS window_start,
    max(p.minute) AS window_end
FROM per_minute AS p
INNER JOIN
(
    SELECT token_id, question, outcome
    FROM polymarket.markets FINAL
) AS m ON m.token_id = p.token_id
GROUP BY m.question, m.outcome, p.token_id
ORDER BY abs(move_points) DESC
LIMIT 5;

Les fenêtres diffèrent volontairement : celle-ci couvre les minutes complètes la plus ancienne et la plus récente, tandis que l'agent devait mesurer un pas de cinq minutes. Comparez token_id, le signe de move_points et l'amplitude, pas les décimales. Contrôlez ensuite ses chiffres avec Spread and freshness et Volume velocity, enregistrées au Module 06.

Étape 6 — Noter ce que l'agent a mal compris

Au moins une de ces erreurs apparaît généralement. Trouvez la vôtre dans la conversation :

  • sélectionner close ou high dans market_midpoints_1m sans fonction Merge, puis expliquer le résultat avec assurance ;
  • traiter la dernière minute encore partielle comme complète, ce qui exagère le dernier mouvement ;
  • présenter un token Yes et son token No comme deux mouvements indépendants ;
  • omettre FINAL sur polymarket.markets, si bien qu'un marché redécouvert se joint deux fois ;
  • appeler le point médian un prix négociable ou citer un mouvement sans son âge.

Si les chiffres correspondent exactement à l'arbitre, testez la minute partielle : demandez si la dernière minute était complète, puis comparez max(minute) dans polymarket.market_midpoints_1m à toStartOfMinute(now()). Des valeurs égales signifient qu'elle ne l'était pas ; un agent affirmant le contraire a dit quelque chose de faux sur les données en direct.

Terminé lorsque

  • le SQL de détection lit market_midpoints_1m via des fonctions Merge ;
  • son verdict cite spread, âge de cotation et volume, pas seulement le prix ;
  • la première ligne de l'arbitre concorde sur le token et le sens, ou vous expliquez l'écart ; et
  • vous avez écrit une erreur ou exagération de l'agent.

Suite : conclure et nettoyer.

Sur cette page

Suivre votre progression ?

Facultatif. Nous envoyons un lien par e-mail pour confirmer votre adresse ; la progression est enregistrée après son ouverture.

Utilisez votre adresse e-mail professionnelle, et non une adresse personnelle.

Le suivi de la progression exige aussi d’accepter les Conditions d’utilisation actuelles dans les Paramètres de confidentialité.

FR