TIP
難易度:★★☆☆☆ | 所要時間:15 分 | 習得内容:ローカル金融リサーチ Agent のデプロイ、ツール呼び出しと DCF スキル拡張メカニズムの理解
イントロダクション
Dexter は、ターミナル上で動作する自律型金融リサーチ Agent です。複雑な質問を投げると、タスクを自動的に分解し、複数のデータツールを呼び出し、結果をクロスチェックして、データに裏打ちされた結論を導き出します。まるで疲れを知らないシニアアナリストを雇っているような感覚です。
主なコア機能は以下の通りです:
- SEC 文書の読み込み:10-K、10-Q、8-K などの開示書類を自動取得
- リアルタイム株価・財務照会:株価、財務指標、キャッシュフロー、貸借対照表
- DCF 本源的価値の推定:内蔵された SKILL.md 駆動の DCF スキルにより、キャッシュフロー割引法を自動実行
- 自己検証ループ:中間結果をチェックし、結論が成立するまで反復修正
- ループ保護:ステップ数の上限を設定し、Agent の暴走を防止
プロジェクト全体は TypeScript で記述されており、コアは LangChain + Ink (React for CLI) で構成され、Bun 1.0+ 環境で動作します。より低コストでこれらの機能を最大限に活用したい場合は、LLM プロバイダーを Defapi に切り替えることで、API 価格を公式の約半分に抑えることができます。
対象読者
- AI Agent アーキテクチャ(ツール呼び出し、Agentic Loop)の基礎知識を持つ、経験 1〜5 年の開発者
- AI ツールを使用してファンダメンタルズ分析を効率化したい個人投資家や FinTech 従事者
- 実際のプロジェクトで複数のデータソース(SEC、Financial Datasets、Exa)を統合する方法を学びたいエンジニア
- 金融クオンツリサーチに興味があり、ローカルなリサーチパイプラインを構築したいユーザー
コア依存関係と環境
| 依存関係 | 説明 | 入手先 |
|---|---|---|
| Bun 1.0+ | JavaScript/TypeScript ランタイム | bun.sh |
| Financial Datasets API Key | 機関投資家級の市場データ(一部銘柄は無料) | financialdatasets.ai |
| OpenAI API Key | デフォルトの LLM プロバイダー | platform.openai.com |
| Exa API Key | Web 検索(任意、Tavily がフォールバックとして動作) | exa.ai |
| Defapi API Key | OpenAI のコスト削減用(任意) | defapi.org |
WARNING
Financial Datasets では AAPL、NVDA、MSFT のデータは無料ですが、その他の銘柄はサブスクリプションが必要です。開始前に無料銘柄でフローを検証することをお勧めします。
プロジェクト構造ツリー
dexter/
├── .dexter/
│ └── settings.json # Agent 実行設定(モデル/プロバイダー選択)
├── src/
│ ├── agent/ # Agent コア:ループ・ロジック、プロンプト、スクラッチパッド
│ │ ├── agent.ts # Agentic Loop メインループ
│ │ ├── prompts.ts # システムプロンプト
│ │ └── scratchpad.ts # ツール呼び出し履歴記録
│ ├── cli.tsx # Ink/React CLI レンダリングエントリ
│ ├── index.tsx # プログラムエントリ
│ ├── components/ # CLI UI コンポーネント (Ink)
│ ├── hooks/ # React hooks (AgentRunner, ModelSelector)
│ ├── model/
│ │ └── llm.ts # マルチプロバイダー LLM 抽象化レイヤー
│ ├── tools/
│ │ ├── registry.ts # ツールレジストリ
│ │ ├── finance/ # 金融ツール:株価、財務、レポート、インサイダー取引
│ │ ├── search/ # Web 検索ツール (Exa / Tavily)
│ │ ├── browser/ # Playwright ブラウザ自動化
│ │ └── descriptions/ # ツール説明(システムプロンプトに注入)
│ ├── skills/ # SKILL.md スキルディレクトリ
│ │ └── dcf/
│ │ └── SKILL.md # DCF 本源的価値推定スキル
│ ├── evals/ # LangSmith 評価フレームワーク
│ └── utils/ # 環境変数、設定、キャッシュ
├── scripts/
│ └── release.sh
├── .env # API キー(gitignored)
└── package.json
ステップ・バイ・ステップ
ステップ 1:Bun のインストールとプロジェクトのクローン
マシンに Bun がインストールされていない場合は、まずインストールしてください。Windows/macOS/Linux 共通です:
# macOS / Linux
curl -fsSL https://bun.com/install | bash
# Windows
powershell -c "irm bun.sh/install.ps1|iex"
インストールの確認:
bun --version
# 出力例:Bun v1.2.x
次に、Dexter リポジトリをクローンします:
git clone https://github.com/virattt/dexter.git
cd dexter
ステップ 2:.env 環境変数の設定
環境変数のテンプレートファイルをコピーします:
cp env.example .env
エディタで .env を開き、キーを入力します。Defapi の連携方法について:OpenAI の代わりに Defapi を使用してコストを 50% 節約したい場合は、以下のように設定します:
# .env
# ── LLM プロバイダー ──────────────────────────────────────
# プラン A:OpenAI を直接使用(デフォルト)
OPENAI_API_KEY=sk-your-openai-key
# プラン B:Defapi 経由で OpenAI を使用(推奨、50% 節約)
# OPENAI_API_KEY=sk-your-defapi-key
# OPENAI_BASE_URL=https://api.defapi.com/v1
# その他のオプション LLM プロバイダー
ANTHROPIC_API_KEY=sk-ant-your-anthropic-key
GOOGLE_API_KEY=your-google-key
XAI_API_KEY=your-xai-key
OPENROUTER_API_KEY=your-openrouter-key
# ローカルモデル (OLLAMA)
OLLAMA_BASE_URL=http://127.0.0.1:11434
# ── 金融データ ───────────────────────────────────────
# 機関投資家級市場データ、AAPL/NVDA/MSFT は無料
FINANCIAL_DATASETS_API_KEY=your-financial-datasets-key
# ── Web 検索 ───────────────────────────────────────
# Exa を優先し、Tavily をフォールバックとして使用
EXASEARCH_API_KEY=your-exa-key
TAVILY_API_KEY=your-tavily-key
TIP
Defapi のすべてのモデルは v1/chat/completions および v1/messages インターフェースと互換性があります。Dexter のコード修正は不要で、OPENAI_API_KEY を Defapi のキーに差し替え、OPENAI_BASE_URL を https://api.defapi.com/v1 に向けるだけで完了します。
依存関係をインストールします:
bun install
ステップ 3:Dexter インタラクティブモードの実行
インタラクティブ CLI を起動します:
bun start
ターミナルに Ink でレンダリングされたカラーインターフェースが表示されます。金融に関する質問を直接入力してください。例:
AAPL の過去 5 年間の売上成長率は?現在の DCF 本源的価値はいくらですか?
Dexter が自動的に作業を開始します:タスク分解 → 財務データ照会 → SEC 文書読み込み → DCF スキル実行 → 結論の要約。ツール呼び出しの各ラウンドはインターフェース上にリアルタイムで表示されます。
コードを修正しながらデバッグしたい場合は、watch モードを使用します:
bun dev
ステップ 4:モデル / プロバイダーの切り替え
CLI 内で /model コマンドを入力すると、LLM プロバイダーとモデルを切り替えることができます。Dexter は以下のプレフィックスを自動識別します:
| プレフィックス | プロバイダー | モデル例 |
|---|---|---|
| プレフィックスなし | OpenAI(デフォルト) | gpt-5.4 |
claude- | Anthropic | claude-sonnet-4-7 |
gemini- | gemini-2.5-pro | |
ollama: | Ollama(ローカル) | ollama:qwen2.5 |
deepseek: | DeepSeek | deepseek-chat |
例として Claude に切り替える場合:
/model claude-sonnet-4-7
TIP
Defapi を連携している場合は、デフォルトの gpt-5.4 をそのまま使用してください。トラフィックは自動的に Defapi 経由で転送され、OpenAI 公式のクォータを消費しません。
ステップ 5:金融ツールによる銘柄照会
Dexter の中核は financial_search ツールであり、質問内容に応じて最適なサブツールに自動委託します。以下は典型的なクエリ例です:
収益と利益の照会:
TSLA の直近 3 年間の売上高、純利益、フリーキャッシュフローを調べてください
Dexter は get_income_statements(損益計算書)と get_cash_flow_statements(キャッシュフロー計算書)を呼び出し、テーブル形式でまとめます。
貸借対照表の照会:
NVDA の最新の自己資本比率は?現金および現金同等物はいくらありますか?
SEC 文書の読み込み:
AAPL の最新の 10-K における "Risk Factors" セクションを読んでください
Dexter は read_filings ツールを呼び出して 10-K の内容を取得し、該当セクションを特定します。
インサイダー取引の照会:
直近四半期の FAANG 銘柄のインサイダー取引状況はどうなっていますか?
すべてのツール呼び出しの生データは、.dexter/scratchpad/ ディレクトリ下の JSONL ファイルに記録され、後で監査することが可能です。
ステップ 6:DCF 評価スキルのトリガー
DCF(キャッシュフロー割引法)評価は、Dexter に組み込まれたスキルの一つです。質問に「本源的価値」や「バリュエーション」が含まれる場合、Agent は自動的に skill ツールを呼び出し、src/skills/dcf/SKILL.md をロードして以下の手順を実行します:
- 企業の過去のフリーキャッシュフロー (FCF) を取得
- 将来 5〜10 年の成長率仮定を推定
- 加重平均資本コスト (WACC) を計算
- 現在価値に割り引く
- 最終的な評価レンジ + 感度分析を出力
クエリ例:
MSFT の DCF 本源的価値はいくらですか?保守的、ベースライン、強気の 3 つのシナリオで結果を出してください
WARNING
DCF の出力はあくまで参考レンジであり、投資アドバイスではありません。Dexter は各仮定の信頼度を明記します。これは「確実性をパッケージ化せず、不確実性を回避しない」という設計哲学に基づいています。
ステップ 7:デバッグとスクラッチパッドログの確認
Dexter の各クエリは、.dexter/scratchpad/ に以下の形式のファイル名で JSONL ファイルを生成します:
YYYY-MM-DD-HHMMSS_<session_id>.jsonl
各行は構造化されたレコードです:
{"type":"init","timestamp":"2026-03-27T10:00:00.000Z","query":"AAPL の DCF 本源的価値はいくらですか?"}
{"type":"tool_start","timestamp":"2026-03-27T10:00:01.000Z","toolName":"get_cash_flow_statements","args":{"ticker":"AAPL","period":"annual","limit":5}}
{"type":"tool_result","timestamp":"2026-03-27T10:00:03.000Z","toolName":"get_cash_flow_statements","result":{"freeCashFlow":[67800000000, 73000000000, ...]},"llmSummary":"AAPL の過去 5 年間のフリーキャッシュフローは持続的に成長しており、複合成長率は約 9.2% です"}
{"type":"thinking","timestamp":"2026-03-27T10:00:05.000Z","content":"FCF データを取得しました。次にアナリストの予想成長率と WACC パラメータを取得する必要があります..."}
ツール呼び出しの結果が正しくないと感じた場合は、このファイルを直接開いて問題を特定できます。jq を使って素早くフィルタリングすることも可能です:
# ツール呼び出しの結果のみを表示
cat .dexter/scratchpad/2026-03-27-*.jsonl | jq 'select(.type == "tool_result")'
# Agent の推論プロセスを表示
cat .dexter/scratchpad/2026-03-27-*.jsonl | jq 'select(.type == "thinking")'
よくあるトラブルシューティング
1. 実行時に OPENAI_API_KEY not found と表示される
最も一般的なエラーです。.env ファイルが存在し、パスが正しいか確認してください:
ls -la .env
ファイル内に OPENAI_API_KEY=... または OPENAI_API_KEY + OPENAI_BASE_URL の組み合わせがあることを確認してください。Defapi を使用する場合は、両方が必要です。
2. 金融データが空の結果を返す
Financial Datasets の無料データは AAPL、NVDA、MSFT に限定されています。他の銘柄を照会すると空の結果が返されます。以下の点を確認してください:
- financialdatasets.ai でサブスクリプションプランを確認
FINANCIAL_DATASETS_API_KEYが.envに正しく入力されているか確認
3. モデル呼び出しのタイムアウト
Anthropic と Google の API タイムアウトはデフォルトで 60 秒です。ネットワークが不安定な場合は、src/model/llm.ts 内で maxAttempts やリトライ待ち時間を調整してください。長期利用の場合は、Defapi を経由することで、より安定した最適化ルートを利用できます。
4. Agent が無限ループに陥る
Dexter には maxIterations(デフォルト 10 ステップ)の保護機能があります。タスクにそれ以上のステップが必要な場合は、src/agent/agent.ts でこのパラメータを調整してください。ステップを使い果たすと、Agent はその時点までの中間的な結論を最終結果として返します。
5. ツール呼び出しで返されるデータが不完全
Financial Datasets の limit パラメータは取得する年数を制御します。デフォルトでは 1 年分しか返さない場合があります。クエリ時に Dexter に対して明示的に limit=5 や limit=10 を指定させるようにしてください。
6. スクラッチパッドファイルが空、または生成されない
スクラッチパッドは src/agent/scratchpad.ts で管理されています。環境変数 SKIP_SCRATCHPAD=true が設定されている場合、ファイルは書き込まれません。.env にこの変数がないか確認してください。また、新しいクエリごとに新しいファイルが作成され、古いファイルには追記されません。
関連記事 / 発展的な使い方
WhatsApp 連携によるモバイル研究アシスタントの実現
Dexter は WhatsApp Gateway 経由でのメッセージ受信をサポートしています。スマホと Dexter が同一ネットワークにあれば設定可能です:
# QR コードをスキャンして WhatsApp アカウントを紐付け
bun run gateway:login
# Gateway を起動
bun run gateway
その後、WhatsApp で自分宛にメッセージを送ると、Dexter が返信します。これにより、通勤中に保有銘柄の最新財務データを照会できます。
詳細な設定は src/gateway/channels/whatsapp/README.md を参照してください。
評価スイートによる Agent 精度検証の実行
Dexter には LangSmith 駆動の評価フレームワークが組み込まれています:
# 全テストケースで評価を実行
bun run src/evals/run.ts
# ランダムに 10 問抽出して実行
bun run src/evals/run.ts --sample 10
評価は LLM-as-Judge 方式でスコアリングされ、結果は LangSmith ダッシュボードにアップロードされます。財務指標の計算ロジックを変更した場合、この評価スイートで品質を検証できます。
Ollama によるローカルモデルの使用
外部 API に一切依存したくない場合:
# Ollama を起動(事前にインストールが必要)
ollama serve
# .env で設定
OLLAMA_BASE_URL=http://127.0.0.1:11434
その後、CLI 内で ollama:qwen2.5 などのローカルモデルに切り替えます。注意:ローカルモデルのツール呼び出し能力は GPT-5.4 や Claude Sonnet ほど安定していない可能性があるため、低遅延・低コストが求められるシーンでの利用をお勧めします。
カスタム SKILL.md による新スキルの作成
Dexter のスキルは SKILL.md で定義されます。各スキルは YAML frontmatter(名称、説明)と Markdown 形式の指示で構成されます。新しいスキルを作成する手順:
src/skills/下に新しいディレクトリを作成(例:src/skills/dupont/)SKILL.mdを記述:
---
name: dupont-analysis
description: デュポン分析 - ROE を売上高純利益率、総資産回転率、財務レバレッジに分解します
---
# デュポン分析スキル
あなたは財務アナリストです。入力されたティッカーに対して以下のステップを実行してください:
1. 企業の純利益、売上高、総資産、株主資本を取得する
2. 3 つの分解指標を計算する:
- 売上高純利益率 = 純利益 / 売上高
- 総資産回転率 = 売上高 / 総資産
- 財務レバレッジ = 総資産 / 株主資本
3. ROE = 3 つの指標の積 を計算する
4. 業界平均と比較し、スコア (1-10) を付ける
- Dexter を再起動すると、新しいスキルが自動的に検出され、システムプロンプトに注入されます。
Defapi の活用による API コスト削減
LLM を頻繁に呼び出すユースケース(自動監視、定期レポート作成など)では、API コストが無視できません。Defapi を経由することで、費用を約 50% 削減できます:
# .env
OPENAI_API_KEY=your-defapi-api-key
OPENAI_BASE_URL=https://api.defapi.com/v1
Defapi はすべての v1/chat/completions 互換インターフェースに対応しているため、Dexter のコードを変更することなく、キーとベース URL を差し替えるだけで利用可能です。