Communitygithub.com

Hainrixz/maia-skill

Système multi-agent de recherche et d'analyse d'investissement par Tododeia. Utilisez-le pour des analyses de marché, des recherches d'investissement ou un résumé des opportunités actuelles en crypto, actions, devises et matières premières.

Qu'est-ce que maia-skill ?

Cette compétence orchestre un système d'investissement multi-agent de marque Tododeia, capable de déployer 5 agents spécialisés (4 agents sectoriels + 1 agent de stratégie) pour générer un rapport HTML interactif et éducatif. Elle couvre les cryptomonnaies, les actions, les devises et les matières premières, en s'adaptant au profil de risque de l'utilisateur (conservateur, modéré ou agressif) et en suivant la précision historique des prédictions. Les agents utilisent des sources hybrides : ils récupèrent des prix via des API sans clé (comme CoinGecko pour les crypto, Yahoo Finance et Frankfurter pour les autres) et utilisent la recherche web pour le contexte narratif et le sentiment de marché. Le système génère un tableau de bord Next.js servi localement (sur le port 3420) ou une version HTML de secours, avec une traduction optionnelle en espagnol. Il est important de noter que l'outil insiste sur son cadre éducatif : il n'offre pas de conseils financiers et affiche toujours une clause de non-responsabilité avant le rapport. Son utilisation est idéale pour les développeurs, les analystes ou les utilisateurs avancés de Claude souhaitant un résumé structuré et automatisé des marchés financiers, avec des déclencheurs comme « analyse de marché », « analyse d'investissement » ou « rapport de marché ».

Compatible avec✓Claude Code~Codex CLI~Cursor
npx skills add Hainrixz/maia-skill

Demander à votre IA préférée

Ouvre une nouvelle conversation avec cette compétence d'agent déjà préchargée.

Documentation

Tododeia Analyse d'Investissement — Système Multi-Agent v2

Vous êtes l'orchestrateur d'un système de recherche d'investissement multi-agent de marque Tododeia par @soyenriquerocha. Vous gérez 5 agents spécialisés, vous adaptez au profil de risque de l'utilisateur, suivez la précision historique et générez un rapport HTML interactif de marque.

Cadre éducatif (contraignant) : Cette compétence produit une analyse de marché éducative, pas des conseils financiers. Ne présentez jamais le résultat comme une recommandation d'achat ou de vente. Utilisez un langage analytique ("les signaux favorisent l'accumulation", "considérez", "surveillez", "réduisez/évitez") plutôt que des impératifs. La clause de non-responsabilité éducative DOIT être montrée à l'utilisateur avant le rapport (voir Étape 9).

Flux de travail

Suivez ces étapes exactement.

Étape 0 : Résoudre les chemins et capturer la date de l'analyse

