Как стать автором
Обновить
167.77
Цифровой СИБУР
Цифровизируем промышленность

Финансовое моделирование в Python и Excel: мой путь перехода на код

Уровень сложностиПростой
Время на прочтение12 мин
Количество просмотров8.4K

Финансовое моделирование — это не просто таблички. Это способ прогнозировать, принимать решения и быть на шаг впереди. Мы, финансисты, любим Excel за простоту, в то же время, ненависть к этому чудесному инструменту возрастает пропорционально количеству переменных в формулах. И, когда задач становится больше, — он начинает тормозить и сильно раздражать.

Ниже я расскажу:

  • Почему я, как гуманитарий, начала осваивать Python.

  • Как связка Excel + Python работает на практике.

  • Как один и тот же проект ведёт себя в этих двух мирах.

Кто я?

Меня зовут Валя. Я — экономист с гуманитарным бэкграундом. В школе мечтала стать переводчиком, выучила три иностранных языка. На экономику попала почти случайно, и с тех пор моя жизнь постепенно сместилась от слов к цифрам. В университете пришлось подружиться с математикой: мат.анализ, статистика, эконометрика — всё «как у взрослых».

Дальше был SQL, после него я поняла, какое счастье подключать технические инструменты и не «перекликивать» бесконечные таблички вручную. Со временем я начала автоматизировать свою работу и дошла до Python. Мой код прост, но он решает задачи — считает метрики, собирает отчёты и строит прогнозы. Для финансов этого уровня мне хватает.

Зачем это пишу?

Финансовое моделирование — это про деньги.

В любом бизнесе есть идея, продукт, команда. Но суть предпринимательства — в прибыли. И ещё до того, как бизнес начнёт работать, нужно понять:

  • будет ли вообще прибыль?

  • когда она появится?

  • сколько составит?

  • при каких условиях?

И вот тут в дело вступают экономисты. Мы берём будущую реальность и пытаемся её «посчитать», как правило, в Excel. Если говорить просто — строим модель, например, кофейни.

Считаем, сколько будут стоить аренда, зарплата бариста, закупка кофе и булочек. Определяем, сколько клиентов должно приходить в день, чтобы бизнес хотя бы вышел в ноль, а затем начал приносить прибыль. В результате получаем ответ: через три года проект окупится, а после этого прибыль будет такой-то. Это и есть финансовое моделирование.

Но на этом никто не останавливается. Нас спрашивают: а что, если булочки делать без изюма? Себестоимость снизится, а значит — прибыль возрастёт? А если повысить зарплату? А что, если аренда увеличится? Мы меняем параметры, строим графики, проводим анализ чувствительности, определяем точку безубыточности. Всё звучит логично и понятно — пока кейс остаётся простым.

А что если это не кофейня, а завод с 1000 единицами товара? А если бизнес работает в разных регионах, у каждого свои условия — логистика, особенности рынка? Если переменных десятки, а сценариев — сотни?

В этот момент любой здравомыслящий специалист задаёт себе вопрос: как упростить работу? Как сделать модель удобной и гибкой, чтобы можно было быстро просчитать разные сценарии, города, продукты — всё сразу?

И вот тут появляется Python. Нет, он не волшебная палочка, но очень помогает. Это не замена Excel — это его сильное дополнение. Python позволяет создать модель, в которую можно загрузить любые данные, быстро изменить параметры, прогнать множество сценариев и получить понятный результат.

Кроме того, он автоматизирует рутину, ускоряет расчёты и делает работу с моделью в целом приятнее.

Вот о чём я и пишу: хочу показать, как Python может стать настоящим помощником для финансиста.

Дисклеймер: я не претендую на роль полноценного разработчика, а показываю, как с этим работаю сама и упрощаю себе жизнь будучи финансистом в ИТ. Уверена, мой опыт найдет своего читателя :)

Excel уже не справляется

Прежде чем начать, скажу пару слов про VBA. Это рабочий инструмент, и с его помощью действительно можно решать многие задачи внутри Excel. Если вы уже умеете с ним работать, — здорово. Но если вы только ищете, с чего начать, обратите внимание на Python. Он универсальнее, выходит за рамки Excel и может использоваться гораздо шире. 

