FinGPTオープンソース金融LLMの導入と活用ガイド
機械学習Python自然言語処理
結論
FinGPTは、AI4Finance Foundationが開発したオープンソースの金融特化LLMである。BloombergGPTの学習コスト(推定100万ドル超)に対し、300ドル未満のファインチューニングコストで同等以上のベンチマーク性能を達成している。個人投資家やスタートアップがGPT-4等の商用APIに依存せず、自前の金融NLPモデルを構築する選択肢として有効。
| 比較項目 | BloombergGPT | FinGPT | GPT-4 |
|---|---|---|---|
| 学習コスト | 100万ドル超 | 300ドル未満 | N/A(API課金) |
| オープンソース | No | Yes | No |
| 金融特化 | Yes | Yes | No(汎用) |
| ローカル実行 | 不可 | 可能 | 不可 |
| API費用/月 | N/A | 0円 | 数万〜数十万円 |
FinGPTとは
FinGPTは、金融分野に特化したオープンソースLLMプロジェクトである。Llama 2、Falcon、MPTなどのオープンソースベースモデルを金融データでファインチューニングし、以下のタスクに対応する。
対応タスク
| タスク | 説明 | 活用例 |
|---|---|---|
| センチメント分析 | ニュース・SNSの感情極性判定 | 銘柄ごとのセンチメントスコア算出 |
| ニュース要約 | 金融ニュースの要点抽出 | 決算発表の自動サマリ |
| 金融QA | 財務データに関する質問応答 | 「トヨタのPERは?」への回答 |
| 銘柄推奨 | 複数銘柄の比較分析 | ポートフォリオ構築支援 |
| リスク評価 | 企業・市場リスクの定量化 | リスク管理レポート生成 |
アーキテクチャ
[ベースモデル] → [金融データでLoRAファインチューニング] → [FinGPT]
↓ ↓ ↓
Llama 2 7B/13B ニュース、SEC Filing、 センチメント分析、
Falcon 7B 決算レポート、SNSデータ 金融QA等に対応
MPT 7B
システム要件
最小要件(推論のみ)
| 項目 | 7Bモデル | 13Bモデル |
|---|---|---|
| GPU VRAM | 8GB以上 | 16GB以上 |
| RAM | 16GB以上 | 32GB以上 |
| ストレージ | 20GB以上 | 40GB以上 |
| 推奨GPU | RTX 3070以上 | RTX 3090 / A100 |
ファインチューニング要件
| 項目 | LoRA(推奨) | フルファインチューニング |
|---|---|---|
| GPU VRAM | 16GB以上 | 80GB以上(A100必須) |
| 学習時間 | 数時間 | 数日 |
| コスト(クラウド) | 10〜50ドル | 500ドル以上 |
インストール・セットアップ
環境構築
# リポジトリのクローン
git clone https://github.com/AI4Finance-Foundation/FinGPT.git
cd FinGPT
# 仮想環境の作成
python -m venv venv
source venv/bin/activate # Windows: venv\Scripts\activate
# 依存関係のインストール
pip install -r requirements.txt
# PyTorch(CUDA対応)のインストール
pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118
必要なライブラリ
pip install transformers>=4.34.0
pip install peft>=0.5.0 # LoRA/QLoRA用
pip install bitsandbytes>=0.41.0 # 量子化用
pip install datasets>=2.14.0
pip install accelerate>=0.23.0
pip install sentencepiece
事前学習済みモデルのダウンロード
from transformers import AutoModelForCausalLM, AutoTokenizer
# FinGPT-Forecastモデル(センチメント分析特化)
model_name = "FinGPT/fingpt-forecaster_dow30_llama2-7b_lora"
tokenizer = AutoTokenizer.from_pretrained(model_name)
model = AutoModelForCausalLM.from_pretrained(
model_name,
device_map="auto",
torch_dtype="auto",
)
ファインチューニング方法
LoRA(Low-Rank Adaptation)
LoRAは、大規模モデルの一部のパラメータのみを学習することで、計算コストを大幅に削減する手法。
from peft import LoraConfig, get_peft_model, TaskType
# LoRA設定
lora_config = LoraConfig(
r=8, # LoRAのランク
lora_alpha=16,
target_modules=["q_proj", "v_proj"], # 適用するモジュール
lora_dropout=0.05,
bias="none",
task_type=TaskType.CAUSAL_LM,
)
# モデルにLoRAを適用
model = get_peft_model(model, lora_config)
model.print_trainable_parameters()
# 出力例: trainable params: 4,194,304 || all params: 6,742,609,920 || trainable%: 0.06%
QLoRA(Quantized LoRA)
QLoRAは4bit量子化とLoRAを組み合わせ、さらにメモリ使用量を削減する。
from transformers import BitsAndBytesConfig
import torch
# 4bit量子化設定
bnb_config = BitsAndBytesConfig(
load_in_4bit=True,
bnb_4bit_quant_type="nf4",
bnb_4bit_compute_dtype=torch.bfloat16,
bnb_4bit_use_double_quant=True,
)
# 量子化モデルの読み込み
model = AutoModelForCausalLM.from_pretrained(
"meta-llama/Llama-2-7b-hf",
quantization_config=bnb_config,
device_map="auto",
)
# LoRAを適用
model = get_peft_model(model, lora_config)
学習の実行
from transformers import TrainingArguments, Trainer
from datasets import load_dataset
# 金融データセットの読み込み
dataset = load_dataset("FinGPT/fingpt-sentiment-train")
# 学習設定
training_args = TrainingArguments(
output_dir="./fingpt-finetuned",
num_train_epochs=3,
per_device_train_batch_size=4,
gradient_accumulation_steps=4,
learning_rate=2e-4,
fp16=True,
logging_steps=10,
save_strategy="epoch",
)
trainer = Trainer(
model=model,
args=training_args,
train_dataset=dataset["train"],
)
trainer.train()
センチメント分析の実装
基本的な使用例
def analyze_sentiment(text: str, model, tokenizer) -> dict:
"""金融ニュースのセンチメント分析"""
prompt = f"""Analyze the sentiment of this financial news.
Output only: positive, negative, or neutral.
News: {text}
Sentiment:"""
inputs = tokenizer(prompt, return_tensors="pt").to(model.device)
with torch.no_grad():
outputs = model.generate(
**inputs,
max_new_tokens=10,
temperature=0.1,
do_sample=False,
)
response = tokenizer.decode(outputs[0], skip_special_tokens=True)
sentiment = response.split("Sentiment:")[-1].strip().lower()
return {
"text": text,
"sentiment": sentiment,
"confidence": 0.85, # 実際は確率から算出
}
# 使用例
news = "トヨタ自動車、2024年度決算で過去最高益を更新。EV戦略も順調に進展。"
result = analyze_sentiment(news, model, tokenizer)
print(result)
# {'text': '...', 'sentiment': 'positive', 'confidence': 0.85}
ベンチマーク精度比較
金融センチメント分析タスク(FPB, FiQA-SA, TFNS)での精度比較。
| モデル | FPB Acc | FiQA-SA F1 | TFNS Acc | 平均 |
|---|---|---|---|---|
| FinGPT (Llama2-7B) | 87.2% | 82.5% | 89.1% | 86.3% |
| GPT-4 | 85.8% | 84.1% | 87.3% | 85.7% |
| Claude 3 | 84.5% | 83.2% | 86.8% | 84.8% |
| BloombergGPT | 84.0% | 81.8% | 85.5% | 83.8% |
| FinBERT | 79.5% | 75.3% | 82.1% | 78.9% |
FinGPTは金融特化タスクにおいて、汎用LLMと同等以上の精度を達成している。
日本語金融テキストへの対応
現状
FinGPTの事前学習データは主に英語の金融テキストであり、日本語への対応は限定的。日本語で使用する場合は以下のアプローチが必要。
日本語対応のアプローチ
| アプローチ | 難易度 | コスト | 精度 |
|---|---|---|---|
| 日本語データで追加ファインチューニング | 高 | 中 | 高 |
| 日本語ベースモデル(ELYZA等)を使用 | 中 | 低 | 中 |
| 翻訳パイプライン(日→英→分析→日) | 低 | 低 | 中 |
日本語ファインチューニング例
# 日本語金融ニュースデータセットの準備
japanese_data = [
{"text": "日経平均株価が4万円台を回復", "label": "positive"},
{"text": "円安が進行し輸出企業に追い風", "label": "positive"},
{"text": "半導体不足で生産調整を発表", "label": "negative"},
]
# ELYZAベースでファインチューニング
model_name = "elyza/ELYZA-japanese-Llama-2-7b"
# ... LoRA設定と学習コードは同様
FinRLとの連携
FinRLは、同じAI4Finance Foundationが開発した強化学習ベースの自動売買フレームワーク。FinGPTと組み合わせることで、NLPベースのシグナル生成と強化学習ベースの売買判断を統合できる。
アーキテクチャ
[ニュース/SNS] → [FinGPT: センチメント分析] → [センチメントスコア]
↓
[価格データ] → [テクニカル指標] ─────────────────→ [FinRL: 強化学習エージェント]
↓
[売買シグナル]
統合コード例
from finrl.agents.stablebaselines3.models import DRLAgent
import numpy as np
def integrate_sentiment_with_finrl(sentiment_scores: list, price_data: np.ndarray):
"""FinGPTのセンチメントスコアをFinRLの状態空間に追加"""
# センチメントスコアを特徴量として追加
enhanced_state = np.concatenate([
price_data, # OHLCV + テクニカル指標
np.array(sentiment_scores).reshape(-1, 1), # センチメント
], axis=1)
return enhanced_state
# FinRLエージェントの学習
env = StockTradingEnv(enhanced_state)
agent = DRLAgent(env=env)
model = agent.get_model("ppo")
trained_model = agent.train_model(model, total_timesteps=100000)
ローカルGPU vs クラウドのコスト比較
推論コスト(月間10万クエリ想定)
| 環境 | 初期費用 | 月額コスト | 合計(1年) |
|---|---|---|---|
| ローカル(RTX 4090) | 約30万円 | 電気代約5,000円 | 約36万円 |
| Google Colab Pro+ | 0円 | 約7,000円 | 約8.4万円 |
| RunPod(A100) | 0円 | 約15,000円(使用時間次第) | 約18万円 |
| AWS(g5.xlarge) | 0円 | 約20,000円 | 約24万円 |
| GPT-4 API | 0円 | 約50,000円 | 約60万円 |
ファインチューニングコスト比較
| 環境 | 7Bモデル(3エポック) | 13Bモデル(3エポック) |
|---|---|---|
| Google Colab Pro+ | 約1,000円(4時間) | 非対応(VRAM不足) |
| RunPod A100 | 約3,000円(2時間) | 約6,000円(4時間) |
| Lambda Labs A100 | 約2,500円(2時間) | 約5,000円(4時間) |
| ローカルRTX 4090 | 電気代のみ(8時間) | 非推奨(VRAM 24GB) |
推奨構成
| 用途 | 推奨環境 | 理由 |
|---|---|---|
| 実験・学習 | Google Colab Pro+ | 低コスト、セットアップ不要 |
| 本番推論(小規模) | RunPod Serverless | 従量課金で無駄がない |
| 本番推論(大規模) | ローカルGPU | 長期的にコスト優位 |
| ファインチューニング | RunPod/Lambda Labs | A100が時間単位で使える |
実践的な活用例
ニュースベースのアラートシステム
import asyncio
from datetime import datetime
async def news_alert_system(tickers: list[str]):
"""リアルタイムニュースセンチメントアラート"""
while True:
for ticker in tickers:
# ニュース取得(実際はRSSやAPI)
news = fetch_latest_news(ticker)
for article in news:
sentiment = analyze_sentiment(article["title"], model, tokenizer)
# ネガティブニュースをアラート
if sentiment["sentiment"] == "negative":
send_alert(
ticker=ticker,
headline=article["title"],
sentiment=sentiment,
timestamp=datetime.now(),
)
await asyncio.sleep(60) # 1分ごとにチェック
# 実行
asyncio.run(news_alert_system(["7203", "6758", "9984"]))
まとめ
FinGPTは、以下の条件に当てはまる場合に有効な選択肢となる。
| 条件 | FinGPTが適切 | 商用API(GPT-4等)が適切 |
|---|---|---|
| コスト重視 | ○ | × |
| カスタマイズ必須 | ○ | △ |
| 日本語対応 | △(追加作業必要) | ○ |
| セットアップ時間 | × | ○ |
| データプライバシー | ○(ローカル実行可) | △ |
参考リソース
免責事項: 本記事は情報提供を目的としており、投資助言ではありません。金融商品の取引は自己責任で行ってください。モデルの精度は学習データや市場環境により変動します。