Léonard Noth
ENFRDE
← projets

SAFE

Lire l'actualité financière trois questions à la fois

L'actualité financière, lue phrase par phrase : de quelle entreprise on parle, quand l'événement a lieu, et ce qu'il évoque. Trois questions séparées.

Rôle
Travail de master, auteur unique
Périmètre
Protocole de recherche · Génération des données · Entraînement des modèles · Services backend · Interface
Construit avec
Python, PyTorch, BERT, scikit-learn, spaCy, SUTime, Flask, Vue 3, Docker, GPT-4
Équipe
Seul
Calendrier
Travail de master, soutenu en 2024, noté 6/6
Résultat
Noté 6 sur 6. Trois questions distinctes traitées pour chaque fragment de phrase, agrégées par entreprise et par fenêtre temporelle, avec des paires d'émotions nommées au lieu d'un vainqueur unique imposé.

Le problème

Les outils d'analyse de sentiment financier existants vous disent qu'un titre est négatif. Ils disent rarement négatif pour qui, ni si la chose décrite a déjà eu lieu. Un même article peut être optimiste sur une entreprise et sombre sur une autre, et mêler un événement de l'an dernier à une prévision pour le trimestre prochain. Ramener tout ça à un score unique, c'est perdre l'essentiel du signal.

Mon rôle

Travail de master, auteur unique, supervisé par la Dre Sandy Ingram. Tout, de l'outillage de génération des jeux de données aux six services et à l'interface.

Lire en
L'essentiel en deux minutes

Impact

99,6% de précision (validation)
Classifieur temporel
98,8% de précision (validation)
Classifieur de sentiment
96% sur 50 échantillons annotés à la main
Segmentation de phrases
6 501 échantillons étiquetés
Corpus généré
6 / 6
Note

L'architecture du système

  1. Générer le jeu de données

    Aucun jeu de données public n'existait pour la temporalité au niveau de la phrase dans le domaine financier : le premier livrable est donc un outil qui en fabrique un.

    • Un fichier TOML décrit les classes, le domaine et une poignée de phrases d'amorce écrites à la main
    • GPT-4 génère et augmente à partir de là : 2 501 lignes temporelles sur cinq classes, 4 000 lignes de sentiment sur huit
  2. Prouver que les classes sont séparables

    Avant tout entraînement, chaque échantillon est encodé par trois encodeurs indépendants et les classes sont testées pour leur séparation statistique.

    • C'est cette étape qui a repéré le recouvrement de la peur et de la tristesse sous un encodeur
    • Une faiblesse qu'il vaut mieux connaître avant l'entraînement, pas après
  3. Segmenter et rattacher aux entreprises

    Un article est découpé en phrases puis en fragments de la taille d'une proposition, et chaque fragment est rattaché aux entreprises qu'il mentionne réellement.

    • 96% d'accord avec une segmentation à la main sur un banc d'essai de 50 phrases
  4. Deux questions en parallèle

    Chaque fragment part vers deux services en parallèle : quand cela se passe-t-il, et qu'est-ce que cela évoque.

    • Temporalité : un étiqueteur à base de règles traite les dates explicites, un BERT affiné ne prend le relais qu'en l'absence de toute expression de date
    • Émotion : les huit émotions primaires de la roue de Plutchik plutôt que positif/négatif
  5. Agréger et nommer la paire

    Les résultats sont comptés par entreprise et par fenêtre temporelle, et quand les deux émotions de tête sont proches, le système annonce la paire nommée qu'elles forment.

    • Anticipation plus joie donne optimisme, et la règle de composition vient de la théorie, pas de moi
    • Les huit émotions primaires se composent en dyades nommées au lieu d'être prédites directement
Services de la plateforme
  • Six services Docker

    Segmentation, rattachement des entités, temporalité, sentiment, le décideur et la CLI de jeux de données. Séparés parce que leurs dépendances entrent réellement en conflit

  • SUTime sur une JVM

    Normalisation des dates à base de règles : demande Java, ce qui explique en partie son conteneur dédié

  • BERT affiné ×2

    Un modèle pour la temporalité, un pour l'émotion, chacun entraîné sur le corpus généré

  • spaCy

    Découpage en phrases, étiquetage morphosyntaxique, et le modèle d'entités sur mesure qui rattache les fragments aux tickers

  • Le décideur

    Le point d'entrée unique auquel parle l'interface : il agrège et compose les dyades

  • SPA Vue

    Soumettre un article, lire l'analyse par entreprise et par fenêtre temporelle

Décisions clés

Prédire huit émotions, en composer vingt-sept

plutôt que · Positif / négatif / neutre, ou prédire directement toutes les émotions composées

Un sentiment ternaire ne distingue pas la peur de la colère, alors que le marché ne les traite pas de la même façon. Prédire directement chaque émotion composée, c'est beaucoup plus de classes et une performance moindre sur chacune. Entraîner sur les huit primaires et composer les paires ensuite garde un faible nombre de classes et rend la règle de composition défendable : elle vient de Plutchik, pas de moi.

Des règles et un modèle, chacun à ce qu'il sait faire

plutôt que · Un seul modèle pour toutes les expressions temporelles

