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

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

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

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

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

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

Ми вже писали, як збирати дані з українських джерел і як перетворювати звіти на дії. Але звіт і дія — це про минуле. Прогноз — це про майбутнє. Ось як його зібрати без data scientist і без 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: формуємо prompt із контекстом

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

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

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

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%». Якщо точність падає — щось змінилося в бізнесі (нова категорія товарів, зміна аудиторії). Це сигнал оновити prompt або додати новий контекст.

Крок 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"},
)

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

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

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 серпня — День Незалежності. Додавайте перелік свят на місяць уперед у prompt. За нашим досвідом, це підвищує точність прогнозів на святкові дні приблизно на 25–30%.

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

У 2026 році це все ще фактор. Якщо у вас офлайн-бізнес або склад без генератора — день без світла може дати падіння на 50–70%. Якщо є генератор — навпаки, конкуренти без світла втрачають клієнтів, а ви отримуєте приріст. Додавайте цей параметр у prompt як бінарний фактор: 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-результати, коригуєте prompt. Це не «ввімкнув і забув». Це «ввімкнув і раз на тиждень дивишся на точність».

  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

← Всі статті