← Повернутися до блогу
/Бізнес-аналітика/8 хв читання

AI-прогнозування продажів: бачити на тиждень уперед без дата-саєнтиста

GPT-4o + Python прогнозують попит, виручку й залишки з точністю до 85%. Код, архітектура, ціна. Без дата-саєнтиста, Spark і enterprise-бюджету.

AIавтоматизаціяпрогнозуванняаналітикапродажіPython

Український бізнес дивиться назад. Виручка за вчора, залишки на сьогодні, кількість замовлень за тиждень. Усе це — ретроспектива. Вона відповідає на питання «що сталося». Але не відповідає на «що буде завтра».

А саме це питання коштує грошей. Скільки товару замовити на наступний тиждень? Чи вистачить готівки на рахунку через три дні? Яка категорія просяде в серпні? Власник відповідає на це інтуїтивно. Інтуїція помиляється в середньому на 30–40%. AI-прогноз — на 10–15%.

Ми вже писали, як збирати дані з українських джерел і як перетворювати звіти на дії. Але звіт і дія — це про минуле. Прогноз — це про майбутнє. Ось як його зібрати без дата-саєнтиста й enterprise-бюджету.

Чому Excel не прогнозує

Excel може побудувати лінію тренду. =FORECAST.LINEAR() — і готово. Але лінійний тренд працює тільки на стабільних даних без сезонності. Тобто майже ніколи.

Реальні продажі українського бізнесу мають щонайменше п'ять шарів нестабільності:

  1. Тижнева сезонність. Понеділок і п'ятниця — пік. Субота й неділя — провал. Для e-commerce різниця може бути двократною.
  2. Місячна сезонність. Початок місяця — зарплати, більше покупок. Кінець місяця — спад. Це не глобальний тренд, це локальна українська реальність.
  3. Курсові коливання. Стрибок долара на 1 грн — і середній чек в інтернет-магазині електроніки змінюється на 5–8% протягом двох днів.
  4. Свята й форс-мажори. Державні свята, відключення світла, повітряні тривоги — усе це ламає тижневий патерн. У 2026 році жодна Excel-формула цього не враховує.
  5. Акції та маркетинг. Запустили розсилку через SendPulse — продажі злетіли на 200% на один день. Наступного дня — провал, бо попит вичерпали. Лінійний тренд бачить «зростання» і завищує прогноз на тиждень уперед.

Щоб врахувати хоча б три з цих п'яти шарів, потрібна модель, яка бачить патерни, а не просто лінію. І тут на допомогу приходить AI.

Як це працює: архітектура прогнозного пайплайну

Схема проста: історичні дані → AI-модель → прогноз на N днів → сповіщення в Telegram.

Google Sheets / CRM API ──→ Python-скрипт ──→ GPT-4o (прогноз) ──→ Telegram
                                │
                                └── збирає історію, формує контекст, відправляє прогноз

Жодного машинного навчання в класичному сенсі. Ми не тренуємо модель на GPU. Ми даємо GPT-4o історичні дані й контекст — і просимо передбачити наступний тиждень. Це називається in-context forecasting. Дослідження 2024–2025 років показують, що GPT-4 і Claude 3.5 дають точність прогнозування часових рядів на рівні спеціалізованих статистичних моделей (ARIMA, Prophet) на горизонті до 30 днів — і не потребують налаштування.

Ось як це виглядає в коді.

Крок 1: збираємо 90 днів історії

import requests
from datetime import datetime, timedelta
import json

# Приклад: дані з Google Sheets (продажі по днях за 90 днів)
# У реальності — підставте ваші дані
def fetch_sales_history(sheet_id: str, range_name: str) -> list[dict]:
    # gspread або Google Sheets API — отримуємо рядки
    # Формат: [{"date": "2026-04-17", "revenue": 12500, "orders": 34, "category": "електроніка"}, ...]
    ...
    return records

Крок 2: формуємо промпт із контекстом

Головне — дати моделі не просто цифри, а контекст: день тижня, свята, курс валют, маркетингові акції. Без контексту прогноз буде середньою температурою по лікарні.

from openai import OpenAI

client = OpenAI(api_key="ваш_ключ")

