Aller au contenu

Titouan Gardy-Lognon

Le moteur trie les annonces

Ligne de calcul

Travail nº 02 — moteur d'analyse de marché

Trouver l'objet sous-évalué, avant qu'il ne parte.

Le moteur lit une dizaine de places de marché européennes et américaines, reconnaît l'objet derrière le titre d'une annonce, calcule la marge nette réelle sur douze marchés — port, douane, commission comprises — et désigne le meilleur. Puis il affiche les trouvailles au fur et à mesure, parce que la moitié d'entre elles ne seront plus là dans une heure.

Essayer le moteur

Les annonces descendent le tapis ; à la ligne violette, le moteur tranche. Une sur douze s'allume, avec son net recalculé. Ce qu'on regarde ici n'est pas ce que l'outil trouve, c'est ce qu'il écarte.

Quatre annonces, et pour chacune ce que le moteur reconnaît, ce qu'il ne peut pas savoir, et le net recalculé sur six marchés. Montres et montants entièrement inventés ; l'enchaînement, lui, est le vrai.

En-tête du tableau de bord : 400 coups, 0 rentables, 400 affichés, 37 % encore en vente.
L'onglet « montres anciennes », tel qu'il s'affiche. 400 coups, 0 rentables, 400 affichés — l'outil montre les quatre cents lignes alors qu'il n'en calcule aucune comme rentable, et annonce lui-même qu'il « n'estime AUCUN prix ». Un des tris s'appelle ignorance.

Les annonces, les photos des vendeurs et le nom des places de marché sont volontairement hors cadre.

Le problème que « Direct » résout

Un balayage complet dure quarante minutes et, dans sa version naïve, ne montre rien avant la dernière seconde. Ce n'est pas un défaut de confort. Sur ce marché, 51 % des annonces sont déjà vendues au moment où on les regarde. Attendre quarante minutes pour découvrir une pièce rare, c'est le plus souvent la découvrir trop tard.

D'où le mode direct : le balayage tient un journal écrit au fil de l'eau, une ligne par opportunité dès qu'elle est vue, et le tableau de bord lit ce journal pendant qu'il se remplit. On regarde les trouvailles arriver au lieu d'attendre un rapport.

Pourquoi un journal de lignes JSON, et pas un tableur.

Un fichier de lignes s'écrit en mode ajout : on ne relit jamais, on ne réécrit jamais ce qui précède. Un lecteur peut donc l'ouvrir pendant qu'on écrit — chaque ligne est complète ou absente, jamais tronquée. Un tableur réécrit intégralement à chaque ajout donnerait un fichier corrompu une fois sur deux, et la corruption arriverait précisément quand on le consulte le plus : pendant le balayage.

La fois où l'outil s'est trompé, et ce que j'en ai fait

Un jour, l'outil a mesuré « zéro ligne rentable sur quarante » sur une niche, et j'ai failli la supprimer. La mesure était fausse, et la conclusion avec elle.

L'estimation de revente venait d'une table par marque. Sur un disque, une référence identifie un objet ; sur un vêtement, non. Deux pièces de la même marque valent quinze euros ou quatre cents selon l'impression, le tirage, la coupe, l'étiquette, une simple couture, l'année. Rien de tout cela ne figure dans le titre d'une annonce — donc rien de tout cela ne pouvait figurer dans l'estimation. Et comme le filtre « rentables seulement » s'appuyait sur ce chiffre inventé, il masquait les quarante lignes sur quarante. L'onglet paraissait vide alors qu'il était plein.

J'ai refait cet onglet pour qu'il transporte l'information au lieu de trancher : colonnes factuelles uniquement — huit photos par ligne, prix demandé, taille, état, source, date. Aucune colonne « marge ». Aucun filtre fondé sur une estimation. La galerie complète dans la fiche, dos et étiquette compris, parce que c'est là que se joue la valeur. Un seul filtre conservé : masquer ce qui est déjà vendu — parce que c'est un fait vérifié, pas une opinion du programme.

La règle que j'en ai tirée, et qui vaut pour tout le reste : quand l'outil ne peut pas savoir, il doit se taire et montrer, pas deviner et filtrer.

Un filtre qui se trompe ne se contente pas de donner une mauvaise réponse : il fait disparaître la question. C'est la panne la plus dangereuse d'un outil d'aide à la décision, parce qu'elle est silencieuse et qu'elle ressemble à un onglet vide.

La fois où il a eu raison contre moi

Le projet est parti d'une idée simple : acheter en Europe, revendre aux États-Unis. Elle avait l'air excellente. Chaque envoi transatlantique traîne douane et port incompressibles, de l'ordre de 25 $ par ligne, ce qui condamne mécaniquement tout objet dont la revente ne dépasse pas la soixantaine de dollars — c'est-à-dire l'immense majorité.

En comparant réellement tous les marchés plutôt que le seul que j'avais en tête, le moteur a montré que l'intra-européen — port de quatre à onze euros, aucune douane — pesait un ordre de grandeur de plus. J'ai réécrit le cadrage du projet à partir de ce constat. Il ne m'a pas fait gagner d'argent ; il m'a évité d'en perdre en poursuivant une idée à laquelle je tenais.

Langage
Python 3
bibliothèque standard seule
Moteur
16 niches
reconnaissance partagée
Balayage
8 étapes
~40 min, ou en direct
Journal
Append-only
jamais réécrit

La contrainte « zéro dépendance » est délibérée et notée comme non négociable dans la documentation du projet : elle permet de lancer le moteur sur n'importe quelle machine sans rien installer. C'est la même règle que je me suis donnée pour 10 Millions de Mines, pour les mêmes raisons.

Une question sur ce moteur ? Écrivez-moi — je réponds le jour même, du lundi au vendredi.