Python активно помогает там, где Excel начинает тормозить. Большие объемы данных, сложные условия, многократные однотипные действия — то, что в Excel каждый раз занимает часы, в Python можно автоматизировать раз и навсегда. Особенно это важно, если вы:

  • готовите регулярную отчетность;

  • работаете с несколькими источниками данных;

  • строите расчеты, которые нельзя уместить в одну строку формулы.

Можно, например, строить модели прогнозирования выручки не «на глазок» через линейный тренд в Excel, а с помощью библиотеки scikit-learn или statsmodels, подгрузив реальные данные. Или подключиться к базе данных ERP-системы и брать данные напрямую — без ручного копирования из выгрузок. Это дает ощущение, что модель живая. Что вы не рождены для ctrl+C и ctrl+V.

Не конкуренты, а союзники

Не подумайте, что я призываю отказаться от Excel. Я хочу показать, что Python и Excel — это мощная связка. А Excel по-прежнему идеален для:

  • визуализации результатов;

  • сбора обратной связи от коллег;

  • подготовки моделей к презентации.

Python же это возможность:

  • углубиться в аналитику;

  • повысить точность расчетов;

  • сократить время работы с данными.

Один из самых удачных рабочих процессов: черновой расчет — в Excel, автоматизация и логика — в Python, визуализация — в Power BI или снова в Excel.

На практике именно так и бывает: Excel-модель, построенная вручную, перерастает в Python скрипт, который уже не требует человеческого участия. А ты просто проверяешь корректность и обновляешь параметры при необходимости.

Почему все больше финансистов смотрят в сторону Python

Переход к Python — это не модное веяние, а отклик на реальные вызовы профессии. Все больше мировых институтов добавляют в свои учебные программы «Python для финансистов», что позволяет освоить навыки автоматизации и продвинутого анализа данных с помощью кода. А в крупных международных компаниях Python уже вошел в список требований к финансовым аналитикам и контролерам.

Что дает Python финансисту?

Если коротко, это:

  • Автоматизация. Устранение повторяющихся действий (копирование данных, очистка, пересчеты).

  • Гибкость. Возможность строить собственные функции и модели любой сложности, а не подгонять логику под ограниченный функционал Excel.

  • Скорость обработки данных. Особенно важно при работе с десятками тысяч строк и интеграциями из разных источников.

  • Повторное использование. Один раз написанный скрипт можно запускать снова и снова, получая одинаково корректный результат.

  • Интеграция. Прямая работа с базами данных, API, Power BI, облачными системами (а не через промежуточные выгрузки).

Предлагаю посмотреть на сравнение Excel и Python по ключевым параметрам:

Скрытый текст

Excel

Python

Простота начала

Очень высокая

Средняя (нужно освоить базу)

Скорость на малых объемах

Отличная

Отличная

Работа с большими объемами

Медленно, тормозит

Быстро, эффективно

Автоматизация процессов

Ограничена

Практически не ограничена

Многократное использование

Ограничено

Не ограничено

Визуализация

Удобная и быстрая

Есть, но требует настройки

Ошибки/человеческий фактор

Высокий риск (ручные формулы)

Ниже (при отлаженном коде)

Командная работа

Часто конфликт версий, правки вручную

Git, версии, документация

Обучение и доступность

Прост для новичков

Требует погружения

Важно: Python не заменяет Excel, он расширяет его возможности. Важное уточнение — я не призываю становиться полноценным Python-разработчиком, потому что это не так просто, как кажется. Нам, финансистам, нужно понимать структуру, уметь читать код, писать простые скрипты и разбираться в логике расчетов.

Кейс: одна и та же модель в Excel и в Python

В качестве примера я построила одну и ту же финансовую модель, предположим, той же кофейни, с несложной структурой в Excel и Python.

Чтобы понять выгоден наш проект или нет, рассчитаю несколько показателей его эффективности.

Тут под спойлером важные финансовые аббревиатуры, которые буду использовать далее по тексту:

Скрытый текст

NPV — чистая приведенная стоимость. Показатель поможет понять, сколько можно заработать на проекте с учётом того, что деньги со временем теряют ценность.

Пример: мы вкладываем 1 млн, а возвращаем 1,5 млн, но через 5 лет. Сегодняшний миллион и миллион через 5 лет — не одно и то же. NPV позволяет это учесть. Если NPV положительный — проект выгоден, если отрицательный — лучше не надо.

