📰 Newsletter 📋 Mes positions 📊 Performances ✅ Mes picks 📊 Vitrine 🔍 Analyser 📖 Aide ⚙ Aide technique 🔐 Admin

⚙ BOS-BOURSE — Aide technique

Architecture, données, processus, scoring. Réservé aux curieux qui ont un accÚs admin.

🔒 Accùs restreint

Cette page est rĂ©servĂ©e aux utilisateurs avec un rĂŽle admin. Si tu cherches le guide utilisateur, c'est ici : 📖 Aide.

Sommaire

  • đŸ—ïž Architecture
  • đŸ—„ïž DonnĂ©es & tables D1
  • ⏰ Processus planifiĂ©s (cron)
  • 📐 Scoring & classification
  • 🎯 Logique du verdict
  • 🔐 Authentification & rĂŽles
  • 🔌 API endpoints
  • đŸ–Œïž OCR Claude Vision
  • 🚀 DĂ©ploiement

đŸ—ïž Architecture

BOS-BOURSE tourne intégralement sur l'edge Cloudflare. Trois briques :

BriqueRĂŽleStack
PagesFront statique (HTML/CSS/JS)Cloudflare Pages, déploiement Git push
WorkerAPI + cron + chiffrementCloudflare Workers (V8 isolates)
D1Base SQLite distribuéeCloudflare D1 (SQLite-compatible)

Plus deux services tiers :

  • Yahoo Finance (API publique query1.finance.yahoo.com) — prix EOD, fondamentaux, recherche d'instruments
  • OpenFIGI / Bloomberg — rĂ©solution ISIN ↔ ticker (fallback quand Yahoo ne connaĂźt pas)
  • Anthropic Claude — OCR Vision via Haiku 4.5 (extraction de portefeuilles depuis image/PDF)

Flux principal

Browser → Cloudflare Pages (HTML/JS)
       → fetch() → Cloudflare Worker (API)
                    → D1 (queries SQL)
                    → Yahoo / OpenFIGI / Anthropic (selon endpoint)
                    → JSON response

đŸ—„ïž DonnĂ©es & tables D1

La base D1 contient plusieurs familles de tables :

Whitelist & sessions

  • allowed_users — emails autorisĂ©s, role (admin/reader), prĂ©fĂ©rences (profil de risque, cash min, broker default, dates d'ouverture PEA/PEA-PME), quotas Vision
  • login_history — historique des connexions (succĂšs/refus), source IP, user-agent
  • admin_audit_log — actions admin tracĂ©es (user add/revoke, instrument upsert/delete, OCR import, etc.)

Univers d'analyse

  • instruments — watchlist (ticker, ISIN, nom, type STOCK/ETF, devise, place, secteur, capi, Ă©ligibilitĂ©s PEA/PEA-PME)
  • instruments_prices — historique EOD (open/high/low/close/volume par ticker × date)
  • fundamentals_* — vues dĂ©rivĂ©es des fondamentaux (P/E, ROE, marge, dette, croissance) avec une vue fundamentals_latest consolidĂ©e
  • instruments_waiting — demandes user (tickers/ISIN cherchĂ©s mais absents de la watchlist), Ă  valider par l'admin

Skill & analyses

  • analyses — rĂ©sultat du skill BOS pour chaque ticker × date (verdict, score, triggers JSON, signals JSON, argumentation)
  • picks_executed — picks que l'utilisateur a rĂ©ellement passĂ©s (date d'exĂ©cution, qtĂ©, prix rĂ©el), pour le suivi de perf perso

Portefeuilles users

  • user_portfolios — positions chiffrĂ©es AES-256-GCM par utilisateur, avec clĂ© dĂ©rivĂ©e par email
  • user_cash — cash espĂšces par enveloppe (PEA, PEA-PME, CTO), chiffrĂ© idem
  • user_anthropic_keys — clĂ©s Anthropic stockĂ©es (chiffrĂ©es) pour la voie OCR clĂ© perso ou clĂ© admin partagĂ©e

Vitrine

  • showcase_portfolios — 9 portefeuilles auto-pilotĂ©s (nom, profil, devise, description)
  • showcase_holdings — composition courante de chaque portefeuille
  • showcase_history — valorisation historique par portefeuille (pour les courbes vs benchmark)