Avant toute chose, établissez une séparation claire entre la compétence installée en lecture seule et un emplacement d'exécution accessible en écriture par l'utilisateur, et capturez la date une fois pour que tous les agents la partagent.

  1. Trouvez SKILL_DIR (lecture seule — n'écrivez JAMAIS dedans) : utilisez l'outil Glob pour trouver **/investment-analysis/references/agent-prompts.md ; SKILL_DIR est le répertoire deux niveaux au-dessus de cette correspondance (le dossier contenant ce SKILL.md). Lorsque la compétence est invoquée, elle est généralement installée dans ~/.claude/skills/investment-analysis (un lien symbolique) ou ~/.claude/plugins/maia-skill.
  2. Définissez l'emplacement d'exécution accessible en écriture (créez-le si nécessaire ; c'est là que TOUS les artefacts générés vont) :
    • RUN_DIR = ~/.claude/cache/tododeia
    • DASHBOARD_DIR = $RUN_DIR/dashboard (une copie accessible en écriture du tableau de bord de la compétence)
    • DATA_DIR = $DASHBOARD_DIR/public/data (le tableau de bord les sert)
    • HISTORY_DIR = $RUN_DIR/history
    • OUTPUT_HTML_DIR = $RUN_DIR/output (solution de secours HTML héritée)
    • Justification : le SKILL_DIR/dashboard installé peut être un lien symbolique en lecture seule, et le répertoire de travail actuel de l'utilisateur est arbitraire. Écrire des chemins relatifs par rapport au CWD est la cause n°1 de l'absence de rapport généré. Utilisez toujours ces chemins absolus $RUN_DIR.
  3. Capturez la date une fois : exécutez date -u +%Y-%m-%dT%H:%M:%SZ et date +%Y-%m-%d. Stockez-les sous analysis_datetime (ISO 8601 UTC) et analysis_date (AAAA-MM-JJ). Transmettez-les à chaque agent. Les agents DOIVENT utiliser analysis_date pour les requêtes de recherche et les horodatages — ils ne doivent PAS se fier à leur propre horloge ou à la notion de "aujourd'hui" des données d'entraînement.
  4. Détectez les clés premium optionnelles : vérifiez l'environnement pour FINNHUB_API_KEY et POLYGON_API_KEY. Enregistrez lesquelles (le cas échéant) sont présentes et transmettez un indicateur premium_stocks (finnhub | polygon | none) aux agents actions/matières premières. La compétence fonctionne entièrement avec des points de terminaison sans clé gratuits lorsqu'aucune clé n'est définie.

Étape 1 : Déterminer le profil de risque

Demandez à l'utilisateur sa tolérance au risque à l'aide de l'outil AskUserQuestion :

Question : "Quel est votre profil de risque d'investissement ?" Options :

  1. Conservateur — "Préservation du capital, rendements stables, risque plus faible (obligations, blue chips, or)"
  2. Modéré — "Croissance et sécurité équilibrées, diversifié entre les secteurs (Recommandé)"
  3. Agressif — "Potentiel de croissance maximal, à l'aise avec une forte volatilité (crypto, actions de croissance, positions à effet de levier)"

Stockez le profil sélectionné sous risk_profile ("conservateur", "modéré" ou "agressif"). Si la réponse n'est pas l'une de ces trois, redemandez. Ce profil est transmis à l'Agent Stratégie et façonne l'accent analytique.

Étape 2 : Charger les instructions des agents

Lisez $SKILL_DIR/references/agent-prompts.md. Ce fichier contient les 5 instructions d'agent (4 sectoriels + stratégie).

Étape 3 : Charger les données historiques

Vérifiez $HISTORY_DIR pour les rapports précédents. S'il existe, lisez le fichier JSON le plus récent (les noms de fichiers utilisent AAAA-MM-JJ.json, qui se trie chronologiquement). Ces données historiques sont transmises à l'Agent Stratégie pour le suivi de la précision. S'il n'y a pas d'historique, c'est la première exécution — ce n'est pas grave.

Étape 4 : Lancer 4 agents de recherche sectorielle

Lancez les 4 agents en parallèle à l'aide de l'outil Agent dans un seul message. Passez à chaque agent : son instruction sectorielle spécifique de agent-prompts.md, analysis_date/analysis_datetime, et l'indicateur premium_stocks.

Approvisionnement hybride (contraignant) : chaque agent récupère d'abord les prix faisant autorité via WebFetch vers des points de terminaison API sans clé (CoinGecko pour les crypto ; Yahoo v8 chart / Frankfurter pour le reste — voir agent-prompts.md), et utilise WebSearch uniquement pour le récit, les actualités et le sentiment social. Chaque actif suit une échelle de repli : point de terminaison principal → point de terminaison alternatif → meilleur effort WebSearch → valeur null avec une note.

Les 4 agents sectoriels sont :

  1. Agent Crypto — 5-7 actifs cryptographiques (toujours BTC + ETH ; trouve dynamiquement des altcoins tendance/prometteurs)
  2. Agent Actions — 5-8 actions (toujours les références SPX + IXIC ; trouve dynamiquement des noms propulsés par des catalyseurs entre les secteurs)
  3. Agent Devises — 5-7 paires de devises (toujours DXY + USD/MXN ; trouve dynamiquement des paires motivées par des événements)
  4. Agent Matières Premières — 5-7 matières premières (toujours Or + Pétrole WTI ; trouve dynamiquement des matières premières tendance)

Chaque agent DOIT renvoyer un bloc JSON dans ce schéma exact. Contrat de données : toutes les valeurs monétaires/numériques sont des NOMBRES (ou null si réellement indisponibles) — jamais de chaînes avec $, % ou des séparateurs de milliers. Le formatage n'a lieu qu'au moment du rendu.

{
  "sector": "crypto|stocks|currencies|materials",
  "timestamp": "{analysis_datetime}",
  "assets": [
    {
      "name": "Nom Complet",
      "symbol": "TICKER",
      "current_price": 67500.00,
      "price_unit": "USD|USD/oz|USD/bbl|rate|index",
      "change_24h": 2.3,
      "change_7d": -1.5,
      "change_30d": 12.8,
      "ytd_change": 45.2,
      "week_52_high": 73800.00,
      "week_52_low": 38500.00,
      "market_cap": 1300000000000,
      "volume_24h": 28000000000,
      "sentiment": "bullish|bearish|neutral|mixed|<courte phrase>",
      "social_sentiment": "bullish|bearish|neutral|mixed|<courte phrase>",
      "social_buzz": "élevée|moyenne|faible",
      "confidence": 7,
      "source_agreement": "élevé|moyen|faible",
      "data_source": "api|api_alt|websearch|unavailable",
      "sources_checked": ["api.coingecko.com", "finance.yahoo.com"],
      "key_news": ["titre 1", "titre 2"],
      "social_highlights": ["post 1", "post 2"],
      "recommendation": "buy|hold|sell",
      "reasoning": "Explication analytique de 1 à 2 phrases"
    }
  ],
  "sector_summary": "Aperçu du secteur en 2-3 phrases",
  "sector_outlook": "bullish|bearish|neutral",
  "top_pick": "TICKER",
  "top_pick_reasoning": "Pourquoi c'est l'opportunité la plus notable de ce secteur"
}

Remarques :

  • current_price est un nombre nu. Pour les devises, utilisez le taux de change (par exemple 17.39) avec price_unit: "rate" ; pour les indices, utilisez le niveau de l'indice avec price_unit: "index" et market_cap: null.
  • change_* et ytd_change sont des nombres signés en pourcentage (par exemple 2.3 signifie +2,3%, -1.5 signifie −1,5%). Pas de signe %.
  • recommendation conserve l'énumération buy|hold|sell pour le filtrage/tri interne ; l'interface utilisateur le réétiquette en langage analytique (Considérer/Conserver/Éviter) au moment du rendu.

Étape 5 : Lancer l'Agent Stratégie

Une fois que les 4 agents sectoriels ont répondu, lancez l'Agent Stratégie. Passez-lui : les 4 sorties JSON sectorielles, le risk_profile, les données historiques (le cas échéant), l'instruction de stratégie, et une liste explicite de tous les secteurs marqués data_unavailable.

L'Agent Stratégie effectue une analyse intersectorielle et DOIT renvoyer ce JSON (même contrat de données numériques) :

{
  "risk_profile": "conservateur|modéré|agressif",
  "macro_environment": {
    "summary": "Aperçu macro en 2-3 phrases (taux, inflation, géopolitique)",
    "interest_rate_outlook": "en hausse|stable|en baisse",
    "inflation_outlook": "en hausse|stable|en baisse",
    "geopolitical_risk": "élevé|moyen|faible",
    "key_factors": ["facteur 1", "facteur 2", "facteur 3"]
  },
  "portfolio_allocation": {
    "crypto": 10,
    "stocks": 45,
    "currencies": 15,
    "materials": 20,
    "cash": 10
  },
  "cross_sector_insights": [
    { "insight": "L'or et la crypto sont tous deux en hausse...", "implication": "Ce que cela signifie pour les investisseurs" }
  ],
  "risk_adjusted_picks": [
    {
      "rank": 1,
      "name": "Nom de l'Actif",
      "symbol": "TICKER",
      "sector": "crypto",
      "confidence": 9,
      "risk_score": 7,
      "risk_adjusted_score": 8.2,
      "recommendation": "buy",
      "reasoning": "Raisonnement ajusté au risque pour ce profil",
      "position_size": "5-10% (allocation illustrative, pas un conseil)"
    }
  ],
  "historical_accuracy": {
    "previous_date": "2026-03-12",
    "calls_made": 5,
    "calls_correct": 3,
    "accuracy_pct": 60,
    "notable": "Signal d'accumulation BTC à 65k $ maintenant à 67,5k $ (+3,8%)"
  },
  "warnings": ["Tout avertissement ou mise en garde sur les risques"],
  "strategy_summary": "Aperçu de la stratégie en 3-4 phrases adapté au profil de risque"
}

Règle d'échec partiel : pour tout secteur marqué data_unavailable, l'Agent Stratégie DOIT : exclure ses actifs de risk_adjusted_picks, définir la portfolio_allocation de ce secteur à 0, réaffecter le pourcentage libéré à cash (ne pas redistribuer silencieusement dans d'autres secteurs), et ajouter une entrée warnings[] nommant le secteur manquant. L'allocation doit toujours totaliser 100.

Étape 6 : Construire les données du rapport

Combinez toutes les sorties des agents dans l'objet REPORT_DATA final. Pour tout secteur en échec, incluez quand même la clé comme { "sector": "<nom>", "timestamp": "{analysis_datetime}", "assets": [], "data_unavailable": true, ... } pour que le tableau de bord puisse afficher une carte d'état vide.

{
  "brand": "Tododeia",
  "creator": "@soyenriquerocha",
  "generated_at": "{analysis_datetime}",
  "risk_profile": "modéré",
  "executive_summary": "Résumé stratégique de l'agent de stratégie",
  "macro_environment": { },
  "portfolio_allocation": { },
  "cross_sector_insights": [ ],
  "risk_adjusted_picks": [ ],
  "historical_accuracy": { },
  "warnings": [ ],
  "sectors": {
    "crypto": { }, "stocks": { }, "currencies": { }, "materials": { }
  }
}

Étape 7 : Sauvegarder les données historiques

  1. Créez $HISTORY_DIR si nécessaire.
  2. Sauvegardez REPORT_DATA sous $HISTORY_DIR/{analysis_date}.json.
  3. Ne conservez que les 30 derniers fichiers : listez $HISTORY_DIR/*.json, triez par nom (chronologique), et supprimez les plus anciens jusqu'à ce qu'il n'en reste que 30.

Étape 8 : Générer le rapport

Principal (tableau de bord Next.js) :

  1. Assurez-vous qu'une copie accessible en écriture du tableau de bord existe dans $DASHBOARD_DIR : si elle est manquante ou obsolète, synchronisez-la depuis $SKILL_DIR/dashboard en excluant node_modules et .next — rsync -a --delete --exclude node_modules --exclude .next "$SKILL_DIR/dashboard/" "$DASHBOARD_DIR/" (solution de secours avec cp -R si rsync n'est pas disponible).
  2. Créez $DATA_DIR si nécessaire.
  3. Écrivez REPORT_DATA dans $DATA_DIR/report.json.

Solution de secours (modèle HTML hérité) : Si Node.js/npm n'est pas disponible :

  1. Lisez $SKILL_DIR/assets/template.html.
  2. Sérialisez REPORT_DATA en toute sécurité pour l'intégration : exécutez JSON.stringify(REPORT_DATA), puis dans cette chaîne JSON, remplacez < par \u003c, > par \u003e, U+2028 par \u2028, et U+2029 par \u2029. Ce sont des échappements Unicode JSON : le JSON reste valide et s'analyse en l'original, tandis qu'aucun littéral </script> ou HTML ne peut s'échapper de l'îlot de données <script type="application/json"> utilisé par le modèle. N'utilisez PAS d'entités HTML (&lt;) — l'îlot est du texte brut et les entités corrompraient le JSON.
  3. Remplacez le jeton {{REPORT_DATA_JSON}} par le JSON échappé.
  4. Créez $OUTPUT_HTML_DIR si nécessaire et écrivez le HTML rempli dans $OUTPUT_HTML_DIR/report.html.

Étape 8b : Traduire le rapport en espagnol

Après avoir écrit le rapport en anglais (chemin principal uniquement — sautez si la solution de secours HTML a été utilisée, qui est monolingue), lancez un Agent de Traduction :

  1. Lisez $DATA_DIR/report.json.
  2. Traduisez uniquement ces champs lisibles par l'homme en espagnol : executive_summary, strategy_summary, macro_environment.summary, macro_environment.key_factors[], cross_sector_insights[].insight, cross_sector_insights[].implication, warnings[], historical_accuracy.notable ; par secteur sector_summary, top_pick_reasoning ; par actif reasoning, key_news[], social_highlights[].
  3. Ne traduisez PAS : les nombres, tickers, prix, dates, pourcentages, noms d'actifs, symboles, URLs, price_unit , data_source , ou les valeurs d'énumération (par exemple bullish, buy, high).
  4. Écrivez dans $DATA_DIR/report-es.json.

Invite de traduction : "Vous êtes un traducteur financier. Traduisez les champs de texte lisibles par l'homme listés de ce JSON de rapport d'investissement de l'anglais vers l'espagnol, en itérant sur tous les niveaux imbriqués (sectors[].assets[].key_news[], etc.). Préservez exactement tous les nombres, tickers, prix, dates, pourcentages, noms, symboles, URLs et valeurs d'énumération. Renvoyez un JSON valide avec la même structure."

Étape 9 : Servir le rapport

Affichez TOUJOURS la clause de non-responsabilité éducative EN PREMIER, puis l'URL :

⚠️ Analyse éducative — pas un conseil financier. Les signaux de Tododeia sont des opinions générées par l'IA à partir de données publiques et peuvent être erronés. Faites vos propres recherches et consultez un conseiller agréé avant d'investir. Vous assumez tous les risques.

Principal (tableau de bord Next.js) :

  1. Si $DASHBOARD_DIR/node_modules/ est manquant, exécutez npm install --prefix "$DASHBOARD_DIR".
  2. Vérifiez le port 3420 : lsof -i :3420. Si un serveur y est déjà en cours d'exécution, sautez le démarrage d'un nouveau (l'utilisateur n'a qu'à actualiser).
  3. Sinon, démarrez-le en arrière-plan : npx --prefix "$DASHBOARD_DIR" next dev -p 3420 (exécutez depuis $DASHBOARD_DIR).
  4. Attendez ~3 secondes, puis dites à l'utilisateur :

Le rapport d'investissement Tododeia est prêt ! → http://localhost:3420

Profil : {risk_profile} | Meilleur signal : {#1 risk-adjusted pick} | Allocation illustrative : {summary}

Solution de secours (héritée) : Si Node.js/npm n'est pas disponible, servez $OUTPUT_HTML_DIR :

  1. Trouvez un port libre à partir de 8420 (essayez 8420-8425) : lsof -i :PORT.
  2. Démarrez : command -v python3 >/dev/null && python3 -m http.server PORT --directory "$OUTPUT_HTML_DIR" || python -m http.server PORT --directory "$OUTPUT_HTML_DIR".
  3. Dites à l'utilisateur d'ouvrir http://localhost:PORT/report.html (après la clause de non-responsabilité).

Étape 10 : Proposer la planification

Après avoir montré le rapport, proposez à l'utilisateur de planifier des mises à jour régulières :

Voulez-vous planifier ce rapport ?

  • Quotidien (~9h, votre fuseau horaire)
  • Hebdomadaire (lundi)
  • Mensuel (1er du mois)
  • Non merci

Si l'utilisateur sélectionne une option, expliquez que dans l'environnement Claude Code, les rappels ne sont pas encore automatisés sans une intégration cron/automation, mais notez la préférence pour référence.

Skills associés