bi-al1

kabumart-analyzer

KabuMartのスクリーンショットから銘柄を分析し、インタラクティブなHTMLダッシュボードを生成するスキル。 ユーザーがKabuMartのスクショを貼り付けたら、画像解析→yfinanceデータ取得→WebSearch調査→HTML生成を自動で行う。 「銘柄分析」「KabuMart」「株分析」「企業分析」「スクリーニング結果」「この銘柄どう?」など、 日本株の個別銘柄を調べたいときに必ず使う。スクリーンショットが添付されていなくても、 銘柄コード(4桁)や企業名が指定されていればWebSearchのみで分析を実行できる。

bi-al1 0 Updated 3mo ago
GitHub

Install

npx skillscat add bi-al1/kabumart-analyzer

Install via the SkillsCat registry.

SKILL.md

KabuMart銘柄分析ダッシュボード

KabuMartのスクリーンショットを読み取り、yfinanceで定量データを取得し、
WebSearchで定性情報を補完して、初心者にもわかりやすいインタラクティブHTMLダッシュボードを生成する。

対象ユーザー

投資初心者の「ふゆさん」。専門用語はすべて噛み砕いて説明する。
「つまりどういうこと?」という問いを常に意識し、具体例や日常の比喩で伝える。


実行フロー

ユーザーから画像または銘柄情報が提供されたら、以下を順番に実行する。

Step 1:画像解析(スクショがある場合)

KabuMartのスクリーンショットから以下を正確に読み取る:

  • 企業名銘柄コード(4桁)・業種
  • 総合スコアとランク(S, A+, A, B+ など)
  • 5軸スコア:成長性、安定性、収益性、余力、新規性(それぞれ数値とランク)
  • 予想PER(倍率)
  • 株価チャートから直近の株価水準を推定
  • ポジティブ要素(全件、原文のまま抽出)
  • ネガティブ要素(全件、原文のまま抽出)

スクショがなく銘柄コードのみの場合はこのStepをスキップし、
KabuMartスコアのセクションは「データなし」として空欄にする。

Step 2:yfinanceデータ取得(定量データの確保)

銘柄コードが判明したら、scripts/fetch_yfinance.py を実行して定量データを取得する。

python scripts/fetch_yfinance.py {銘柄コード} --full --pretty

取得できるデータ:

  • 株価情報:現在値、52週高値/安値、出来高
  • バリュエーション:PER(実績/予想)、PBR、PSR、EV/EBITDA
  • ファンダメンタルズ:ROE、ROA、利益率、売上成長率、自己資本比率
  • 配当:利回り、配当額、配当性向
  • アナリスト情報:目標株価(高/平均/低)、推奨、アナリスト数
  • テクニカル指標--full時):RSI、ボリンジャーバンド位置、SMA50/200ステータス、リターン
  • 変化スコア--full時):アクルーアルズ、売上加速度、FCFマージン変化、ROE趨勢
  • 推定リターン--full時):楽観/ベース/悲観の3シナリオ

yfinanceが使えない場合: pip install yfinance が未実行の場合はエラーJSONが返る。
その場合はStep 2をスキップし、従来通りWebSearchのみで分析を続行する(Graceful degradation)。

データの役割分担:

  • yfinance → 定量データ(数字):PER、PBR、ROE、配当利回り、株価、アナリスト目標株価
  • WebSearch → 定性データ(文脈):ビジネスモデル、成長戦略、競合状況、リスク要因

Step 3:WebSearch調査(定性情報の補完)

yfinanceで取得済みの数字系(PER、株価など)は検索不要。
定性的な情報に集中してWebSearchを実行する。

必須(常に実行):

"[企業名] ビジネスモデル 収益構造 セグメント"
"[企業名] 決算 業績 最新 2026"
"[企業名] 競合 市場シェア"

推奨(できるだけ実行):

"[企業名] 成長戦略 中期経営計画"
"[企業名] リスク 課題"

条件付き(yfinanceでデータが取れなかった項目のみ):

"[企業名] ROE 自己資本比率 財務 配当"
"[銘柄コード] PER 株価"
"[企業名] アナリスト 目標株価"

クエリの詳細パターンは references/search_queries.md を参照。

Step 4:データ構造化

調査結果を以下の構造で整理する(内部処理用、ユーザーには見せない):

company:       企業名、コード、業種、市場
scores:        KabuMartの5軸スコア + 総合スコア
financials:    PER、PBR、ROE、自己資本比率、配当利回り(yfinance優先、なければWebSearch)
price:         現在株価、52週高値/安値(yfinance)
business:      ビジネスモデル概要、主力事業、収益構造(WebSearch)
segments:      セグメント名、売上比率、利益率(WebSearch)
positives:     ポジティブ要素(KabuMart原文 + WebSearch追加分)
negatives:     ネガティブ要素(KabuMart原文 + WebSearch追加分)
change_score:  変化スコア(yfinance、取得できた場合のみ)
technical:     テクニカル指標(yfinance、取得できた場合のみ)
analyst:       アナリスト情報・推定リターン(yfinance、取得できた場合のみ)
verdict:       強み3つ、懸念3つ、初心者向けまとめ

Step 5:分析JSONの生成・保存・push

HTMLは生成しない。 分析結果は webapp/data/stocks/{コード}.json に保存する。
表示は webapp/frontend/stocks/detail.html が動的に読み込んで行う(1枚で全銘柄に対応)。

保存先: webapp/data/stocks/{銘柄コード}.json(例:402A.json

JSONの構造(必須フィールド):

  • company:企業名、コード、業種、市場、調査日
  • scores:KabuMartスコア(total_score, total_rank, axes)
  • financials:PER, ROE, 自己資本比率, バリュエーションテーブル
  • price:現在株価, 52週高値/安値
  • price_history:株価履歴([{"date": "YYYY-MM-DD", "close": 1234}, ...]
  • business:catchcopy, paragraphs, tags, segments
  • positives / negatives:title, impact, explain, source
  • verdict:strengths, risks, summary
  • has_yfinance, has_websearch, has_kabumart:データソースフラグ
  • links:参考URLリスト

詳細なJSONスキーマは webapp/data/stocks/402A.json を参照(実例)。

生成後に以下を必ず実行する:

  1. manifest.jsonを更新scripts/update_manifest.py を実行)
  2. git add + commit + push(Claude が自動実行)
# manifest更新(--file と --url は省略可能・自動補完される)
python scripts/update_manifest.py \
  --code {銘柄コード} \
  --name "{企業名}" \
  --date {YYYY-MM-DD} \
  --rank {ランク}

# git push(必須)
git add webapp/data/stocks/{コード}.json webapp/manifest.json
git commit -m "feat: {企業名}({コード})分析データを追加"
git push

データ反映フロー(push直後に反映):

データ 読み込み元 書き込み
分析JSON(銘柄データ) GitHub Raw URL git push
watchlist.json Render /api/watchlist → GitHub API git push or Render API → GitHub API
manifest.json GitHub Raw URL git push
healthcheck Render FastAPI(yfinance)
  • 分析JSON / manifest:git push後にブラウザリロードで即時反映
  • watchlist:Render API経由でGitHub APIから直接取得(CDNキャッシュ問題を回避)
  • ステータス変更はWebダッシュボード上でもClaudeへの依頼でも可能

pushが完了したら、URLを案内する:
https://kabumart-analyzer.vercel.app/stocks/detail.html?code={コード}


ダッシュボードの構成(8セクション)

テンプレートを読む前に、各セクションの目的を理解しておく。

1. ヘッダー

  • 企業名(銘柄コード)、業種、市場、調査日
  • 「ひと言で言うと?」キャッチコピー(初心者がイメージできる一文)
  • データソース表示:yfinanceデータの有無を小さくバッジ表示(「📊 yfinance取得済」/「📝 WebSearchのみ」)

2. この会社は何をしている?(ビジネスモデル)

  • 左カラム:平易な文章で事業内容を説明(3段落程度)
  • 右カラム:事業ごとのハイライトカード
  • タグ:BtoB/BtoC、収益モデルの種類、市場特性
  • この会社の具体的な製品やサービスが何に使われているかまで踏み込んで書く

3. KabuMartスコア

  • 左:総合スコアの円形表示 + ランクバッジ
  • 右:レーダーチャート(5軸。Chart.jsで描画)
  • 基準ライン(70点)の点線を重ねて表示
  • レーダーのラベルにスコア値とランクを含める

4. 主要財務指標(ゲージメーター×3 + バリュエーション表)

  • 予想PER:業種平均との比較 ← yfinanceの値を優先
  • ROE:目安10%との比較 ← yfinanceの値を優先
  • 自己資本比率:目安40%との比較 ← yfinanceの値を優先
  • 各ゲージにホバーで「つまりどういうこと?」ツールチップ
  • 追加:バリュエーション補足テーブル(yfinanceデータがある場合)
    • PBR、配当利回り、EV/EBITDA、売上成長率を小さなテーブルで表示
    • 各指標に一般的な目安値を併記

5. 変化スコア(yfinanceデータがある場合のみ表示)

  • 4つのゲージまたはバー:アクルーアルズ、売上加速度、FCFマージン変化、ROE趨勢(各25点満点)
  • 合計スコア(100点満点)と解釈ラベル(📈強い改善 / ↗️改善傾向 / ➡️横ばい / 📉悪化)
  • ホバーで「つまりどういうこと?」解説
    • アクルーアルズ → 「利益がちゃんとキャッシュで裏付けられているか。高いほど"見せかけ"じゃない利益」
    • 売上加速度 → 「売上の伸びが加速しているか。プラスなら勢いが増している」
    • FCFマージン変化 → 「自由に使えるお金の割合が増えているか。企業の"余裕度"の変化」
    • ROE趨勢 → 「株主のお金をどれだけ効率よく増やせているかの変化」
  • このセクションの趣旨:KabuMartスコアは"今の状態"、変化スコアは"方向性"。
    両方見ることで「高スコアだけど下り坂」「低スコアだけど改善中」を見分けられる。
  • yfinanceデータがない場合はこのセクションをまるごとスキップ

6. テクニカル&推定リターン(yfinanceデータがある場合のみ表示)

  • 左カラム:テクニカルサマリー
    • RSI(売られすぎ/買われすぎの判定付き)
    • SMAステータス(上昇/下降トレンドをアイコンで)
    • ボリンジャーバンド位置
    • リターン一覧(1M / 3M / 6M / 1Y)
  • 右カラム:推定リターン3シナリオ
    • 楽観 / ベース / 悲観 の棒グラフまたはカード
    • アナリスト数の表示(少数の場合は信頼度注意のバッジ)
    • アナリスト目標株価 vs 現在株価のかい離率
  • ホバーで初心者向け解説
    • RSI → 「70以上は"買われすぎ"で一旦下がりやすい、30以下は"売られすぎ"で反発しやすい」
    • SMAクロス → 「短期と長期の移動平均が交差するタイミング。ゴールデンクロスは上昇サイン」
  • yfinanceデータがない場合はこのセクションをまるごとスキップ

7. ポジティブ / ネガティブ分析

  • 左右2カラム(緑カード / 赤カード)
  • 各カードに:タイトル、情報源(📌 KabuMart / 📌 WebSearch / 📊 yfinance)、インパクトバッジ、星評価
  • 「つまりどういうこと?」解説は常時表示(カード内に埋め込み)
  • KabuMartの要素 + WebSearchで追加発見した要素の両方を含める
  • yfinanceデータから追加できるポジティブ/ネガティブ要素
    • PBR < 1.0 → 「資産価値以下で買える(割安の可能性)」をポジティブに追加
    • 配当利回り > 3% → 「高配当銘柄」をポジティブに追加
    • 変化スコア > 60 → 「業績改善トレンド」をポジティブに追加
    • 変化スコア < 30 → 「業績悪化傾向」をネガティブに追加
    • RSI > 70 → 「短期的に買われすぎ」をネガティブに追加
    • デッドクロス → 「テクニカル的に弱い」をネガティブに追加

8. 総合評価

  • 強み3つ・懸念3つを左右に並列表示
  • 「初心者向けまとめ」ボックス(結論ファーストの平易な文章)
  • 変化スコアがある場合:まとめに「今の方向性」(改善中 or 悪化中)を一文追加

9. ウォッチリスト追加ボタン(フッター上部に固定配置)

  • ダッシュボード下部に「👀 ウォッチリストに追加」ボタンを表示
  • ボタンクリックで以下のテキストをクリップボードにコピー:
    ウォッチリストに追加: {銘柄コード} {企業名} {調査日}
  • コピー成功時:ボタンが「✅ コピーしました!Claudeに貼り付けてください」に変化(2秒後に元に戻る)
  • JavaScript実装:navigator.clipboard.writeText() を使用
  • デザイン:ダークテーマに合わせたアクセントカラー(#4a9eff 系)のボタン、角丸、ホバーで明るく
  • このボタンはanalyzerの役割の終点。コピーされたテキストをClaudeに貼り付けると、watchlistスキルが引き継いで保存処理を行う

Step 6(HTML生成後):ウォッチリスト追加の提案

ダッシュボードを生成・表示した後、Claudeはユーザーに対して以下のように提案する:
「ウォッチリストに追加しますか?ダッシュボードのボタンからコピーするか、ここで『追加して』と伝えてください」

  • ユーザーがクリップボードからテキストを貼り付けた場合 → watchlistスキルが処理
  • ユーザーが「追加して」「入れといて」等と口頭で伝えた場合 → watchlistスキルが処理
  • analyzerは提案するだけで、保存処理には関与しない(役割分離)

ライティングルール

初心者が「つまりどういうこと?」と迷わないように以下を徹底する。

  • 専門用語(PER、ROE、自己資本比率など)は登場するたびに平易な言葉で言い換える
  • 「つまり〇〇ってこと」という言い換えを必ず入れる
  • 抽象的な業種名だけで終わらせず、具体的に何をしている会社かを伝える
  • 友人に分かりやすく教えるような口調で、でも投資判断に必要な情報は漏らさず提供する
  • 数字は可能な限り具体的に入れる
  • 事業セグメントの「つまり」解説はホバーツールチップで表示
  • ポジネガの「つまり」解説はカード内に常時表示
  • yfinanceの数字とWebSearchの数字に差がある場合、yfinanceの値を優先し、
    「(yfinance取得値。WebSearchでは〇〇との記載あり)」と注記する

データソースの優先順位

データ項目 第1ソース 第2ソース(フォールバック)
PER, PBR, 配当利回り yfinance WebSearch
ROE, 自己資本比率 yfinance WebSearch
株価, 時価総額 yfinance WebSearch
アナリスト目標株価 yfinance WebSearch
テクニカル指標 yfinance 表示しない
変化スコア yfinance 表示しない
ビジネスモデル, 事業内容 WebSearch
競合, 市場シェア WebSearch
成長戦略, リスク WebSearch
KabuMartスコア 画像解析 表示しない

技術仕様

  • 出力:単一HTMLファイル(CSS・JS全て埋め込み)
  • チャートライブラリ:Chart.js(CDN: https://cdnjs.cloudflare.com/ajax/libs/Chart.js/4.4.1/chart.umd.min.js
  • カラースキーム:ダーク系(背景 #0f1117、カード #1a1d2e)
  • レスポンシブ対応:CSS Gridベース、768px以下で1カラムに切り替え
  • ツールチップ:ゲージ・セグメントのみホバー表示。ポジネガは常時表示
  • Pythonスクリプトscripts/fetch_yfinance.py(要 pip install yfinance

テンプレート参照

HTMLダッシュボードの完全なテンプレートは assets/dashboard_template.html にある。
実データで生成する際は、このテンプレートの構造・スタイル・Chart.js設定をそのまま使い、
データ部分だけを差し替える。テンプレートにはダミーデータが入っているので参考にする。

yfinanceデータがある場合は、セクション5(変化スコア)とセクション6(テクニカル&推定リターン)を
テンプレートの既存セクションと同じデザインテイストで追加生成する。


注意事項

  • このレポートは投資助言ではないことをフッターに必ず明記する
  • データの出典(KabuMart、yfinance、WebSearch元)を可能な範囲で記載する
  • 株価や市場データは現在の日付を基準に検索する
  • 調査はあくまで公開情報に基づくものであり、正確性を保証するものではない
  • yfinanceのデータは無料APIであり、リアルタイムではなく遅延データの可能性がある旨を注記する