def build_forecast_prompt(history: list[dict], days_ahead: int = 7) -> str:
    # Збираємо контекст
    today = datetime.now()
    next_week = [today + timedelta(days=i) for i in range(1, days_ahead + 1)]

    # Перелік українських свят на липень 2026
    holidays = ["28 липня — День Української Державності (вихідний)"]

    current_usd_rate = 41.20  # отримати через API ПриватБанку або Monobank

    prompt = f"""
Ти — фінансовий аналітик. У тебе є історія щоденних продажів інтернет-магазину
за останні 90 днів. Спрогнозуй виручку та кількість замовлень на наступні 7 днів.

Важливий контекст:
- Поточний курс USD/UAH: {current_usd_rate} грн
- День тижня має ЗНАЧНИЙ вплив: пн-пт — пік, сб-нд — спад на 40-60%
- Свята: {', '.join(holidays) if holidays else 'немає'}
- Тренд за останні 30 днів: виручка зростає/падає/стабільна (визнач із даних)

Дати для прогнозу:
{', '.join(d.strftime('%Y-%m-%d (%A)') for d in next_week)}

Історичні дані (останні 90 днів):
{json.dumps(history[-90:], ensure_ascii=False, indent=2)}

Формат відповіді — СТРОГИЙ JSON без жодного тексту до або після:
{{
  "forecast": [
    {{"date": "YYYY-MM-DD", "revenue": число, "orders": число, "confidence": "high|medium|low"}},
    ...
  ],
  "summary": "2-3 речення українською: головний висновок, ризики, рекомендація.",
  "anomalies": ["якщо є — конкретні дні з нетиповою поведінкою"]
}}
"""
    return prompt

prompt = build_forecast_prompt(fetch_sales_history("SHEET_ID", "Продажі!A:D"))
response = client.chat.completions.create(
    model="gpt-4o",  # для прогнозування потрібна сильна модель
    messages=[{"role": "user", "content": prompt}],
    temperature=0.2,  # низька температура — стабільні прогнози
    response_format={"type": "json_object"},  # JSON mode
)

forecast = json.loads(response.choices[0].message.content)

Чотири речі, які тут важливі:

  • Мінімум 90 днів історії. Менше — модель не вловить тижневу й місячну сезонність. Більше 180 — зазвичай зайве, старі патерни вже не релевантні.
  • Контекст про день тижня. Без цього GPT видасть рівний прогноз на всі дні. Це найчастіша помилка.
  • temperature=0.2. Для прогнозування потрібна стабільність, не креативність. 0.2 — оптимально. 0.0 дає занадто «впевнені» цифри без варіативності.
  • GPT-4o, не mini. Для прогнозування різниця суттєва. GPT-4o mini гірше враховує складний контекст (свята + курс + день тижня одночасно). Різниця в ціні: ~$0.03 проти ~$0.005 за один прогноз. За місяць — близько $1 проти $0.15. Воно того варте.

Крок 3: порівнюємо прогноз із фактом

Прогноз без зворотного зв'язку — марний. Потрібно регулярно порівнювати, що модель передбачила і що сталося насправді. Це називається backtesting.

def backtest_forecast(predicted: float, actual: float) -> dict:
    error_pct = abs(predicted - actual) / actual * 100
    if error_pct <= 10:
        status = "good"
    elif error_pct <= 20:
        status = "acceptable"
    else:
        status = "poor"

    return {
        "predicted": predicted,
        "actual": actual,
        "error_pct": round(error_pct, 1),
        "status": status,
    }

Раз на тиждень скрипт порівнює прогноз із фактом і додає запис у Google Таблицю. За місяць ви бачите реальну точність: «за липень середня похибка — 12%, у 80% днів прогноз потрапив у ±15%». Якщо точність падає — щось змінилося в бізнесі (нова категорія товарів, зміна аудиторії). Це сигнал оновити промпт або додати новий контекст.

Крок 4: доставляємо прогноз у Telegram

BOT_TOKEN = "ваш_токен"
CHAT_ID = "ваш_чат"

text = f"📈 *Прогноз на {days_ahead} днів*\n\n"
for day in forecast["forecast"]:
    emoji = "🟢" if day["confidence"] == "high" else "🟡" if day["confidence"] == "medium" else "🔴"
    text += f"{emoji} {day['date']}: {day['revenue']:,} грн, {day['orders']} замовлень\n"

text += f"\n{forecast['summary']}"

requests.post(
    f"https://api.telegram.org/bot{BOT_TOKEN}/sendMessage",
    json={"chat_id": CHAT_ID, "text": text, "parse_mode": "Markdown"},
)

Українська специфіка: що враховувати