Un jeu de poids figé ne peut pas faire de l'arithmétique de calendrier par rapport à un aujourd'hui qui bouge : 2023 est récent en 2024 et lointain en 2030. Les dates explicites vont donc à un étiqueteur à base de règles, et le modèle ne traite que le langage implicite. Les deux moitiés ne se recouvrent pas par construction : les données d'entraînement générées avaient pour consigne explicite de ne jamais mentionner de date précise.

Les frontières de classes comme configuration

plutôt que · Laisser le modèle décider de ce que veut dire « récent »

Le présent d'un day trader se compte en heures, celui d'une caisse de pension en trimestres. Si ces seuils vivent dans les poids, servir les deux publics impose de réétiqueter et de réentraîner. Dans un fichier de configuration, c'est une ligne à changer. C'est la décision que je défendrais le plus fermement.

Construire l'outil à jeux de données, pas seulement le jeu de données

plutôt que · Un script de génération jetable

Tous les corpus existants avaient la mauvaise granularité, le mauvais domaine, ou n'étaient pas publics. Rendre le générateur générique, piloté par une spécification TOML, a permis au même outil de produire les deux jeux de données et de produire le suivant. L'étape de validation y est intégrée plutôt que rajoutée.

En pratique

La vue d'analyse : par entreprise, par fenêtre temporelle, avec les dyades d'émotions
La vue d'analyse : par entreprise, par fenêtre temporelle, avec les dyades d'émotions
Soumission d'un article pour analyse
Soumission d'un article pour analyse
Le poster du mémoire
Le poster du mémoire

Un outil classique de NLP financier vous dit qu'un titre est « négatif ». Il dit rarement négatif pour qui, ni si la chose décrite a déjà eu lieu. SAFE découpe un article en segments infra-phrastiques, détecte les tickers mentionnés, puis classe chaque segment deux fois : sur un axe temporel à cinq classes (passé lointain à futur lointain) et sur les huit émotions primaires de la roue de Plutchik. Les résultats sont agrégés par entreprise et par fenêtre temporelle, et quand deux émotions ressortent au coude à coude, le système annonce la dyade nommée qu'elles forment (anticipation plus joie donne optimisme) au lieu de désigner un vainqueur.

La temporalité est volontairement hybride : SUTime de Stanford traite les dates explicites avec la précision des règles, et un BERT affiné ne prend le relais qu'en l'absence de toute expression de date. Les frontières entre classes relèvent de la configuration, pas des données d'entraînement. Ce qui compte comme « présent » peut changer sans toucher au modèle.

Aucun jeu de données n'existait pour l'une ou l'autre tâche : un second livrable est donc une CLI qui génère et augmente des données étiquetées avec GPT-4, à partir d'une spécification TOML et d'une poignée de phrases d'amorce écrites à la main. Avant tout entraînement, chaque jeu généré est validé : chaque échantillon est encodé par trois encodeurs indépendants et des tests t appariés vérifient que les classes sont réellement séparables. C'est cette passe qui a révélé le recouvrement de la peur et de la tristesse sous un encodeur, une faiblesse qu'il vaut mieux connaître avant qu'après.

La limite, énoncée honnêtement dans le mémoire lui-même : les précisions rapportées sont des chiffres de validation sur des données générées par GPT-4, sans jeu de test indépendant. Elles mesurent l'ajustement à une distribution synthétique, pas la performance sur de vraies dépêches. L'étape de NER, elle, ne couvre que les valeurs du NASDAQ.

Ce que j'en retiens

  • Ce que j'ai construit de plus utile n'est pas un modèle, c'est ce qui m'a permis d'avoir un jeu de données tout court.
  • Décider ce qu'un modèle ne doit pas apprendre compte autant que décider ce qu'il doit apprendre. Les dates explicites ont été délibérément tenues à l'écart du réseau : c'est de l'arithmétique par rapport à une référence mobile, et des poids ne savent pas retenir ça.
  • Prédire huit choses correctement et en composer vingt-sept vaut mieux que d'en prédire vingt-sept mal.
  • En relisant ma propre validation avec un œil neuf, le test de séparabilité est plus étroit qu'il n'y paraît : il compare la compacité de chaque classe plutôt que la distance entre deux classes. Il a tout de même repéré un vrai recouvrement entre la peur et la tristesse, ce pour quoi j'en avais besoin, mais je le construirais autrement aujourd'hui.

Ce que ça ne fait pas

  • Les précisions rapportées sont des scores de validation sur des données générées par le modèle qui a aussi produit le jeu d'entraînement. Elles mesurent l'ajustement à une distribution synthétique, pas la performance sur de vraies dépêches de marché.
  • Un article de presse n'est pas objectif. Qu'un article annonce une période sombre ne la rend pas sombre. Le système mesure la couverture médiatique, pas la vérité.
  • La reconnaissance d'entités couvre les valeurs du NASDAQ, et les entreprises associées à un ticker changent sans cesse : rester à jour supposerait de réétiqueter en continu.
  • Il ne donne délibérément aucun conseil financier. Je ne suis pas conseiller financier, et le pas qui mène du sentiment à une position, c'est exactement là que ça commencerait.