千里眼 — AIが株価ニュースを読み、翌日の値動きを予測する
課題
株式ニュースは毎日大量に発信されますが、個人投資家がすべてを読み、翌日の値動きを判断するのは現実的ではありません。
解決策
5種類の企業データとニュースをLLM(大規模言語モデル)に入力し、翌日の株価変動率を自動予測するWebサービスを構築しました。
成果
毎日自動で予測を実行し、日本語・英語の両方で senrigan.tech にて結果を公開しています。
![]()
なぜこのプロジェクトを作ったのか
2023年、英国の金融比較サイト Finder が行った実験が注目を集めました。ChatGPTに38銘柄を選ばせたポートフォリオが、63日間で +4.9% のリターンを記録したのです。同じ期間、英国で人気トップ10のファンド(HSBC、Fidelity等)の平均は -0.8%。2年間の累計では +41.97% 対 +27.63% と、14ポイント以上の差がつきました。
参考: ChatGPT can pick stocks better than your fund manager (CNN Business)
もちろん限定的な実験であり、これだけで「AIが投資のプロに勝った」と結論づけることはできません。しかし、LLMが企業ニュースを「読み」、投資判断に活かせる可能性があることは示されました。
「日本株のニュースでも、同じことができるのではないか?」
この問いが、千里眼プロジェクトの出発点です。
千里眼が解決する課題
個人投資家の情報処理の限界
日本市場では毎日数百件の適時開示情報(TDnet)やニュースが発信されます。決算発表、業績修正、配当予想など、それぞれが株価に影響を与える可能性がありますが、すべてを読み込んで判断するには膨大な時間がかかります。
従来のアプローチの限界
従来の株価予測は、LSTM や ARIMA といった数値的な時系列モデルが主流でした。しかし、これらのモデルには根本的な制約があります。ニュースという自然言語情報を扱えないのです。
「経常利益51%上方修正」というニュースが出たとき、それが株価にどう影響するかは、数値データだけでは判断できません。ニュースの文脈、業界の状況、市場の期待値を総合的に理解する必要があります。
千里眼のアプローチ
千里眼は、LLM(大規模言語モデル)をファインチューニング(追加学習)することで、この課題に取り組んでいます。企業の数値データとニュースの自然言語情報を統合し、翌日の株価変動を予測します。
どう動くのか
入力データ(5種類を統合)
千里眼は、1つのニュースに対して以下の5種類のデータを組み合わせて予測を行います。
| データ種別 | 内容 | 例 |
|---|---|---|
| 企業情報 | 業種、時価総額、会社概要 | 化学、289億円、アクリル原料粘着剤大手 |
| ニュース | 適時開示、決算発表等 | 「経常利益51%上方修正、過去最高益を上乗せ」 |
| 株価データ | 直近5営業日のOHLCV | 始値、高値、安値、終値、出来高 |
| 財務データ | 2年分の売上・利益率・ROE等 | 売上高413億円、利益率9.26%、ROE 8.38% |
| マクロ指標 | CPI、GDP成長率、政策金利等 | CPI 107.95、政策金利0.75%、USD/JPY 151.37 |
出力(3種類の予測値)
予測結果(JSON形式):
{
"当日終値→翌日始値": "+1.2%", ← オーバーナイトの変動
"当日終値→翌日終値": "+2.5%", ← 1日通しての変動
"翌日始値→翌日終値": "+1.3%" ← 日中の変動
}
加えて、LLMが予測の根拠となる分析テキスト(予測理由)も日本語・英語で生成します。
システム全体像
ニュース発信 → データ収集・統合 → AI予測 → データ同期 → Web表示
(PHP/MySQL) (LLM API) (Python) (Next.js)
┌───────────────────┐ ┌──────────────────┐ ┌──────────────┐
│ meloik │ │ assetai_firebase │ │ stockSite │
│ │ │ │ │ │
│ ・ニュース収集 │ │ ・MySQL → │ │ ・予測結果 │
│ ・データ統合 │ ──► │ Firestore同期 │ ──► │ 表示 │
│ ・LLM予測実行 │ │ ・差分更新 │ │ ・日英対応 │
│ ・翻訳処理 │ │ ・コスト最適化 │ │ │
│ │ │ │ │ │
└───────────────────┘ └──────────────────┘ └──────────────┘
VPS (PHP/MySQL) VPS (Python) Vercel (Next.js)
3つのサブシステムが連携し、ニュースの発信から予測結果の表示まで、すべて自動で動作します。
技術的な挑戦
Challenge 1: 自分だけのLLMを作る — ファインチューニングの試行錯誤
千里眼の中核は、株価予測に特化したLLMです。汎用のLLMでは精度が出ないため、独自のデータセットで追加学習(ファインチューニング)を行いました。
しかし、最適な方法にたどり着くまでに、3つのフェーズを経ています。
| フェーズ | 環境 | モデル | 結果 |
|---|---|---|---|
| 1. ローカルGPU | RTX 3060 (6GB) | ELYZA Llama-3-JP-8B | VRAM不足で学習不可 |
| 2. Google Colab | T4 GPU (15GB) | ELYZA, LLM-jp, rinna | 精度不足・学習時間が長い |
| 3. OpenAI API | クラウド | gpt-4o-mini | 成功 — 8分で学習完了 |
Phase 1(ローカル) では、手元のノートPCのGPU(6GB)で8Bパラメータのモデルを学習しようとしましたが、メモリ不足で断念。推論(AIに質問すること)は動きましたが、学習には推論の数倍のメモリが必要でした。
Phase 2(Google Colab) では、LoRA(Low-Rank Adaptation)という軽量化技術を使い、3つのオープンソースモデルで試行錯誤しました。メモリ制限のためにデータを大幅に削る必要があり、精度が出ませんでした。ただし、この過程で「LLMに新しい知識を学習させることは可能」という確信を得ました。
Phase 3(OpenAI API) で方針を転換。OpenAIのファインチューニングAPIを使うことで、5種類のデータをすべて入力でき、わずか8分で学習が完了しました。1,009件の独自データセットで訓練した結果、実用的な精度の予測モデルが完成しました。
Challenge 2: 多言語対応 — 翻訳LLMの選定
千里眼は日本語と英語の両方でサービスを提供しています。翻訳処理にもLLMを使用していますが、プロバイダの選定で苦労がありました。
当初はコストの安さからDeepSeekを採用しましたが、以下の問題が発生しました。
- 処理速度: レスポンスに数分かかり、タイムアウトが頻発
- 言語混入: 日→英翻訳の出力に中国語が混ざる
- データ漏洩: 入力データの一部をそのまま出力してしまう
最終的にすべてのLLM処理をOpenAI(ChatGPT)に統一することで、品質と安定性の問題を解決しました。
学び: LLMプロバイダは、コストだけでなく品質・安定性・言語対応を総合的に評価する必要があります。
Challenge 3: MySQL → Firestore移行
バックエンドのMySQLからフロントエンド用のFirestore(NoSQLデータベース)へのデータ同期でも、RDBとNoSQLの設計思想の違いに苦労しました。
- インデックス設計: MySQLでは当然の複合インデックスが、Firestoreでは1つずつ手動で作成する必要がある
- データの重複書き込み防止: Firestoreは書き込み課金のため、UNIXタイムスタンプによる差分更新の仕組みを自作
- コスト最適化: 不要な同期処理の停止やキャッシュ戦略の調整で、Firebase利用コストを削減
技術スタック
| レイヤー | 技術 | 役割 |
|---|---|---|
| AI予測 | OpenAI gpt-4o-mini (Fine-tuned) | 株価変動予測 |
| 予測理由生成 | OpenAI gpt-5-nano | ニュース分析・理由テキスト生成 |
| 翻訳・要約 | OpenAI gpt-5-mini | 日→英翻訳、ニュース要約 |
| バックエンド | PHP / MySQL | データ収集・統合・バッチ処理 |
| データ同期 | Python / Firestore | MySQL→Firestoreの差分更新 |
| フロントエンド | Next.js / Vercel | Web UI(ISR、日英対応) |
| インフラ | さくらVPS × 2 | バッチ処理・データ同期サーバー |
検証した技術
ファインチューニングの過程で、以下の技術を実際に試行・検証しました。
| 技術 | 概要 | 使用した場面 |
|---|---|---|
| LoRA | 全パラメータではなく低ランク差分のみを学習する軽量化手法 | Colab上での3モデルの学習 |
| 8bit量子化 | モデルの精度を保ちつつメモリ使用量を半減させる技術 | ローカル・Colabでのモデルロード |
| QLoRA | 量子化 + LoRA の組み合わせ | Colabでの実質的な学習手法 |
| GGUF変換 | HuggingFaceモデルをCPU推論可能な形式に変換 | ローカルでの推論テスト |
| SFTTrainer | HuggingFace TRLライブラリの教師ありファインチューニングツール | Colabでの学習実行 |
訓練データの設計
独自に構築した訓練データセットの特徴です。
| 項目 | 値 |
|---|---|
| データ件数 | 1,009件 |
| トークン数 | 約130万トークン |
| データ構造 | 5種類のデータを1つのJSONに統合 |
| 正解ラベル | 翌日の実際の株価変動率(3種類) |
| 対象市場 | 東証プライム・スタンダード・グロース |
ニュースやIR情報の出典としては「適時開示情報閲覧サービス(TDnet)」など、企業が公的に発表した情報をもとにしています。正確な情報は必ず原典をご確認ください。
開発プロセスの詳細
本プロジェクトの開発過程を、全8回の連載記事で詳しく解説しています。
| 回 | テーマ |
|---|---|
| 第1回 | きっかけと全体像 |
| 第2回 | ローカルGPUでの挑戦と挫折 |
| 第3回 | LoRAと量子化の技術解説 |
| 第4回 | Google Colabで株価予測に挑む |
| 第5回 | OpenAI APIファインチューニング |
| 第6回 | 訓練データの設計 |
| 第7回 | 翻訳LLMの選定 — DeepSeekからChatGPTへ |
| 第8回 | MySQL→Firestore移行と本番運用 |
学んだこと
データの質がモデルの性能を決める
3つのオープンソースモデルと1つの商用モデル、計4つのアプローチを試した結果、最も重要だったのは「モデルの大きさ」ではなく「入力データの質と量」でした。Colabで情報を削って学習させたモデルより、OpenAI APIでフルデータを入力したモデルの方が圧倒的に精度が高かったのです。
個人開発でもLLMファインチューニングは実現可能
ファインチューニングは大企業だけのものではありません。OpenAI APIを使えば、1,009件のデータセットで、約8分、数ドルのコストで独自モデルを構築できます。重要なのは、質の良い訓練データを準備することです。
LLMプロバイダは総合的に評価する
コストだけで選ぶと、品質面で後から問題が出ます。特に多言語処理では、モデルの学習データの言語バランスが出力品質に直結します。安定性・品質・コストのバランスを見極めることが重要です。
免責事項
本サービスの予測結果は、LLMによる自動生成であり、投資助言ではありません。投資判断はご自身の責任で行ってください。ニュースやIR情報の出典としては「適時開示情報閲覧サービス(TDnet)」など企業が公的に発表した情報をもとにしています。正確な情報は必ず原典をご確認ください。