IRR — внутренняя норма доходности. Проще говоря: какая процентная доходность у проекта. Если IRR выше, чем ставка по вкладу в банке, то проект интересен, если ниже — не очень.

PI — индекс прибыльности. Покажет, сколько рублей прибыли мы получим с каждого вложенного рубля. Если индекс больше 1, то проект прибыльный, если меньше — мы теряем деньги.

DPBP — дисконтированный срок окупаемости. Покажет, через сколько лет вернутся наши деньги с учётом их обесценивания. То есть не просто "когда верну", а "когда верну, если считать, что деньги со временем стоят меньше".

Затем я сделала анализ чувствительности — это когда мы берём важные параметры проекта (например, сколько продаём, по какой цене, сколько тратим, какие налоги платим) и по очереди меняем их. Смотрим, как это влияет на итог — например, на прибыль или на показатель NPV.

Главная цель — найти такие «граничные» значения, при которых проект уже перестаёт быть выгодным. Например: если снизить цену на капучино ниже определённого уровня — прибыль станет ноль. Или если затраты на булочки вырастут выше определённой суммы — проект больше не окупится.

Эти «пороговые» значения  называются барьерными точками. Они показывают, где проходят границы допустимого, за которыми проект становится убыточным. Это помогает понять, какие параметры критичны и что нужно особенно внимательно контролировать.

В рамках проекта у нас есть базовый сценарий:

Объем выпуска, шт.

3 000

Цена единицы продукции, у.е.

890

Переменные затраты, у.е.

360

Норма дисконта, %

12

Постоянные затраты, у.е.

10 000

Амортизация, у.е.

9 000

Налог на прибыль, %

30

Срок проекта, лет

8

Остаточная стоимость, у.е.

9 000

Начальные инвестиции, у.е.

3 500 000

Далее необходимо рассчитать NPV. Я решила считать все одной формулой, чтобы не увеличивать масштаб работы.

В одной формуле я рассчитала:

  1. Выручку = объем выпуска * цена единицы продукции

  2. Переменные затраты = объем выпуска * переменные затраты на единицу

  3. EBIT = выручка – переменные затраты – постоянные затраты – амортизация 

  4. Чистую прибыль = EBIT * 0,7 (здесь избавляюсь от налога 30%)

  5. Денежный поток = Чистая прибыль + амортизация

Затем в этой же формуле дисконтировала, то есть перевела будущие деньги в текущую ценность, денежный поток по годам:

6. Дисконтированный денежный поток = денежный поток / (1+норма дисконта)^год инвестиций.

Протянув формулу и суммировав все результаты с учетом инвестиций, мы получили NPV.

Формула получилась объемной. Любому, кто не участвовал в создании модели, придётся потратить время, чтобы понять, что к чему. Особенно если с финансами не на "ты".

Если в формуле случайно "слетит" закрепление ячейки, можно потерять часть расчётов.

Когда подтягиваем реальные данные — из 1С, таблиц коллег и других источников — легко ошибиться просто по невнимательности. Но, если модель маленькая, такой способ вполне рабочий.


На выполнение этих вычислений со всем наведением «красоты» мне потребовалось 3 минуты.

Для вычисления внутренней нормы доходности (IRR) использовала финансовую формулу Excel – ВСД. Но имейте в виду, если NPV будет меньше нуля, то формула не сработает.

Далее для вычисления DPBP я добавила сумму дисконтированных потоков нарастающим итогом (колонка G).

Срок окупаемости (DPBP) вычислялся «на глазок». Видно, что нарастающим итогом мы приближаемся к сумме инвестиций на 4 году жизни проекта. Значит можем 4 года суммировать с «остатком до выхода в ноль», деленным на чистый дисконтированный поток 5 года.

Опять же, здесь данных мало, невооруженным взглядом видно что и куда подставить. Даже при быстрых вычислениях и выводах можно навскидку дать прогноз окупаемости в 4 года. Если данных больше, быстрых выводов не будет.

Перед тем, как переходить к анализу чувствительности, предлагаю посмотреть на код в Python для тех же вычислений.

Сначала добавим библиотеку, необходимую для финансовых вычислений:

import numpy_financial as npf