Стандартні моделі прогнозування нічого не знають про український контекст. Ось що доводиться додавати в промпт вручну:

1. Курс валют

Для бізнесів, прив'язаних до долара чи євро (електроніка, імпорт, логістика), курс — це головний драйвер середнього чека. Підтягуйте актуальний курс через Monobank API або ПриватБанк API (безкоштовно) і передавайте в контекст прогнозу. Коливання на 1–2% на день — норма. На 5% — привід для окремого сценарію.

# Отримання курсу USD/UAH через Monobank API (без токена)
resp = requests.get("https://api.monobank.ua/bank/currency")
rates = resp.json()
usd_uah = next(r for r in rates if r["currencyCodeA"] == 840 and r["currencyCodeB"] == 980)
print(f"Купівля: {usd_uah['rateBuy']}, Продаж: {usd_uah['rateSell']}")

2. Свята за українським календарем

Державні свята змінюють тижневий патерн. Модель не знає, що 28 липня — День Української Державності (вихідний), а 24 серпня — День Незалежності. Додавайте перелік свят на місяць уперед у промпт. За нашим досвідом, це підвищує точність прогнозів на святкові дні приблизно на 25–30%.

3. Відключення світла

У 2026 році це все ще фактор. Якщо у вас офлайн-бізнес або склад без генератора — день без світла може дати падіння на 50–70%. Якщо є генератор — навпаки, конкуренти без світла втрачають клієнтів, а ви отримуєте приріст. Додавайте цей параметр у промпт як окремий фактор: power_outage_risk: low|medium|high.

Скільки це коштує

Ось цифри для одного джерела даних і щоденного прогнозу:

| Компонент | Вартість/міс | |-----------|-------------| | GPT-4o (30 прогнозів × ~$0.03) | ~$1 | | Python-скрипт (cron щодня) | $0 | | Google Sheets API (історія) | $0 | | Monobank API (курс) | $0 | | Telegram Bot API (доставка) | $0 | | VPS (Hetzner/HostPro, 2 vCPU) | $15–25 | | Разом | $16–26/міс |

Порівняйте: data scientist в Україні — від $2000/міс. Навіть якщо взяти найдорожчий сценарій із GPT-4o замість mini, це в 75 разів дешевше. І прогноз приходить щоранку, а не раз на місяць у PowerPoint.

Обмеження — чесно

AI-прогнозування не всесильне. Ось що воно не робить:

  1. Не передбачає чорних лебедів. Курс стрибнув на 10% за день через політичну подію — модель цього не знала. У таких випадках прогноз буде неточним. Це нормально.

  2. Не працює без історії. Якщо у вас менше 30 днів даних — навіть не пробуйте. Потрібно мінімум 60–90 днів для прийнятної точності.

  3. Потребує калібрування. Перші два тижні прогнози будуть гіршими, ніж через місяць. Ви додаєте контекст, дивитеся на результати backtest, коригуєте промпт. Це не «ввімкнув і забув». Це «ввімкнув і раз на тиждень дивишся на точність».

  4. Точність падає з горизонтом. На 3 дні вперед — у межах 10–15% похибки. На 7 днів — 15–20%. На 14 днів — 25–30%. Для бізнес-рішень достатньо 7 днів. Планувати на місяць уперед через GPT-4o — не варто.

З чого почати вже сьогодні

День 1. Відкрийте Google Таблицю з продажами за останні 3 місяці. Якщо даних немає в одному місці — зберіть. Це найважча частина. Без цих даних усе інше не має сенсу.

День 2. Отримайте API-ключ OpenAI. Поповніть баланс на $5. Цього вистачить на 3–4 місяці щоденних прогнозів.

День 3. Скопіюйте код із цієї статті. Замініть fetch_sales_history() на ваші дані. Запустіть перший прогноз. Подивіться на результат.

Дні 4–7. Налаштуйте контекст: додайте свята, курс, особливості вашого бізнесу. Порівняйте прогноз із реальністю.

Тиждень 2. Автоматизуйте: запустіть скрипт через cron, підключіть Telegram-сповіщення.

Через два тижні у вас є робочий прогнозний пайплайн. Через місяць — відкалібрована система з виміряною точністю.

Хочете швидше? Напишіть нам — подивимось на ваші дані, зберемо пайплайн і запустимо перший прогноз. Перша консультація безкоштовна.

Команда AIRINEX

← Усі статті