đïž Architecture
BOS-BOURSE tourne intégralement sur l'edge Cloudflare. Trois briques :
| Brique | RĂŽle | Stack |
|---|---|---|
| Pages | Front statique (HTML/CSS/JS) | Cloudflare Pages, déploiement Git push |
| Worker | API + cron + chiffrement | Cloudflare Workers (V8 isolates) |
| D1 | Base SQLite distribuée | Cloudflare 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 Visionlogin_historyâ historique des connexions (succĂšs/refus), source IP, user-agentadmin_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 vuefundamentals_latestconsolidĂ©einstruments_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 emailuser_cashâ cash espĂšces par enveloppe (PEA, PEA-PME, CTO), chiffrĂ© idemuser_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 portefeuilleshowcase_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 :
| Job | Fréquence | Action |
|---|---|---|
| Refresh prix EOD | Quotidien (~19h Paris) | Fetch les closes du jour pour tous les instruments de la watchlist |
| Skill BOS | Quotidien aprÚs refresh prix | Pour chaque instrument, calcule signaux + verdict, écrit dans analyses |
| Newsletter | Quotidien aprÚs skill | GénÚre le Top 3 + les picks par enveloppe |
| Refresh fondamentaux | Hebdomadaire | Met Ă jour P/E, ROE, marge, dette pour les actions |
| Snapshot vitrine | Quotidien | Valorise chaque portefeuille auto-piloté et insÚre un snapshot dans showcase_history |
| Reset global quota Vision | Automatique (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
- L'utilisateur clique « Se connecter avec Google »
- Google renvoie un ID token (JWT signé par Google)
- Le worker vérifie le token, lit l'email, regarde si l'email est dans
allowed_users - Si autorisé, le worker émet un JWT BOS (HS256 signé avec
JWT_SECRET) avec{ email, role, name, iat, exp } - Le browser stocke ce JWT BOS dans
localStorage(bos_jwt) et l'envoie enAuthorization: Bearer ...sur chaque appel API - 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 BOSGET /api/auth/meâ info user courant + prĂ©fĂ©rences + quota VisionPOST /api/auth/anthropic-keyâ stocke (chiffrĂ©) la clĂ© Anthropic perso ou admin
Portefeuille perso
GET /api/portfolio/positionsâ lire ses positions chiffrĂ©esPOST /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 + prixGET /api/instruments/search?q=...â recherche cascade Yahoo + OpenFIGIGET /api/fundamentals/:tickerâ rĂ©cupĂ©ration directe des fondamentaux
Admin
GET /api/admin/audit-logGET /api/admin/instruments-waiting+ POST promote / DELETE rejectGET /api/admin/vision-quotas+ POST/api/admin/users/:email/vision-grant
đŒïž OCR Claude Vision
Trois voies d'extraction :
- 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. - ClĂ© perso â chaque user peut stocker sa propre clĂ©. IllimitĂ©, Ă sa charge (~0,001 âŹ/image).
- 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/.
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).