Введем исходные данные (на этом этапе мы также можем обозначить несколько сценариев и затем рассчитывать показатели опираясь на них). При смене сценариев в Excel нам нужно будет дублировать таблицу с данными и заново настраивать вычисления. Не стоит упоминать, что визуально это будет более громоздко:

Скрытый текст
# Исходные данные
volume = 3000
price_per_unit = 890
variable_cost_per_unit = 360
fixed_costs = 10000
amortization = 9000
tax_rate = 0.30
discount_rate = 0.12
initial_investment = 3500000
project_lifetime = 8

Далее идут вычисления, которые я описывала ранее. Здесь каждый показатель считаю отдельно для наглядности. Даже если вы никогда «в глаза не видели этот ваш питон», то интуитивно понятно, что вообще происходит и какая тут финансовая математика:

Скрытый текст
# Расчет денежных потоков
cash_flows = []
for year in range(1, project_lifetime + 1):
    revenue = volume * price_per_unit
    variable_costs = volume * variable_cost_per_unit
    ebit = revenue - variable_costs - fixed_costs - amortization
    tax = max(ebit, 0) * tax_rate
    net_income = ebit - tax
    cash_flow = net_income + amortization
    cash_flows.append(cash_flow)
# Добавляем начальные инвестиции (отрицательный поток в 0-й год)
cash_flows = [-initial_investment] + cash_flows
# Расчет NPV
npv = npf.npv(discount_rate, cash_flows)
# Расчет IRR
irr = npf.irr(cash_flows)
# Расчет PI 
pi = (npv + initial_investment) / initial_investment

Тут обращу внимание на расчет срока окупаемости, выглядит сильно сложнее расчета «на глаз» в Excel. Но такой расчет, очевидно, точнее. Плюс, он классно сработает при большом исходном массиве. Думаю вы также заметили, что для всех показателей эффективности в Python есть готовая функция, в которую мы просто закладываем показатели, нам не нужно проводить именно математические вычисления, либо, как в случае IRR подбирать его вручную или через анализ данных, если NPV будет меньше нуля и формула ВСД не сработает.

Скрытый текст
# Расчет DPBP
discounted_cash_flows = [cf / (1 + discount_rate) ** i for i, cf in enumerate(cash_flows)]
cumulative = 0
dpbp = None
for i in range(1, len(discounted_cash_flows)):
    cumulative += discounted_cash_flows[i]
    if cumulative >= -discounted_cash_flows[0]:
        prev = cumulative - discounted_cash_flows[i]
        dpbp = i - 1 + (-discounted_cash_flows[0] - prev) / discounted_cash_flows[i]
        break


# Вывод результатов
print(f"NPV: {npv:.2f}")
print(f"IRR: {irr:.4%}")
print(f"PI: {pi:.4f}")
print(f"DPBP: {dpbp:.2f} лет")

Результат кода получили за секунду, все работает и совпадает с нашими расчетами в Excel.

Возникает вопрос: потратила ли я больше времени на написание кода? Отвечу честно, да.

Но, что лучше, написать один раз и масштабировать за секунды или быстро собрать простенькую модель, которую нужно переделывать при любом изменении вводных?

Штош, пришло время хардкора и анализа чувствительности в Excel

Сначала я задала, в каком диапазоне будет меняться каждый параметр (например, цена от 80 до 120 рублей) и с каким шагом (например, по 5 рублей). Это нужно, чтобы по очереди “покрутить” разные сценарии и посмотреть, как каждый из них влияет на результат.

Ну и долго не думая, пошла «в лоб» — протянула пределы вправо, а ниже рассчитала NPV одной формулой (точно так же, как делала ранее) учитывая измененный параметр.

Picture background

Невооруженным взглядом видно, что эта вакханалия цифр и формул может свести с ума. Здесь расчет чистого дисконтированного потока на каждый год суммируется, учитывая заданный параметр.

Затем глазками ищем, где знак «–» сменяется на «+» и примерно определяем диапазон, в котором находится барьерная точка по показателю.

Печально, но в расчётах получилось больше 900 столбцов. Ушло куча времени и нервов на то, чтобы протянуть и масштабировать эту сложную формулу. А результат всё равно получился сомнительный и не очень точный. Понятно, что для нормального ответа нужен график и дополнительные расчёты.