OCR

  • claude_vision_global_quota — compteur mensuel global d'appels Vision sur la clĂ© admin (clĂ© = mois ISO YYYY-MM)

⏰ Processus planifiĂ©s (cron)

Plusieurs jobs tournent sur des planifications définies dans wrangler.toml du worker :

JobFréquenceAction
Refresh prix EODQuotidien (~19h Paris)Fetch les closes du jour pour tous les instruments de la watchlist
Skill BOSQuotidien aprÚs refresh prixPour chaque instrument, calcule signaux + verdict, écrit dans analyses
NewsletterQuotidien aprÚs skillGénÚre le Top 3 + les picks par enveloppe
Refresh fondamentauxHebdomadaireMet Ă  jour P/E, ROE, marge, dette pour les actions
Snapshot vitrineQuotidienValorise chaque portefeuille auto-piloté et insÚre un snapshot dans showcase_history
Reset global quota VisionAutomatique (clef de table)Le compteur claude_vision_global_quota change de ligne au 1er de chaque mois (pas de job dédié)

📐 Scoring & classification

Classification automatique (enveloppe / risque / horizon)

Pour chaque instrument, BOS déduit déterministe-ment :

  • Enveloppe conseillĂ©e — fonction de l'Ă©ligibilitĂ© PEA / PEA-PME (selon place de cotation, capi, secteur) et de la capitalisation
  • Profil de risque — fonction de la volatilitĂ© annualisĂ©e + qualitĂ© score (issu des fondamentaux pour les actions, des frais + tracking error pour les ETF)
  • Horizon recommandĂ© — fonction de la volatilitĂ© + drawdown max + score qualitĂ©

Qualité score

Pour les actions, agrégat pondéré sur 5 axes : rentabilité (ROE, ROA), efficacité (marge nette), solidité (debt/equity, current ratio), croissance (CA, EPS YoY), valorisation (P/E, P/B). Pour les ETF : frais, écart de réplication, ancienneté, encours, place de cotation.

Indicateurs techniques utilisés

  • Moyennes mobiles 50 et 200 jours (tendance)
  • RSI 14 jours (momentum)
  • MACD (signal de retournement)
  • Performances 1m / 3m / 6m / 1y / 3y / 5y
  • VolatilitĂ© annualisĂ©e (Ă©cart-type des log-returns × √252)
  • Drawdown max sur la fenĂȘtre disponible

🎯 Logique du verdict

Le verdict est déterministe : aucune IA, aucun appel LLM. Il croise les signaux ci-dessus dans une logique de rÚgles. Niveaux :

  • RENFORCER — tendance positive (prix > MM50 et MM200) + momentum sain (RSI 50-70, MACD positif) + fondamentaux solides
  • CONSERVER — situation neutre ou lĂ©gĂšrement positive, pas de signal majeur
  • ALLÉGER — au moins un signal de dĂ©gradation : RSI > 75 (surachat), MACD baissier, prix sous MM50
  • SORTIR — plusieurs signaux dĂ©gradĂ©s : prix sous MM200 + RSI < 30 + momentum nĂ©gatif

Chaque verdict d'analyse est écrit dans analyses avec un payload JSON triggers (ce qui a déclenché le verdict) et signals (les valeurs détaillées). La page Analyser et le modal historique skill exploitent ces données pour expliquer l'évolution.

🔐 Authentification & rîles

Flow JWT BOS

  1. L'utilisateur clique « Se connecter avec Google »
  2. Google renvoie un ID token (JWT signé par Google)
  3. Le worker vérifie le token, lit l'email, regarde si l'email est dans allowed_users
  4. Si autorisé, le worker émet un JWT BOS (HS256 signé avec JWT_SECRET) avec { email, role, name, iat, exp }
  5. Le browser stocke ce JWT BOS dans localStorage (bos_jwt) et l'envoie en Authorization: Bearer ... sur chaque appel API
  6. Le worker valide le JWT Ă  chaque requĂȘte (signature + exp). Toute mutation passe par requireAuth(req, env, role)

RĂŽles

  • reader — peut lire les analyses, sa propre data, importer son portefeuille
  • admin — peut gĂ©rer la whitelist, valider les instruments, voir les logs, gĂ©rer Vision

