Skip to content

Séances qui n'ont pas eu lieu : l'accueil ne tombe plus à zéro, l'archive en est purgée - #16

Merged
blakro merged 1 commit into
mainfrom
claude/happy-edison-d5k0g7
Nov 4, 2026
Merged

blakro merged 1 commit into
mainfrom
claude/happy-edison-d5k0g7

Conversation

@blakro

@blakro blakro commented Nov 4, 2026

Copy link
Copy Markdown
Owner

Le problème signalé

Le 04/11/2026 vers 9 h 30, « 🔄 Actualiser » mettait l'onglet Aujourd'hui à zéro : 0 hausse, 0 baisse, 48 valeurs stables, 0 FCFA échangé. Avant les premiers échanges, brvm.org porte déjà la date du jour, avec les cours de la veille et des volumes nuls, et l'app prenait cette page pour la séance du jour. Reproduit à l'identique ; ce n'est pas lié au fractionnement.

Ce que la recherche de la cause a révélé

L'archive portait 103 séances qui n'ont pas eu lieu, toutes entrées par l'historique sikafinance (rapatriement du 19/09), qu'aucun contrôle ne filtrait :

  • 102 séances recopiées : un jour de fermeture, la source republie la veille sous la date du jour, cours et quantités au titre près. De 4 à 14 par an depuis 2015, toutes sur des jours fériés : 1er janvier, lundi de Pâques, 1er mai, Ascension, Pentecôte, 7 et 15 août, 1er et 15 novembre, Noël, Korité, Tabaski, Maouloud ;
  • 1 séance sans aucun échange : le 07/11/2025, avec des cours à plat.

Comptées comme des séances, elles ajoutaient une dizaine de jours immobiles par an : volatilité écrasée, liquidité dupliquée, horizons de prévision décalés.

Ce qui change

  • qualite.seances_republiees retient une séance si au moins 75 % de ses valeurs échangées reprennent le volume et le cours de leur séance précédente, ou si aucune valeur n'est échangée. Le seuil se lit sur l'archive, coupée en deux sans ambiguïté : les vraies séances plafonnent à 56 % (la source répète parfois la ligne d'un titre non échangé), les copies vont de 76 à 100 %.
  • brvm qualite les signale (code de sortie 1, ce qui met au rouge un rapatriement qui les réintroduirait) ; --retirer les efface, comme les séances fantômes.
  • data/cours.csv : 3 925 lignes retirées, soit les 103 séances plus la séance fantôme ONTBF du 24/12/2015, que sa copie du 25 masquait au contrôle existant. L'archive passe de 3 067 à 2 964 séances et ne porte plus aucune anomalie connue.
  • L'app écarte une page lue en direct qui n'est pas une vraie séance, garde la dernière séance close et dit pourquoi (« La séance du … n'a pas encore commencé » / « Pas de séance le … »).
  • ingerer_jour refuse une telle page.
  • versement.yml met en quarantaine la séance sans aucun échange, et passe de 90 % à 75 % pour les séances recopiées : Noël 2017 et 2018, recopiés à 81-87 %, passaient sous l'ancien seuil.

Vérifications

  • pytest : 381 passés, dont l'accueil avant l'ouverture et un jour de fermeture (test de l'app), le refus à l'ingestion, et un test qui échoue si l'archive versionnée porte de nouveau une telle séance.
  • Le script de versement, rejoué sur une copie de l'archive : la vraie séance est versée, la vide et la recopiée sont écartées, et un incrément mixte ne garde que la bonne.
  • Reste de l'archive contrôlé : pas de doublon, pas de cours nul, OHLC cohérents, pas de séance le week-end, référentiels cohérents ; les trois fractionnements sont toujours reconnus.

Les chiffres cités dans docs/technique.md (IC, backtests) ont été calculés avant ce nettoyage et n'ont pas été recalculés.


Generated by Claude Code

…hive en est purgée

« Actualiser » avant l'ouverture remplaçait la dernière séance par la page
de brvm.org, déjà datée du jour mais sans aucun échange : l'accueil
affichait 0 hausse, 0 baisse, tout stable, 0 FCFA (04/11/2026, 9 h 30).

En cherchant la cause, l'archive s'est révélée porter 102 séances
recopiées — un jour de fermeture, sikafinance republie la veille, cours
et quantités au titre près : 1er janvier, Pâques, 1er mai, 7 et 15 août,
Noël, Korité, Tabaski… — et une séance sans aucun échange (07/11/2025),
toutes entrées par l'historique, qu'aucun contrôle ne filtrait. Elles
ajoutaient une dizaine de jours immobiles par an à la volatilité, à la
liquidité et aux horizons de prévision.

- `qualite.seances_republiees` : au moins 75 % des valeurs échangées
  reprennent volume ET cours de leur séance précédente, ou aucune valeur
  échangée. Seuil lu sur l'archive : les vraies séances plafonnent à 56 %,
  les copies vont de 76 à 100 %.
- `brvm qualite` les signale (code 1) et `--retirer` les efface ; 3 924
  lignes retirées, plus la séance fantôme ONTBF du 24/12/2015 que la copie
  du 25 masquait. L'archive ne porte plus aucune anomalie connue.
- L'app écarte une page lue en direct qui n'est pas une vraie séance, garde
  la dernière séance close et dit pourquoi.
- `ingerer_jour` refuse une telle page ; `versement.yml` met en quarantaine
  la séance sans échange et passe au seuil de 75 % (Noël 2017 et 2018,
  recopiés à 81-87 %, passaient sous l'ancien 90 %).

Tests : 381 passés, dont le scénario de l'accueil avant l'ouverture et un
jour de fermeture ; le script de versement rejoué sur une copie de
l'archive verse la vraie séance et écarte la vide et la recopiée.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014G9XrQEMSrJM6BXHKtfken
@blakro
blakro merged commit e6ad0f2 into main Nov 4, 2026
2 checks passed
@blakro
blakro deleted the claude/happy-edison-d5k0g7 branch November 4, 2026 10:22
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants