# AI Analyst Plus フロントエンド

株探のテクニカル・ファンダメンタルズ・決算短信PDFと、Yahoo掲示板センチメントを横断取得し、各データをもとにAI分析レポートを作成します。

## 拡張機能の導入方法

Chromeで以下を開きます。

```text
chrome://extensions/
```

1. 右上の「デベロッパーモード」をONにします。
2. 「パッケージ化されていない拡張機能を読み込む」を押します。
3. それぞれの拡張機能フォルダを選択して読み込みます。
4. 読み込み後、フロントエンド画面を `Ctrl + F5` で強制再読み込みします。

読み込む拡張機能は、以下の機能を有しています。

```text
株探 株価取得エクステンション
株探 財務状況取得エクステンション
株探 決算短信PDF取得エクステンション
Yahoo掲示板取得エクステンション
Gemini Web App Bridgeエクステンション
```

## 必要な拡張機能のダウンロードと読み込み状態

画面上の以下の行からダウンロードできます。

```text
必要な拡張機能: extension.zip  拡張機能チェック中... / 拡張機能有効 / 拡張機能未検出
```

表示の意味:

- `拡張機能有効`: フロントエンドからChrome拡張機能へPINGできています。
- `拡張機能未検出`: 拡張機能が未読み込み、無効、または現在のURLが拡張機能の許可対象外です。

`拡張機能未検出` の場合は、Chrome拡張機能を読み込んだあと、フロントエンド画面を `Ctrl + F5` で強制再読み込みしてください。


## 全取得の動作

`全取得` ボタンでは、テクニカル、ファンダメンタルズ、決算短信、Yahoo掲示板センチメントのデータ取得を並列で実行します。

Gemini連携は1つのGeminiタブを再利用するため、AI分析への送信は衝突防止のため順番に実行します。

## 並列処理について

`全取得` は、データ取得を並列実行したあと、Gemini分析も並列送信します。
Gemini分析の並列送信では、各分析が別々のGeminiタブで処理される前提です。


## 全取得の並列処理

`全取得` は、テクニカル、ファンダメンタルズ、決算短信、掲示板センチメントを並列で開始します。
各データ取得が完了した項目から、他の取得完了を待たずにGemini分析へ進みます。


## Geminiタブについて

この版では、Chromeのバックグラウンドタブ制限を避けるため、Gemini送信時にGeminiタブをアクティブ表示します。裏タブのままだとGeminiの回答欄更新が遅延し、タブを見に行くまで結果が取得できないことがあります。

## Geminiタブ表示・回答取得仕様

- Gemini送信ごとに新しいGeminiタブを起動します。
- タブタイトルが `Google Gemini` の間は、タイトル変化の起点にはしません。
- タブタイトルが `Google Gemini` 以外に変わった時点を起点にします。
- その時点で未完了なら、Geminiタブを0.5秒だけ表示して元のAI Analyst Plusへ戻ります。
- その後、タイトル変化から5秒、10秒、20秒、30秒、40秒のタイミングで、まだ回答取得が完了していなければGeminiタブを0.5秒だけ表示します。
- Gemini回答欄の監視タイムアウトは最大60秒です。


## Gemini回答取得設定

同梱の extension.zip は、回答欄監視を最大60秒、Geminiタブの一時表示を0.5秒に設定しています。


## プロンプトの編集方法

各AI分析のベースプロンプトは `prompts.txt` に統合しています。

以下の見出しを消さずに、各見出しの下の本文だけを編集してください。

```text
@@PROMPT:technical@@
@@PROMPT:fundamental@@
@@PROMPT:disclosure@@
@@PROMPT:board@@
```

差し込み用のプレースホルダーは以下です。

```text
{{DATA_JSON}}
{{DOCUMENTS_JSON}}
{{PDF_TEXT}}
```

`prompts.txt` はブラウザから `fetch()` で読み込むため、Firebase HostingなどのHTTP環境で使ってください。ローカルで確認する場合は、ファイルを直接開くのではなく以下のように起動します。

```bash
python -m http.server 8000
```

その後、ブラウザで `http://localhost:8000` を開きます。


## Gemini回答の表示方式

AIテクニカル分析、AIファンダ分析、AI決算短信分析、AI掲示板分析の回答欄は、Geminiから返ったテキストをMarkdown変換せず、改行や記号を含めてそのまま表示します。

## フロントエンド要件定義書

### 1. 目的

本フロントエンドは、日本株の銘柄コードを入力し、テクニカル、ファンダメンタルズ、決算短信PDF、Yahoo掲示板センチメントを取得し、取得結果をGeminiへ送信してAI分析結果を表示することを目的とします。

### 2. 対象ユーザー

- 日本株の個別銘柄分析を行う利用者
- 株探、Yahoo掲示板、決算短信PDFの情報を横断的に確認したい利用者
- AI分析用プロンプトを編集しながら分析品質を調整したい利用者

### 3. 動作環境

- Google Chrome
- Chrome拡張機能 `extension.zip` の読み込みが必要
- Firebase HostingなどのHTTP配信環境、または `python -m http.server 8000` などのローカルHTTPサーバー
- `prompts.txt` をブラウザから `fetch()` で読み込める構成

### 4. 必須ファイル

```text
index.html
style.css
app.js
prompts.txt
extension.zip
README.md
```

### 5. 主要機能要件

#### 5.1 銘柄コード入力

- ユーザーは銘柄コードを入力できること。
- 入力値は大文字化して処理すること。
- 未入力の場合は取得処理を行わず、状態欄にエラーを表示すること。

#### 5.2 拡張機能状態チェック

- 画面起動時にChrome拡張機能へPINGを送信すること。
- `拡張機能有効` の場合のみ、以下の取得ボタンを押せること。
  - テクニカル取得
  - ファンダ取得
  - 決算短信取得
  - 掲示板取得
  - 全取得
- `拡張機能チェック中...` または `拡張機能未検出` の場合、取得ボタンは無効化すること。
- 拡張機能未検出の場合は、`extension.zip` を読み込み、`Ctrl + F5` で再読み込みする旨を表示すること。

#### 5.3 テクニカル取得

- 株探の株価ページから日足、週足、月足の価格データを取得できること。
- 日足、週足、月足はチェックボックスで取得対象を選べること。
- EMA5・EMA20の方向に基づくトレンド判定、ダウ理論に基づくスイング高値・安値の別判定、EMA、RSI、Zスコア、Bollinger位置、出来高、ATRなどの要約指標をフロントエンド側で算出すること。
- 価格テーブルとローソク足チャートを表示すること。

#### 5.4 ファンダメンタルズ取得

- 株探の決算ページからPER、PBR、利回り、信用倍率、時価総額、通期業績、収益性、キャッシュフロー、四半期業績、財務データを抽出すること。
- 主要指標カード、主要テーブル、簡易ルールベース判定を表示すること。

#### 5.5 決算短信取得

- 株探の決算ニュース一覧を取得すること。
- 対象ニュースのPDFを取得し、PDF.jsでテキスト抽出すること。
- 選択したPDFをGemini分析へ送信できること。

#### 5.6 掲示板センチメント取得

- Yahoo掲示板の投稿を取得すること。
- 投稿数、Bull/Bear/Fear/Maniaなどの単語スコア、日次投稿数、注目投稿を集計すること。
- 日次投稿数チャートと投稿一覧を表示すること。

#### 5.7 Gemini分析

- 各カテゴリの取得完了後、該当プロンプトを生成しGeminiへ送信できること。
- `全取得` では、各データ取得が完了した項目からGemini分析へ進むこと。
- Gemini回答は、Markdown変換せず、返ってきたテキストをそのまま表示すること。
- 回答が長くてもフロントエンド側で途中で切れないこと。

#### 5.8 プロンプト管理

- ベースプロンプトは `prompts.txt` 1ファイルに統合すること。
- `@@PROMPT:technical@@`、`@@PROMPT:fundamental@@`、`@@PROMPT:disclosure@@`、`@@PROMPT:board@@` の見出しで区切ること。
- `{{DATA_JSON}}`、`{{DOCUMENTS_JSON}}`、`{{PDF_TEXT}}` のプレースホルダーへ実データを差し込むこと。
- プロンプト再生成ボタンでは、最新の `prompts.txt` テンプレートと取得済みデータから再生成すること。

### 6. UI要件

- 画面上部に銘柄コード、掲示板スクロール回数、足種選択、取得ボタン、状態表示を配置すること。
- 必要な拡張機能として `extension.zip` と `README.md` のダウンロードリンクを表示すること。
- 拡張機能状態は `拡張機能チェック中...`、`拡張機能有効`、`拡張機能未検出` のいずれかで表示すること。
- 結果タブは、総合、テクニカル、AIテクニカル分析、ファンダメンタルズ、AIファンダ分析、決算短信、AI決算短信分析、掲示板センチメント、AI掲示板分析を持つこと。
- データ取得済み、AI分析中、AI回答済みの状態がタブ色や総合サマリーで分かること。

### 7. 非機能要件

- フロントエンドは静的ファイルのみで構成すること。
- APIキーや認証情報をフロントエンドに埋め込まないこと。
- 投資助言ではなく、情報提供・分析支援であることをフッターに明記すること。
- 取得処理やAI分析でエラーが起きた場合、画面が停止せず状態欄にエラー内容を表示すること。
- 拡張機能が未検出の場合、取得処理を開始できないこと。

### 8. 制約事項

- 各種データ取得はChrome拡張機能に依存すること。
- `prompts.txt` はHTTP経由で読み込む必要があるため、`file://` で直接開く運用は推奨しないこと。
- Geminiの回答取得速度や完了判定は、Gemini Web画面およびChromeのタブ制御の影響を受けること。

### 9. 今後の拡張候補

- プロンプトのバージョン管理
- 分析結果のCSV/JSON保存
- 銘柄ごとの履歴保存
- 複数銘柄の一括分析
- 拡張機能未検出時の再チェックボタン追加

## 結果HTML保存機能

画面上部の `結果をHTML保存` ボタンを押すと、取得済みの分析結果を単体のHTMLファイルとして保存します。

保存ファイル名は以下の形式です。

```text
YYYYMMDD_銘柄コード_企業名.html
```

例:

```text
20260517_285A_キオクシアホールディングス.html
```

仕様:

- テクニカル、ファンダメンタルズ、決算短信、掲示板センチメント、各AI分析結果を1つのHTMLにまとめます。
- タブで非表示になっているパネルも、保存HTML内では確認できるように全表示します。
- 保存HTMLを1ファイルで完結させるため、チャート欄（Canvas）は保存HTMLから除外します。株価・出来高などの表データは残します。
- プロンプト編集欄、コピー・再生成・送信ボタンなど、操作用UIは保存HTMLから除外します。
- 企業名は、株探ファンダメンタルズ、テクニカル、決算短信、掲示板の取得済みデータから順に自動取得します。企業名が未取得の場合は `YYYYMMDD_銘柄コード.html` として保存します。
- 何も取得していない状態では、`結果をHTML保存` ボタンは押せません。


## テクニカル主要指標一覧のヘルプ

テクニカルの「主要指標一覧」では、以下の指標を表示します。

- トレンド判定: EMA5とEMA20の位置関係・方向で判定
- ダウ理論判定: 直近スイング高値2点・安値2点の切り上げ/切り下げで別指標として判定
- EMA5
- EMA20
- EMA75
- ADX(14)
- +DI / -DI
- MACD
- MACD Signal
- MACD Histogram
- RSI(14) / RSI(28)
- Zスコア(50)
- ボリンジャー位置
- ボラティリティZ
- 出来高20本平均比
- ATR比率

Hurst指数は理論的には意味がありますが、日本株の短中期チャート判断では一般的ではなくノイズも出やすいため、主要指標一覧からは外しています。JSON内には補助データとして残します。

各指標名の横にある `?` ボタンを押すと、その指標の意味と見方をポップアップで確認できます。


## テクニカルチャートの移動平均線

テクニカルのローソク足チャートには、短期・中期の確認用として以下を重ねて表示します。

- `EMA5`: 5期間の指数移動平均
- `EMA20`: 20期間の指数移動平均

主要指標一覧では、移動平均を `EMA5`、`EMA20`、`EMA75` として表示します。


## テクニカルチャートの日付表示

テクニカルチャートのX軸ラベルは、年を含む `YYYY/MM/DD` 形式で表示します。

## トレンド判定とダウ理論判定

主要な `トレンド判定` は、EMA5とEMA20の位置関係・方向で判定します。EMA5がEMA20を上回り、EMA5・EMA20がともに上向きなら `bullish`、EMA5がEMA20を下回り、EMA5・EMA20がともに下向きなら `bearish`、それ以外は `neutral` です。

ダウ理論は主判定から分離し、`ダウ理論判定` として別指標にしています。

## ダウ理論ベースの別判定

従来のトレンド判定は、終値とEMA20/EMA75の位置関係による簡易判定でした。現在は、スイング高値2点・スイング安値2点の合計4点を抽出し、以下のように判定します。

- 高値切り上げ + 安値切り上げ: `bullish`
- 高値切り下げ + 安値切り下げ: `bearish`
- 高値と安値の方向が混在、またはスイング不足: `neutral`

現在値は主判定には含めず、直近スイング高値・安値に対する位置判定として別に表示します。

判定詳細は、テクニカルJSONの `trend_detail` に保存されます。


## テクニカルタブの表示構成

テクニカルタブは、以下の3要素に整理しています。

```text
グラフ
主要指標一覧
取得元データ
```

従来表示していた以下のカード型サマリーは削除しています。

```text
日足 / 週足 / 月足 / 出来高
```

各足種のタブでは、ローソク足グラフを確認したあと、同じ足種の取得元データを表で確認できます。


## テクニカルチャートの日付・出来高表示

テクニカルのローソク足チャートでは、X軸の日付を `YYYY/MM/DD` 形式で表示します。

また、チャートは上下2段構成です。

```text
上段: ローソク足 + EMA5 + EMA20
下段: 出来高バー
```

出来高バーは、上昇足・下落足に合わせた色で半透明表示します。保存HTMLでは1ファイル完結を優先するため、これまで通りチャート欄は除外し、取得元データの表は残します。


## テクニカルタブの表示順

テクニカルタブは、各足種ごとに以下の順番で表示します。

```text
チャート
指標
取得元データ
```

日足、週足、月足のサブタブを切り替えた場合も、それぞれ `チャート → 指標 → 取得元データ` の順で確認できます。

## ファンダメンタルズカードのヘルプ

ファンダメンタルズの主要カードには、各項目名の横に小さい `?` ボタンを表示します。

対象例:

- ルール判定
- 株価
- PER
- PBR
- 利回り
- 信用倍率
- 時価総額
- 通期売上高
- 通期営業益
- 通期最終益
- EPS
- 営業利益率
- ROE / ROA
- フリーCF
- 自己資本比率
- 有利子負債倍率
- 直近四半期

`ルール判定` は他のカードと同じ大きさで左上に表示します。
`?` ボタンを押すと、BULLISH / NEUTRAL / BEARISH、confidence、score の計算方法を確認できます。

ルール判定は、収益性、キャッシュフロー、財務健全性、バリュエーション、成長性を簡易スコア化し、平均スコアが +0.45超なら bullish、-0.35未満なら bearish、それ以外は neutral とします。confidence は平均スコアの絶対値から簡易算出します。

計算式:

```text
score = mean(収益性スコア, キャッシュフロースコア, 財務健全性スコア, バリュエーションスコア, 成長性スコア)

score > +0.45  → bullish
score < -0.35  → bearish
-0.35以上 +0.45以下 → neutral

confidence = round(min(100, abs(score) × 45))
```

この判定は投資助言ではなく、取得済みデータの機械的な要約です。

## 今回の更新メモ

- ファンダメンタルズの主要テーブルで、`過去最高` タブ名を `過去最高益` に変更しました。
- 空欄の先頭ヘッダーを持つ表で列が1列ずれないよう、先頭列を `項目` として保持するように修正しました。
- ファンダメンタルズのカード表示から `直近四半期` カードを削除しました。直近四半期の詳細は主要テーブル側で確認します。
- `信用倍率` カード下の `信用需給` という補足文を削除しました。

## ダウ理論ベースのトレンド判定根拠表示

テクニカル指標の `トレンド判定` は、直近3点のスイング高値・安値の切り上げ/切り下げで判定します。

ダウ理論の基本比較だけなら以下で判定できます。

```text
スイング高値 2点
スイング安値 2点
```

ただし、本ツールではノイズを抑えるため、以下の直近3点を使って連続性を確認します。

```text
スイング高値 3点
スイング安値 3点
```

判定条件:

```text
高値3点が連続して切り上げ + 安値3点も連続して切り上げ → bullish
高値3点が連続して切り下げ + 安値3点も連続して切り下げ → bearish
それ以外、またはスイング不足 → neutral
```

画面上は、判断根拠として直近3点ずつのスイング高値・安値について、日付、価格、前回からの変化を表示します。

ルールベース判定では、方向が混在している場合も特定のチャートパターン名で断定せず、`方向感が一致していません` という表現に留めます。


## ファンダメンタルズの前年比・前年差表示

ファンダメンタルズのルールベース分析では、単年の数値だけでなく、前期からの変化も表示します。

- 売上高、営業益、最終益、EPS、フリーCF、営業CFなどの金額・1株指標は `前年比 +xx.x%` で表示します。
- 営業利益率、ROE、ROA、自己資本比率など、もともと `%` の指標は `前年差 +xx.xxpt` で表示します。
- 有利子負債倍率は `前年差 +xx.xx倍` で表示します。

有利子負債倍率のポップアップには、以下の基本的な目安も記載しています。

```text
1倍以下: 非常に優秀。自己資本と同額以下の借入。
1倍〜3倍程度: 健全な水準。
5倍以上: 資金繰りや財務リスクに注意が必要。
```

ただし、適正水準は業種によって異なるため、営業CF、自己資本比率、金利負担、返済期限も併せて確認する前提です。

## ファンダメンタルズ指標ヘルプの拡充

ファンダメンタルズの各カードにある `?` ポップアップでは、判断に迷いやすい一般的な指標について、意味、計算式、基本的な目安、注意点を表示します。

対象例:

```text
PER
PBR
配当利回り
信用倍率
時価総額
通期売上高
通期営業益
通期最終益
EPS
営業利益率
ROE / ROA
フリーCF
自己資本比率
有利子負債倍率
ルールベース総合判定 / confidence
```

主な追加内容:

- PER: `PER = 株価 ÷ EPS`、10倍以下・15倍前後・30倍以上などの目安
- PBR: `PBR = 株価 ÷ BPS`、1倍未満・1〜3倍・3倍以上の目安
- 営業利益率: `営業益 ÷ 売上高 × 100`、前年差は `%` ではなく `pt` で見ること
- ROE / ROA: 資本効率・資産効率の見方と、ROE 8%以上、ROA 5%以上などの一般的な目安
- フリーCF: 営業CFと投資CFを踏まえた現金創出力の見方
- 自己資本比率: 40%以上、20〜40%、20%未満、10%未満などの財務安定性の目安
- 有利子負債倍率: 1倍以下、1〜3倍程度、5倍以上の財務リスクの目安

いずれも一般的な目安であり、業種特性や一時要因により適正水準は異なります。

## ファンダメンタルズ指標ヘルプの拡充

ファンダメンタルズの各カードにある `?` ポップアップでは、PER、PBR、配当利回り、信用倍率、売上高、営業益、最終益、EPS、営業利益率、ROE/ROA、フリーCF、自己資本比率、有利子負債倍率など、判断に迷いやすい一般的な指標について、計算式、基本的な目安、注意点を表示します。

`ルール判定` のポップアップでは、総合判定に使う5領域スコアの内訳も表示します。

```text
score = mean(収益性スコア, キャッシュフロースコア, 財務健全性スコア, バリュエーションスコア, 成長性スコア)

収益性スコア:
営業利益率が15%以上なら +1、0%以下なら -1、それ以外は 0。
ROEが15%以上なら +1、0%以下なら -1、それ以外は 0。

キャッシュフロースコア:
フリーCFがプラスなら +1、0以下なら -1。
営業CFがプラスなら +0.5、0以下なら -0.5。

財務健全性スコア:
自己資本比率が30%以上なら +1、30%未満なら -0.5。
有利子負債倍率が1倍以下なら +1、2倍以上なら -1、1倍超〜2倍未満なら 0。

バリュエーションスコア:
PERが未取得または算出不可なら 0、15倍未満なら +1、40倍超なら -1、それ以外は 0。
PBRが未取得なら 0、1.5倍未満なら +1、5倍超なら -1、それ以外は 0。

成長性スコア:
直近通期の売上高前年比が+10%超なら +1、-10%未満なら -1、それ以外は 0。
直近通期の営業益が前期より増加していれば +1、減少または同等なら -1。
```
