Розробка AI-агентів для фінансового аналізу
AI-агент фінансового аналізу обробляє фінансові дані, формує аналітичні висновки, розраховує показники та генерує звіти. Комбінація Text-to-SQL для доступу до даних, Code Interpreter для розрахунків та LLM для інтерпретації дозволяє агенту відповідати на складні аналітичні питання без участі фінансового аналітика.
Ключові інструменти фінансового агента
from openai import OpenAI
from pydantic import BaseModel
from typing import Literal, Optional
import pandas as pd
import json
client = OpenAI()
financial_tools = [
{
"type": "function",
"function": {
"name": "query_financial_database",
"description": "Запит до фінансової бази даних (виручка, витрати, бюджет, факт)",
"parameters": {
"type": "object",
"properties": {
"sql_query": {"type": "string"},
"description": {"type": "string"},
},
"required": ["sql_query"]
}
}
},
{
"type": "function",
"function": {
"name": "calculate_financial_metrics",
"description": "Розраховуємо фінансові показники",
"parameters": {
"type": "object",
"properties": {
"metric": {
"type": "string",
"enum": ["EBITDA", "ROE", "ROA", "ROIC", "NPV", "IRR", "payback_period",
"gross_margin", "operating_margin", "net_margin", "current_ratio",
"debt_to_equity", "working_capital"]
},
"input_data": {"type": "object"},
},
"required": ["metric", "input_data"]
}
}
},
{
"type": "function",
"function": {
"name": "build_financial_model",
"description": "Побудуємо фінансову модель (DCF, бюджет, P&L прогноз)",
"parameters": {
"type": "object",
"properties": {
"model_type": {"type": "string", "enum": ["dcf", "budget_variance", "pnl_forecast"]},
"parameters": {"type": "object"},
},
"required": ["model_type", "parameters"]
}
}
},
{
"type": "function",
"function": {
"name": "generate_financial_report",
"description": "Сформуємо фінансовий звіт",
"parameters": {
"type": "object",
"properties": {
"report_type": {"type": "string"},
"period": {"type": "string"},
"data": {"type": "object"},
},
"required": ["report_type", "period"]
}
}
},
]
def calculate_financial_metrics(metric: str, input_data: dict) -> str:
"""Точний розрахунок фінансових показників"""
calculators = {
"EBITDA": lambda d: d["revenue"] - d["cogs"] - d["opex"] + d.get("da", 0),
"gross_margin": lambda d: (d["revenue"] - d["cogs"]) / d["revenue"] * 100,
"operating_margin": lambda d: d["ebit"] / d["revenue"] * 100,
"ROE": lambda d: d["net_income"] / d["equity"] * 100,
"ROA": lambda d: d["net_income"] / d["total_assets"] * 100,
"current_ratio": lambda d: d["current_assets"] / d["current_liabilities"],
"debt_to_equity": lambda d: d["total_debt"] / d["equity"],
}
calculator = calculators.get(metric)
if not calculator:
return f"Metric {metric} not implemented"
try:
result = calculator(input_data)
return json.dumps({
"metric": metric,
"result": round(result, 4),
"unit": "%" if metric in ["gross_margin", "operating_margin", "ROE", "ROA"] else "x",
})
except KeyError as e:
return f"Missing required field: {e}"
except ZeroDivisionError:
return "Division by zero: check denominator values"
Агент аналізу план-факт
FINANCIAL_ANALYST_PROMPT = """Ти — фінансовий аналітик CFO-рівня.
Твої завдання:
1. Аналізувати фінансові дані точно та методологічно коректно
2. Використовуй інструменти для розрахунків — ніколи не рахуй в голові
3. При відхиленнях план/факт — виявляй причини (ефект ціни, ефект обсягу, мікс)
4. Давай конкретні рекомендації, а не абстрактні спостереження
5. Вказуй на аномалії та потенційні ризики
Методологія:
- При аналізі P&L розбивай відхилення на цінові та обсягові
- При оцінці ефективності порівнюй з標standard бенчмарками індустрії
- При прогнозах — вказуй інтервал впевненості та ключові припущення"""
def financial_analysis_agent(question: str, context_data: dict = None) -> str:
messages = [
{"role": "system", "content": FINANCIAL_ANALYST_PROMPT},
{"role": "user", "content": question},
]
if context_data:
messages.insert(1, {
"role": "system",
"content": f"Контекст даних:\n{json.dumps(context_data, indent=2)}"
})
# Агентний цикл
for _ in range(8):
response = client.chat.completions.create(
model="gpt-4o",
messages=messages,
tools=financial_tools,
)
msg = response.choices[0].message
messages.append(msg)
if not msg.tool_calls:
return msg.content
for tool_call in msg.tool_calls:
tool_name = tool_call.function.name
tool_args = json.loads(tool_call.function.arguments)
result = execute_financial_tool(tool_name, tool_args)
messages.append({
"role": "tool",
"tool_call_id": tool_call.id,
"content": result,
})
Практичний кейс: аналіз план-факт виробничої компанії
Завдання: щомісячний аналіз план-факт P&L з розбивкою по продуктовим лінійкам та регіонам. Раніше займав 2 дні фінансового аналітика.
Дані: PostgreSQL, 8 таблиць (actual_pnl, budget_pnl, products, regions, cost_centers...).
Приклад взаємодії:
Запит: "Проаналізуй виконання бюджету по виручці за март 2026. Вияви причини відхилень."
Агент:
-
query_financial_database— план vs факт по продуктам -
calculate_financial_metrics— відсоток виконання по кожній лінійці -
query_financial_database— обсяги та ціни для price/volume decomposition -
build_financial_model— дані waterfall chart - Інтерпретація: "Загальне відхилення -8.3M (-4.2%). Основні фактори: Скорочення продажів продукту А (-5.1M, обсяговий ефект), частково компенсовано зростанням цін на продукт Б (+2.1M, цінний ефект). Центральний регіон — один з перевиконанням (+1.8M), Урал — найбільше відставання (-6.2M)..."
Результати:
- Час підготовки щомісячного звіту: 2 дні → 3.5 години
- Охоплення показників: ідентично
- Якість інтерпретацій (оцінка CFO): 4.1/5.0
Ключова проблема: агент добре рахує, але інтерпретації іноді занадто обережні. Регулюється через систем-промпт.
Автоматичне виявлення аномалій
def detect_anomalies_in_data(financial_data: pd.DataFrame) -> list[dict]:
"""Статистичне виявлення аномалій перед передачею в LLM"""
anomalies = []
for column in financial_data.select_dtypes(include="number").columns:
mean = financial_data[column].mean()
std = financial_data[column].std()
z_scores = (financial_data[column] - mean) / std
outliers = financial_data[abs(z_scores) > 2.5]
if not outliers.empty:
for idx, row in outliers.iterrows():
anomalies.append({
"column": column,
"value": row[column],
"z_score": round(z_scores[idx], 2),
"period": str(idx),
})
return anomalies
Часовий розклад
- Проектування фінансового агента: 1 тиждень
- Розробка інструментів та SQL-шару: 2–3 тижні
- Інтеграція з ERP/1C: 2–3 тижні
- Верифікація розрахунків з фінансистами: 2 тижні
- Всього: 7–10 тижнів