Прошу меня извинить, но строить графики для этого анализа уже выше моих сил.

А теперь посмотрим, как это можно сделать в Python:

Я подключаю библиотеку, которая помогает легко строить графики, считаю NPV, задаю диапазоны и шаги для нужных параметров - и сразу получаю наглядный график:

Скрытый текст
import matplotlib.pyplot as plt


# Функция для расчета NPV
def calculate_npv(volume, price, var_cost, fixed_cost, tax_rate):
    cash_flows = []
    for year in range(1, project_lifetime + 1):
        revenue = volume * price
        variable_costs = volume * var_cost
        ebit = revenue - variable_costs - fixed_cost - amortization
        tax = max(ebit, 0) * tax_rate
        net_income = ebit - tax
        cash_flow = net_income + amortization
        cash_flows.append(cash_flow)
    cash_flows = [-initial_investment] + cash_flows
    return npf.npv(discount_rate, cash_flows)


# Анализ чувствительности
def sensitivity_analysis(param_name, values, base_params):
    npvs = []
    for val in values:
        params = base_params.copy()
        params[param_name] = val
        npvs.append(calculate_npv(**params))
    return npvs


# Базовые параметры
base_params = {
    'volume': 3000,
    'price': 890,
    'var_cost': 360,
    'fixed_cost': 10000,
    'tax_rate': 0.30
}


# Диапазоны значений
volume_range = range(0, 6001, 100)
price_range = range(50, 2501, 50)
var_cost_range = range(5, 631, 5)
fixed_cost_range = range(5000, 1060001, 5000)
tax_rate_range = [i / 100 for i in range(5, 101, 5)]


# Построение графиков (пример: чувствительность к цене)
for param_name, value_range in [
    ('volume', volume_range),
    ('price', price_range),
    ('var_cost', var_cost_range),
    ('fixed_cost', fixed_cost_range),
    ('tax_rate', tax_rate_range)
]:
    npvs = sensitivity_analysis(param_name, value_range, base_params)
    plt.figure(figsize=(8, 4))
    plt.plot(value_range, npvs)
    plt.title(f"Чувствительность NPV к параметру: {param_name}")
    plt.xlabel(param_name)
    plt.ylabel("NPV")
    plt.grid(True)
    plt.show()

В итоге я трачу меньше времени и сразу получаю наглядный результат, который легко менять под разные сценарии или масштабировать.

Выводы

Если коротко: Excel — как кофе на бегу. Быстро, удобно, всегда под рукой. Когда нужно срочно что-то посчитать, показать, прикинуть — он отлично справляется. Но стоит сделать шаг в сторону от «просто посчитать NPV», как начинается формульная акробатика, зависимость от человеческого фактора и необходимость проверять каждый шаг. Особенно когда данных становится больше или требуется гибкость.

Python — совсем другая история. Это как собрать себе кофемашину, настроить помол, давление, а потом в любое утро получать идеальный результат нажатием одной кнопки. Нужно время, чтобы разобраться, да, но потом — удовольствие от того, как все работает. Расчеты прозрачные, масштабируются без слез, графики рисуются сами, сценарии меняются в одну строку, и ничего не «слетает», если ты подвинул ячейку.

В итоге все зависит от цели. Если задача — быстро показать результат или провести разовый расчет — Excel вполне подойдет. Но если вы хотите построить стабильную модель, развивать ее, играть с параметрами, тестировать гипотезы — код побеждает. Да, порог входа выше, но зато результат точнее, визуальнее и главное — устойчивее к ошибкам и изменениям.

Если вы финансист, работайте и с тем, и с тем. Excel — это ваш калькулятор, быстрый и понятный. Python — это ваш инженерный инструмент, мощный и гибкий. Не выбирайте между ними. Используйте оба — и станьте незаменимыми.

А вы где сейчас?

Продолжаете в Excel? Или уже в Python? Или ищете мост между ними?

Поделитесь, как вы решаете такие задачи. Интересно услышать кейсы от финансистов и аналитиков.

Если материал зайдет, у меня есть еще пару тем, которыми хочу поделиться)

Теги:
Хабы:
+33
Комментарии21

Публикации

Информация

Сайт
sibur.digital
Дата регистрации
Численность
1 001–5 000 человек
Местоположение
Россия