quant-buddy-view · Publication de tableaux de bord quantitatifs
Transformez les indicateurs explorés avec quant-buddy-skill en un tableau de bord web public et partageable. Ce skill ne gère ni les requêtes de marché ni l'exploration backtest (c'est le rôle de quant-buddy-skill). Il se concentre sur trois tâches :
- Enregistrer un package de formules (
formula_package) — Enregistrez un ensemble de formules + leurs modes de lecture sur le serveur pour obtenir unpackage_idet unesignature. Les données sont automatiquement recalculées côté serveur dès que les données sous-jacentes sont mises à jour. Les requêtes renvoient toujours les résultats les plus récents. - Générer le HTML du tableau de bord (
build_dashboard) — Décrivez avec une spécification quels indicateurs afficher et avec quels graphiques/tableaux. Compilez le tout en un HTML live qui récupère les données en temps réel (le squelette est autonome, les données sont chargées à l'ouverture de la page). - Publier et héberger (
static_page) — Téléchargez le HTML vers un stockage objet pour obtenir un lien public :https://pages.quantbuddy.cn/....
Quand utiliser ce skill vs quant-buddy-skill
- Exploration/requête unique ("Combien pourcent de hausse aujourd'hui pour Maotai ?", "Exécute un backtest de croisement de moyennes mobiles") → utilisez quant-buddy-skill.
- Vous voulez une page que vous pouvez consulter régulièrement, partager à d'autres, et dont les données se mettent à jour automatiquement → une fois l'exploration terminée, passez à quant-buddy-view.
Prérequis : Installation de quant-buddy-skill obligatoire
Ce skill est autonome à l'exécution (l'enregistrement, la génération et la publication ne nécessitent que la api_key du fichier config.json, pas le code de quant-buddy-skill).
Cependant, le flux normal d'utilisation comporte une exigence stricte : avant d'enregistrer un package de formules, chaque formule doit d'abord être exécutée avec succès dans quant-buddy-skill en utilisant runMultiFormulaBatchStream (voir la règle stricte ci-dessous). Par conséquent, sans quant-buddy-skill installé, vous ne pourrez pas valider correctement les formules.
Si quant-buddy-skill n'est pas encore installé, installez-le en suivant cet ordre de priorité :
-
Prioritaire : Installation via GitHub (
npx skills) — quant-buddy-skill et ce skill font partie du même dépôt GitHubpseudo-longinus/quant-buddy-skills:# Nouvelle installation (jamais installé auparavant) npx skills add pseudo-longinus/quant-buddy-skills -g --all # Déjà installé, simple mise à jour npx skills update pseudo-longinus/quant-buddy-skills -y # Vérifier l'emplacement / l'installation npx skills list -g --jsonSous Windows, si une erreur de lien symbolique /
EPERMsurvient, ajoutez--copyà la fin de la commande. Le chemin d'installation est généralement~/.agents/skills/quant-buddy-skill. -
Solution de repli : Téléchargez et décompressez manuellement l'archive zip (lorsque node/npx n'est pas disponible ou que le réseau est restreint) — Téléchargez le zip officiel de
quant-buddy-skill, décompressez-le et copiez son contenu dans le répertoirequant-buddy-skill/sous le répertoire des skills (décompressez d'abord dans un dossier temporaire ; s'il contient un sous-répertoirequant-buddy-skill/, prenez ce dernier ; conservez laapi_keyexistante dansconfig.json).quant-buddy-skillcontientscripts/self_update.pyqui prend en charge--url/--zip-path+--sha512+--versionpour une vérification et une extraction validées. Utilisez-le de préférence.
Structure de placement : Placez quant-buddy-skill et quant-buddy-view côte à côte au même niveau :
<répertoire des skills>/
quant-buddy-skill/ ← Exploration / validation des formules (runMultiFormulaBatchStream, confirmDataMulti)
quant-buddy-view/ ← Ce skill : enregistrement des packages de formules / génération de tableaux de bord / publication
Cette disposition côte à côte est recommandée : lorsque
formula_package import(migration d'anciens identifiants) ne trouve pas de chemin explicite, il se rabat sur le chemin relatif../quant-buddy-skill.
- Configuration : Configurez la
api_keyspécifique àquant-buddy-skill(indépendante de celle de ce skill). Une fois installé, vous pouvez y valider les formules, puis revenir à ce skill pour l'enregistrement (register).
Migration pour les anciens utilisateurs : Les packages de formules déjà enregistrés dans l'ancienne version de quant-buddy-skill n'ont pas besoin d'être réenregistrés — utilisez python scripts/formula_package.py import ... pour importer en une seule fois les identifiants dans ce skill et continuez à utiliser l'ancien package_id pour interroger les données (voir tools/formula_package.md dans « Migration des identifiants depuis l'ancien quant-buddy-skill »).
Point d'entrée (déterminez d'abord le type)
Règle de routage pour l'Agent : Si l'utilisateur mentionne marché de modèles / modèles officiels / modèles publics / modèles publiés → utilisez d'abord
scripts/static_page.py templates/templatepour lire les modèles publics en ligne ; téléchargez le HTML depuis l'download_urlretourné, remplacez le ticker, le texte et les identifiants du package de formules, puisuploadpour créer votre propre page. Si l'utilisateur demande un type de page spécifique sans mentionner un modèle public → consultez d'abord le répertoire localexamples/(solution de repli hors ligne et source de développement des modèles en ligne) ; si l'utilisateur veut partir d'un besoin jusqu'à un lien → consultezworkflows/; si l'utilisateur veut une page personnalisée complexe ou migrer un HTML existant → consultezguides/.
| Type | Nom d'affichage | Point d'entrée | Quand l'utiliser |
|---|---|---|---|
| Modèle de page | Fiche action | examples/single-stock/ | Page portrait pour un seul actif : résumé + cartes numériques (dernier cours, variation, 20j, 60j, PER, PBR, volume) + graphique de prix principal ; doit partir de spec.template.json |
| Modèle de page | Diagnostic de valorisation | examples/valuation-financial-profile/ | Page valorisation et données financières pour un seul actif : niveaux historiques PER/PBR/PCF, tendances financières, qualité des flux de trésorerie, décomposition de la variation de valorisation ; associé à page.template.html |
| Modèle de page | Tableau des anomalies des composants | examples/index-anomaly/ | Surveillance des anomalies des composants d'un indice/panier : tableau des anomalies + répartition hausse/baisse + tendance de l'indice ; associé à page.template.html, thème sombre, données via data-kernel |
| Modèle de page | Tableau de sélection multi-facteurs | examples/multi-factor-screener/ | Panier thématique + score multi-facteurs + TopN + backtest/rankIC + K-line + audit des formules ; rôles fixes RANK / BACKTEST / KLINE_*, le rendu de RANK est prioritaire en première page |
| Modèle de page | Bulletin quotidien matières premières | examples/commodity-daily/ | Bulletin quotidien des futures matières premières : contradictions haussières/baissières par secteur, anomalies du jour, sparkline des produits phares ; associé à page.template.html |
| Flux générique | Tableau de bord standard en temps réel | workflows/dashboard-end-to-end.md | L'utilisateur souhaite "obtenir un tableau de bord partageable / un lien" sans spécifier de modèle de page fixe |
| Guide de développement | Page personnalisée | guides/bespoke-page.md | Pages HTML/CSS/SVG personnalisées que build_dashboard ne peut pas produire, ou migration d'un HTML existant |
| Outil de migration | Coque partagée pour anciennes pages | tools/retrofit_share_shell.md | Un HTML déjà publié/généré doit supprimer l'ancien QR code, l'ancien en-tête et l'ancien pied de page, tout en conservant le même page_id pour la mise à jour |
Règle stricte : Si l'utilisateur demande "une page portrait d'une action/d'un indice, une fiche action, un portrait d'action, une page d'un seul actif", lisez d'abord
examples/single-stock/README.md, copiezexamples/single-stock/spec.template.jsoncomme point de départ pour la spec, en conservanttemplate: "single-stock". N'écrivez pas manuellement une vieille spec minimale "1 ligne de prix + 4 cartes numériques" ;build_dashboardla rejettera. Règle stricte : Si l'utilisateur demande "cette action est-elle chère / sa situation fondamentale s'améliore-t-elle / profil de valorisation et financier / niveaux historiques PER/PBR / tendances financières / qualité des flux de trésorerie" et souhaite une page de destination ou un lien public, lisez d'abordexamples/valuation-financial-profile/README.md, copiezexamples/valuation-financial-profile/page.template.htmlcomme point de départ, validez et enregistrez l'ensemble de formules requis par ce modèle ; ne revenez pas à une simple page de cartessingle-stock. Règle stricte : Si l'utilisateur demande "les anomalies des composants d'un indice / d'un panier d'actions, tableau des anomalies, classement à la manière d'un tableau dragon/tigre" (par exemple « Quelles actions du CSI 500 ont des anomalies aujourd'hui ? », « Surveillance des anomalies du CSI 300 », « Classement des hausses/baisses du SSE 50 »), lisez d'abordexamples/index-anomaly/README.md, copiezexamples/index-anomaly/page.template.htmlcomme point de départ, remplacez les placeholders__INDEX_*__, intégrezdata-kernel.js, puis publiez ; n'écrivez pas manuellement un HTML clair/générique hors sujet. Règle stricte : Si l'utilisateur demande un "panier thématique / actions concepts / panier sectoriel + score multi-facteurs / TopN / backtest / rankIC / K-line / audit des formules", lisez d'abordexamples/multi-factor-screener/README.md, copiezexamples/multi-factor-screener/page.template.htmlcomme point de départ ; les rôles du package de formules sont fixés àRANK/BACKTEST/KLINE_*;RANKdoit être rendu en priorité sur la première page,BACKTESTetKLINE_*peuvent être dégradés localement. Règle stricte : Lors de la réutilisation d'un modèle public, lespackage_id + signaturedans le HTML du modèle appartiennent à l'auteur original. Vous devez revalider les formules selon l'objectif de l'utilisateur actuel, enregistrer votre propre package de formules et remplacer les identifiants dans la page avant de publier. N'utilisez pas directement les identifiants originaux du modèle public comme source de données. Règle stricte : Lesubtitleet le "résumé de lecture" de la page portrait d'un seul actif ne doivent utiliser que les valeurs numériques correspondant aux résultats finaux (outputs) obtenus en temps réel lors de la construction parbuild_dashboard. Si le script retourne "le texte est incohérent avec les résultats de l'interrogation en temps réel", réécrivez le texte en fonction desfactsretournés avant de générer/télécharger ; n'utilisez pas d'anciens résultats de requête ou d'estimations manuelles. Règle stricte : Toutes les pages de destination doivent intégrer les composants communs deassets/share-shell/. Le modèle ne fournit que le contenu principal etgetPosterData(). L'en-tête, le pied de page, le bouton de rafraîchissement, la couche modale de l'affiche de partage, le lien de copie, le téléchargement PNG et l'affiche à en-tête/pied de page fixe sont tous fournis par le shell commun ; ne copiez pas ni ne modifiez manuellement d'anciens blocs de QR code, d'anciens boutons de rafraîchissement ou d'anciennes couches de partage dans un modèle individuel. Règle stricte : L'affiche de partage est générée par défaut par leposter.jscommun en prenant une capture d'écran du corps de la page. « Mieux vaut rien que mal fait ». Le modèle peut utiliserdata-qb-poster-targetpour marquer la zone de capture d'écran principale ;getPosterData()ne fournit que le titre/le résumé et une solution de repli structurée. Ne faites pas rédiger manuellement la maquette de l'affiche par l'Agent, et ne mettez pas tout le contenu de la page danssections. Règle stricte : Si l'utilisateur demande "modifier le HTML déjà généré / supprimer le QR code / supprimer l'en-tête et le pied de page actuels / adapter un en-tête et un pied de page fixes", utilisez d'abordscripts/retrofit_share_shell.py. Ne comptez pas sur de longues instructions pour que l'Agent supprime manuellement le DOM ; par défaut, conservez la zone hero principale de l'ancienne page, supprimez uniquement la carte QR et l'ancien pied de page, puis insérez directement l'en-tête et le pied de page communs en haut/bas dubody; générez d'abord une version migrée locale pour validation, puis utilisezupdate:truepour écraser le mêmepage_id.
-
Enregistrer un package de formules (
scripts/formula_package.py register)formulas: un ensemble de"nom_variable = expression"(reprenant les formules validées lors de l'exploration avec quant-buddy-skill).reads: la liste des sorties externes, chaque entrée déclarantoutput(nom de la sortie) +read_mode(mode de lecture).- En cas de succès, retourne un
package_id+signature, et sauvegarde automatiquement le tout dansoutput/formula_packages/<package_id>.json. - ⚠️ La
signaturen'est retournée en clair qu'une seule fois lors de l'enregistrement. Si le fichier d'identifiants local est perdu, elle est irrécupérable (vous pouvez utiliserrefreshpour la renouveler).
-
Générer le tableau de bord (
scripts/build_dashboard.py)- Écrivez une spécification :
title+panels[], chaque panel affichant uneoutputsous forme deline/bar/table/number/text/raw. - Si un modèle de page est concerné, copiez d'abord le
spec.template.jsonoupage.template.htmldu répertoire du modèle, puis remplacez les actifs, les dates, le texte d'interprétation et les modules optionnels. - La page récupère les données en temps réel (voir ci-dessous « Récupération des données : en temps réel ») ; la spec n'a pas besoin de champ
mode. - Le résultat est écrit par défaut dans
output/pages/<slug>.html; passez"upload": truepour générer et publier en une seule étape.
- Écrivez une spécification :
-
Publier / Gérer (
scripts/static_page.py)upload: Téléchargez le HTML → retournepage_id+urlpublique ; peut incluretitle(par défaut, prend le<title>) etdescription(description de la page, ≤ 1000 caractères, utilisée pour les listes/détails).update: Remplace le contenu d'une page déjà publiée, l'URL / le page_id reste inchangé (utilisez-le pour compléter/ajuster une page déjà partagée ; le visiteur voit le nouveau contenu après rafraîchissement, sans consommer de nouveau quota). Vous pouvez aussi modifier uniquement letitle/description(passez une chaîne vide""pour effacer ladescription, omettez-la pour conserver la valeur d'origine).download: Récupérez le HTML d'une page déjà publiée pour le modifier (authentification via url → téléchargement direct depuis l'OSS, ne consomme pas de bande passante serveur), puisupdatepour écraser.list/revoke: Lister / révoquer mes pages (limite de 200 pages actives, chaque page ≤ 2 Mo).thumbnail: Définir / remplacer une image de couverture purement décorative pour une page déjà publiée (transférez un PNG/JPG, ≤ 2 Mo). Utilisée uniquement pour l'aperçu<img>dans les listes/détails/murs de modèles, n'entre pas dans le HTML, n'affecte pas la récupération des données, ne consomme pas de quota de pages actives ; stockée dans OSS avec lepage_idcomme nom, toujours valide après conversion en modèle.upload/updatepeuvent inclurethumbnail_file; la couverture est automatiquement téléchargée après le succès du HTML ; en cas d'échec de la vignette, seul un avertissement (warning) est retourné, le HTML n'est pas annulé.templates/template: Parcourir / réutiliser les modèles publics —templatesliste les modèles (les utilisateurs normaux ne voient que les modèles publiéspublished),templateconsulte les détails d'un modèle pour obtenir sondownload_url, téléchargez directement le HTML depuis l'OSS, remplacez-le par vos propres actifs/texte/package de formules, puisuploadpour créer votre propre page.- Avant
upload/update, une vérification obligatoire du shell partagé public est effectuée ; si l'en-tête ou le pied de page public est manquant, ils sont automatiquement insérés et compilés ; la couleur du thème ne peut être modifiée que viatheme/ les variables--qb-shell-*; la publication est refusée s'il reste des placeholders ou des anciens QR codes. - Permissions / Responsabilités : Vos propres pages ne sont visibles que par vous par défaut ; les utilisateurs
is_testpeuvent accéder aux pages d'autres utilisateursis_testvia download / update / thumbnail, etlistavecscope=test_allpour voir toutes les pages des utilisateurs test (les pages des utilisateurs normaux sont toujoursFORBIDDEN). La consultation et la réutilisation des modèles publics sont ouvertes à tous (les utilisateurs normaux ne voient que les modèles publiéspublished). La soumission, la modification, la mise en ligne et hors ligne des modèles sont réservées aux utilisateursis_test; la conversion d'une page existante en modèle public est une action du back-office (growthX) — du côté de ce skill, nous ne faisons que « lire + réutiliser » les modèles, pas ces opérations d'écriture.
L'authentification repose uniquement sur la
api_keydu fichierconfig.json(pour les requêtes de récupération de données, la api_key n'est même pas nécessaire, seuls lepackage_idet lasignaturesont requis). Ce skill ne gère pas de sessions / task_id.
Récupération des données : en temps réel
Les tableaux de bord récupèrent les données en temps réel : le HTML contient package_id + signature. Lorsqu'un visiteur ouvre la page, elle appelle immédiatement queryFormulaPackage pour récupérer les dernières données et les afficher. Dès que les données sous-jacentes sont mises à jour, elles sont automatiquement recalculées. La page affiche les données les plus récentes, ce qui est l'objectif même de la conception des packages de formules. La spec n'a pas besoin de champ mode.
- La page est « vivante » : Les données ne sont pas intégrées dans le HTML ; elles sont récupérées en temps réel à l'exécution. Pendant la construction, les données ne sont récupérées qu'une seule fois pour un contrôle de qualité (santé des données + cohérence du texte pour un seul actif). Elles ne sont pas intégrées.
- Deux prérequis (tous deux satisfaits) : ① L'endpoint
queryFormulaPackageautorise CORS pour le domaine de la pagepages.quantbuddy.cn(l'endpoint HTTPS actuel autorise*) ; ② Lasignatureest publique avec la page (les requêtes de package de formules utilisent la signature comme jeton de capacité, ce qui permet par conception de l'intégrer dans la page). - ⚠️ Le protocole doit être cohérent : La page est publiée en
https://, l'endpointdansconfig.jsondoit également êtrehttps://, sinon le navigateur bloquera la récupération des données en raison d'un contenu mixte. L'endpoint actuel est déjàhttps://www.quantbuddy.cn/skill.
Règles strictes
- Passer les paramètres en chinois via @file ou variables d'environnement : Les lignes de commande PowerShell de Windows tronquent les caractères chinois encodés en GBK. Pour l'enregistrement des formules et l'écriture des specs, utilisez systématiquement
@params.json(UTF-8) ou les variables d'environnementFP_PARAMS/BD_PARAMS/SP_PARAMS. - Les formules doivent d'abord être validées avant d'être enregistrées (seuil strict) : Chaque ensemble de formules soumis pour enregistrement doit d'abord être exécuté avec succès dans quant-buddy-skill en utilisant
runMultiFormulaBatchStream(la syntaxe des formules est identique dans les deux, vous pouvez les valider telles quelles). L'enregistrement (register) n'est autorisé qu'en cas de succès. N'inventez pas d'expressions non validées, et n'essayez pas d'"enregistrer d'abord, on verra après" — la vérification côté serveur lors de l'enregistrement n'est qu'un filet de sécurité, elle ne remplace pas cette étape. - Nettoyez également les paramètres de validation : Lors de l'appel à
runMultiFormulaBatchStream, leuser_querydoit refléter la demande actuelle de l'utilisateur et l'actif actuel. Sitask_idest passé, il doit correspondre à une nouvelle tâche. Lorsque vous copiez un exemple, ne vous contentez pas de remplacer lesformulas; ne laissez pas d'anciensuser_querycomme "factsheet de Kweichow Moutai", sinon l'audit et la relecture seront pollués. - La signature est un identifiant : Ne l'imprimez pas dans une conversation destinée à l'utilisateur final ; le tableau de bord l'écrit dans le HTML public pour l'interrogation en temps réel. Assurez-vous que cela est acceptable avant la publication.
- En cas d'échec, expliquez clairement : Lorsqu'un script retourne
code != 0, répétez à l'utilisateur « l'étape (nom de la commande) qui a échoué + un résumé de l'erreur ». Ne terminez pas par un écran blanc ou un simple journal.
Aperçu des outils
Convention de paramètres : Tous les scripts acceptent une chaîne JSON comme paramètre positionnel (ou via
@params.json/ variables d'environnement), par exemplelist '{"scope":"test_all"}'. La ligne de commande accepte également la notation intuitive--scope test_all/--key=value(uniquement pour les paramètres simples ; les structures complexes comme les formules ou les specs doivent toujours utiliser@file/variables d'environnement pour éviter la troncature GBK).
| Script | Commande | Rôle | Documentation |
|---|---|---|---|
scripts/formula_package.py | register / query / list / revoke / refresh | Package de formules : enregistrer la capacité d'interrogation, interroger en flux avec les identifiants du package | tools/formula_package.md |
scripts/build_dashboard.py | (commande unique) | spec → HTML de tableau de bord live avec récupération en temps réel | tools/build_dashboard.md |
scripts/compile_bespoke_page.py | (commande unique) | 【Script de traitement shell】 Modèle bespoke → HTML autonome intégrant le shell partagé commun / logo / qr-mini / data-kernel | guides/share-shell.md |
scripts/retrofit_share_shell.py | (commande unique) | 【Script de traitement shell】 Ancien HTML / page déjà publiée → supprimer l'ancien QR code / l'ancien en-tête / l'ancien pied de page, intégrer le shell partagé commun (assets/share-shell/), peut effectuer un update avec le même lien | tools/retrofit_share_shell.md |
scripts/static_page.py | upload / update / download / list / revoke / thumbnail / templates / template | Publier/remplacer/télécharger/gérer des pages statiques, obtenir un lien public (update remplace le contenu sans changer le lien ; download récupère le HTML pour le modifier ; thumbnail définit une couverture d'affichage ; templates/template parcourent/réutilisent les modèles publics ; is_test peut interagir entre utilisateurs) | tools/static_page.md |
scripts/verify_page.mjs | (commande unique) | Validation des pages avant/après publication : fenêtres 1440px, 390px, 320px, h1, placeholders, débordement horizontal, erreurs console critiques | — |
scripts/render_cover.py | (appelé par build_dashboard) | Rastérisation et composition de couverture de secours : capture_page_cover utilise Edge/Chrome sans tête du système pour capturer la "page en mode couverture" en PNG pleine page ; pour la composition de couverture (image pleine nue/affiche de marque), trois niveaux de secours : navigateur → Python pur (cairosvg/svglib) → SVG. Multi-plateforme, aucune dépendance forte, n'affecte pas la publication HTML | — |
scripts/render_existing_page_thumbnail.py | (commande unique) | Ajouter une couverture à un HTML déjà publié / un modèle public : téléchargez ou lisez le HTML → analysez les identifiants du package de formules intégrés → récupérez d'abord les véritables outputs et remplacez temporairement QB.query → capturez un PNG 1200×675 avec Edge/Chrome du système ; peut inclure upload:true pour définir directement thumbnail_url | tools/static_page.md |
assets/data-kernel.js | (noyau frontal, pas un script) | Noyau frontal commun pour les pages bespoke faites à la main : « récupération + nettoyage + tolérance aux pannes » ; intégré dans la balise <script> de la page | guides/bespoke-page.md |
assets/share-shell/ | (composants communs) | En-tête, pied de page, bouton de rafraîchissement, popup d'affiche de partage, canvas d'affiche, copie de lien et comportement de copie/téléchargement communs à toutes les pages de destination | guides/share-shell.md |
examples/valuation-financial-profile/page.template.html | (modèle de référence hors ligne, pas un script) | Diagnostic de valorisation d'une action individuelle : niveaux de valorisation, tendances financières, décomposition de l'équilibre de valorisation | examples/valuation-financial-profile/README.md |
examples/index-anomaly/page.template.html | (modèle de référence hors ligne, pas un script) | Tableau des anomalies des composants : tableau des anomalies, répartition hausse/baisse, sparkline de l'indice | examples/index-anomaly/README.md |
examples/commodity-daily/page.template.html | (modèle de référence hors ligne, pas un script) | Bulletin quotidien matières premières : direction haussière/baissière dominante, tableau des anomalies, barres sectorielles, sparkline | examples/commodity-daily/README.md |
Deux voies de production : Pour les tableaux de bord standards, utilisez
build_dashboard(voie rapide déclarative). Pour les pages design nécessitant une mise en page/SVG personnalisée, créez le HTML à la main, en utilisant systématiquement le noyau communassets/data-kernel.js(QB.querypour la récupération,QB.series/lastValue/topValuespour l'extraction et le nettoyage). N'écrivez plus defetch/extraction personnalisés pour chaque page, et évitez les pièges classiques du "faux 0 / trou". Voir guides/bespoke-page.md. Avant la publication, utilisezscripts/verify_page.mjs <html_file>pour vérifier le rendu sur desktop et mobile (390px/320px), en vous assurant qu'il n'y a pas de résidusQB_SHARED_/replace_with_signature/pkg_replace, qu'il y a un<h1>, pas de débordement horizontal critique, et pas d'erreur de script de récupération de données.
Configuration
config.json : Renseignez la api_key (obtenez-la depuis https://www.quantbuddy.cn/login), ou définissez la variable d'environnement QUANT_BUDDY_API_KEY. Vous pouvez créer un fichier config.local.json pour écraser endpoint / api_key (non versionné). Les scripts formula_package.py, build_dashboard.py, et static_page.py partagent le même endpoint.