Chiffrement données users

AES-256-GCM avec une clĂ© dĂ©rivĂ©e par SHA-256(ENCRYPTION_KEY + email). Chaque user a donc sa propre clĂ© de chiffrement effective, dĂ©rivĂ©e d'une master key serveur. ConsĂ©quence : mĂȘme si la D1 est exfiltrĂ©e, lire les positions nĂ©cessite l'ENCRYPTION_KEY (qui reste dans les secrets Workers).

🔌 API endpoints

Toutes les routes sont préfixées /api/ et exposées sur le worker. Quelques exemples :

Auth

  • POST /api/auth/google — Ă©change ID token Google contre JWT BOS
  • GET /api/auth/me — info user courant + prĂ©fĂ©rences + quota Vision
  • POST /api/auth/anthropic-key — stocke (chiffrĂ©) la clĂ© Anthropic perso ou admin

Portefeuille perso

  • GET /api/portfolio/positions — lire ses positions chiffrĂ©es
  • POST /api/portfolio/positions — upsert positions (chiffrement transparent)
  • POST /api/portfolio/ocr-import — extraction OCR via Vision

Skill & analyses

  • GET /api/analyses/:ticker?history=N — historique des verdicts skill + prix
  • GET /api/instruments/search?q=... — recherche cascade Yahoo + OpenFIGI
  • GET /api/fundamentals/:ticker — rĂ©cupĂ©ration directe des fondamentaux

Admin

  • GET /api/admin/audit-log
  • GET /api/admin/instruments-waiting + POST promote / DELETE reject
  • GET /api/admin/vision-quotas + POST /api/admin/users/:email/vision-grant

đŸ–Œïž OCR Claude Vision

Trois voies d'extraction :

  1. ClĂ© admin partagĂ©e — l'admin (par convention cyc.eric.57@gmail.com) stocke sa clĂ© Anthropic. Les autres users peuvent l'utiliser, limitĂ©s Ă  10 appels gratuits chacun. Quota mensuel global : 500 appels.
  2. ClĂ© perso — chaque user peut stocker sa propre clĂ©. IllimitĂ©, Ă  sa charge (~0,001 €/image).
  3. Tesseract.js — OCR client-side, CDN jsdelivr, gratuit illimitĂ©. Ne lit pas les PDF natifs.

ModĂšle

Claude Haiku 4.5 (claude-haiku-4-5-20251001). Choix : rapide (~3s/image), peu cher (~0,001 €/image), prĂ©cision excellente sur les tableaux de portefeuille de courtiers europĂ©ens et US.

Confidentialité images

Zéro stockage cÎté serveur. Le worker reçoit l'image en base64 dans le body POST, la passe à l'API Anthropic, et ne l'écrit nulle part (ni D1, ni R2, ni KV, ni log). L'audit log enregistre uniquement le NOMBRE d'images, l'enveloppe détectée, et le nombre de positions extraites.

Support PDF

Claude Vision Haiku 4.5 accepte les PDF natifs via le content type document et le header anthropic-beta: pdfs-2024-09-25. Tesseract.js refuse le PDF (auto-désactivé cÎté UI dÚs qu'un PDF est sélectionné).

🚀 DĂ©ploiement

Worker

cd Output/v8_modules/bos-api
npx wrangler deploy

Pages

cd Output/cf_pages_setup
git add . && git commit -m "..." && git push

Cloudflare Pages se synchronise automatiquement avec le repo Git en quelques secondes.

D1

Migrations SQL appliquĂ©es via npx wrangler d1 execute ou via la console Cloudflare Dashboard → D1. Les fichiers .sql historiques sont archivĂ©s dans Output/d1_setup/.

Pour la doc complÚte et détaillée (comptes Cloudflare/Anthropic, secrets, tables SQL avec CREATE TABLE complets, schedules cron précis, scripts de backup, scripts de monitoring), voir le PDF aide-technique-Eric.pdf dans le dossier Output/cf_pages_setup/ local. Ce PDF n'est pas hébergé en ligne car il contient des références à des comptes externes (sans mots de passe ni clés, qui restent dans le Keepass d'Eric).