Уроки профессионального финансового моделирования в Excel

Дмитрий Рябых, генеральный директор и ведущий консультант ГК Альт-Инвест, CFA, председатель Совета по технологиям CFA Institute, рассказывает о тонкостях построения финансовых моделей.

1. Учет инфляции при моделировании

Когда финансовый план длится больше 2-3 лет, очевидно, что текущие цены и затраты применять ко всему периоду планирования невозможно. Надо учесть влияние инфляции. Инфляция в расчетах может выглядеть довольно сложно, но базовый принцип всегда примерно одинаковый, и мы его сейчас рассмотрим.

 

Итак, допустим у нас есть финансовый план некой птицефабрики. Мы возьмем его фрагмент, полный план, конечно, состоит из множества статей доходов и затрат. В плане продаж у нас есть яйцо, оно стоит 2,5 тыс. руб. за тысячу штук и с третьего квартала проекта мы продаем его по 20 млн. в квартал. Вот такая упрощенная картина.

 

2,5 тыс. – это сегодняшняя цена. Уже даже в начале продаж она будет другой, и это надо учесть. Для этого в модели должен быть блок, отвечающий за прогнозную инфляцию. Он создается либо на отдельном листе в книге Excel, либо просто отдельным блоком.

 

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

 

Чтобы наша модель была универсальной, мы добавляем строку с длительностью периода в месяцах – тогда в последующем будет легко переделать эту таблицу для годовых или месячных расчетов.

 

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

 

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

 

Теперь этот блок должен быть задействован везде, где мы работаем с ценами.

 

Как вы можете заметить, в этой модели цена за тысячу яиц как бы хранит информацию о накопившейся инфляции, корректируется постепенно. от периода к периоду. Чтобы это работало, нужно чтобы цена присутствовала в строке с первого до последнего периода и опиралась только на предыдущий период и инфляцию. Но бывает так, что цена определяется сложнее, или цифры появляются только в середине проекта. Тогда нам нужен базисный индекс инфляции.

 

В нем мы просто накапливаем инфляцию за все периоды.

 

И теперь мы умножаем не предыдущую, а начальную цену, на этот индекс.

 

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

 

2. Безопасность и устойчивость модели

Если вы планируете передавать модель другим людям, особенно если они должны будут заполнять данные в этой модели, то надо позаботиться о том, чтобы они случайно не испортили ее или не внесли какие-то поправки в ваши расчеты по своему усмотрению. И даже если никто другой не будет менять модель, себя тоже полезно защитить от возможных ошибок.

 

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

 

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

 

Это поможет и легче ориентироваться в модели, и делать меньше ошибок.

 

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

 

Если надо, вы можете добавить здесь же подсказки относительно вводимых данных. И изменить текст сообщения, которое будет выдаваться при попытке ввести недопустимое значение.

 

Теперь здесь будут только те цифры, на которые рассчитана модель.

 

Особый случай – это когда ячейка должна содержать только одно из нескольких возможных значений. Например, в ячейке B11 у нас может быть только флаг: 1 или 0. Тогда мы можем определить проверку данных по списку.

 

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

 

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

 

Сначала мы выделяем все ячейки, которые будут оставаться редактируемыми. Вызываем диалог формата ячейки. И в последней закладке отключаем флаг Заблокировать ячейку. Теперь когда весь лист будет защищен от изменений, эти ячейки останутся незащищенными. Дальше мы выбираем защиту листа. Если вы хотите, чтобы никто кроме вас не мог отключить эту защиту, то установите пароль. Часть действий с защищенным листом можно разрешить включая и выключая соответствующие флаги.

 

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

 

3. НДС в платежах

В доходах, затратах, инвестициях в составе цен присутствует налог на добавленную стоимость. Это создает несколько проблем. Во-первых, указывая любую цену вы должны явным образом обозначить – это цена с НДС или без. Единого стандарта нет и если вы не укажете информацию об НДС явно, то люди обязательно будут путаться.

 

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

 

Получается итоговая сумма чистых поступлений за отчетный период. И всю эту суммы мы должны передать государству в качестве налогового платежа. Это появится у нас в кэш-фло в строке Налоги. То есть компания как бы пропускает НДС через себя и отдает излишки государству. Модель должна это отражать.

 

Иногда говорят, что раз НДС проходит сквозь всю деятельность как бы параллельно основному учету, то можно его вообще игнорировать. К сожалению, это приведет к большим ошибкам. Особенно это заметно если в модели присутствуют крупные инвестиции. Вот в моем примере первые два периода показывают отрицательную сумму НДС. Почему так? Потому что продаж еще нет, но вместе с инвестиционными затратами мы платим большие суммы НДС и у государства возникает долг перед нами. Иногда компания может получить возврат переплаченного НДС, но даже тогда эти деньги сначала надо потратить вместе с инвестициями, значит надо предусмотреть их в финансировании проекта.

 

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

 

4. Учет и отображение шага планирования

Обычно финансовая модель состоит из набора таблиц, каждая из которых содержит данные по всем периодам планирования. Естественно, логично, чтобы в модели был отдельный блок, где формируется вся информация, касающаяся периодов, их названий и характеристик. Этот блок одинаковый для любой модели и имеет смысл сделать его стандартным. Что нам нужно в нем иметь?

 

Во-первых, нам надо просто пронумеровать периоды. Это может пригодиться и в формулах и просто для заголовков таблиц.

 

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

 

Пусть здесь у нас будет план по кварталам.

 

Теперь можно определить дату начала каждого следующего периода, это мы делаем с помощью функции ДАТАМЕС(). Она вычисляет сдвиг даты на указанное число месяцев, и таким образом у нас нет проблем в связи с тем, что в месяцах разное количество дней.

 

На всякий случай в этом блоке лучше иметь сразу и дату окончания каждого периода. Это та же функция ДАТАМЕС(), но минус один день.

 

Ну и наконец название периода. Я сделаю его немного упрощенным, оно будет рассчитано только на планирование по кварталам. Чтобы извлечь из даты номер месяца, мы используем функцию МЕСЯЦ(). Номер квартала это целое от месяца минус 1, деленного на 3 плюс 1. Теперь надо добавить слово квартал и номер года. Для того, чтобы объединять несколько фрагментов текста в одну строку, в Excel используется символ амперсанд. Добавляем обозначение квартала. И номер года. Названия периодов готовы.

 

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

 

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

 

Можно сделать эти две строки менее бросающимися в глаза. Теперь надо зафиксировать их. Для этого ставим курсор в следующую строку и выбираем в меню Окно Закрепить области. Всё, теперь вопрос отображения периодов решен и у нас есть все данные, которые могут понадобиться в расчетах и формировании отчетов.

 

5. Модель на двух языках

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

 

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

 

Итак, изначально модель готовится на одном языке.

 

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

 

Теперь идея состоит в том, что все текстовые ячейки на расчетных листах будут ссылаться на первую колонку листа Язык, а в этой первой колонке всегда будет версия на текущем языке. Для этого мы делаем первую ячейку флагом языка. Ноль – базовый для нас русский язык, 1 – английский.

 

А во всех остальных ячейках совершенно одинаковая формула. Нули будут появляться там, где нет данных, эти строки потом лучше вообще удалить, так как это мусор.

 

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

 

6. NPV, IRR – профессиональный расчет

Практически любая модель инвестиционного проекта включает расчёт показателей эффективности. В принципе, для этого есть стандартные функции Excel: NPV() или ЧПС() в русской версии, и IRR(), в русской версии это ВСД(). В примитивных расчетах их достаточно, но если вы сделали серьезную модель, то и к расчету показателей эффективности лучше подойти более профессионально.

 

Итак. Во-первых, функцией NPV мы вообще не будем пользоваться. Гораздо лучше иметь все расчеты в явном виде перед глазами, тем более, что они не сложные. Это выглядит следующим образом.

 

Остается рассчитать IRR. Простой вариант – функция ВСД(), которая применяется к недисконтированному денежному потоку. Он оставляет нам кучу проблем. Что если у нас денежные потоки не по концу периода, а по началу? Что если как здесь, планирование сделано по кварталам? Что наконец если первый период не полной длины, то есть планирование например по годам, но проект начинается с апреля? Все эти проблемы оптом мы решаем, если переходим от функции ВСД() к другой, менее известной функции Excel, которая по-английски называется XIRR(), а в русском языке имеет длинное название ЧИСТВНДОХ().

 

Мы получили те же NPV и IRR, но наши расчеты стали прозрачнее, а модель более универсальной.

 

7. Подбор финансирования и циклические ссылки

У Excel есть функция, которая упомянута во всех рекомендациях по финансовому моделированию, с требованием «Никогда не используйте это». Но во-первых, тем интереснее узнать о ней, а во-вторых, иногда она все же бывает нужна. Это итеративные вычисления. Что это такое и в чем они могут нам помочь?

 

Предположим у нас есть простая модель, где мы создали денежные потоки и сейчас вносим суммы кредита для финансирования инвестиционной фазы. Модель я уже подготовил и таблица для кредита у меня тоже есть. Казалось бы, все просто. Смотрим сколько не хватает денег и столько и берем, а когда деньги появляются – направляем их на погашение. Мы сейчас не задумываемся о резервах, коэффициентах покрытия – сводим все в ноль. Но вот проблема. Все расчеты, как это чаще всего и нужно, сделаны по началу периода. То есть если я беру кредит в первый год проекта, то за этот год уже начисляются проценты.

 

Например, я вижу, что мне не хватает примерно миллиард 587 млн. но если ввести эту сумму в качестве кредита, то денег опять будет не хватать – появились процентные платежи.

 

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

 

=МАКС(-'Фин. отчеты'!F43+'Фин. отчеты'!F36;0)

 

=МИН(МАКС('Фин. отчеты'!I43-'Фин. отчеты'!I37;0);I244)

 

Теперь если например мы меняем что-то в инвестициях. Пусть нам надо еще 500 млн. График кредита меняется автоматически.

 

Если это такое изящное решение, почему его не советуют? Дело в том, что модель с циклическими ссылками становится запутанной и найти в ней ошибку практически нереально. Поэтому если нет острой необходимости постоянно автоматически подбирать финансирование, лучше обойтись без итеративных расчетов.

 

8. Таблицы и графики чувствительности

Распространенная ситуация, когда в модели помимо основного расчета нужно показать чувствительность колебаниям каких-нибудь ключевых параметров. Делается это обычно либо формате нескольких сценариях этот случай мы рассмотрим в следующем видео. Либо виде графиков чувствительности, и вот этим мы займёмся сейчас.

 

Что такое график чувствительности в модели? Это график, который показывает как меняется какой-нибудь результирующий параметр при изменении тех или иных исходных данных. Например довольно типичный вариант графика чувствительности это зависимость NPV от, например, колебаний в цене продукции, или например от ставки дисконтирования. Вот вокруг этих двух зависимости мы сейчас и построим пример.

 

Первое что нам нужно это таблица в которой будут все интересующие нас значения NPV для каждого из значений параметров.

 

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

 

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

 

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

 

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

 

Таблица заполнилась и теперь значение в каждой ячейке – это значение NPV для цены продаж, указанной в строке и ставки, указанной в колонке. Эта таблица всегда будет обновляться при любом изменении в модели, всегда будет актуальна и по ней можно построить себе графики чувствительности.

 

Всё готово.

 

Последнее, что надо сказать об этом инструменте – он прекрасен и очень удобен, но надо иметь в виду, что вот например сейчас если я изменю что-то в затратах проекта, то модель пересчитается не один раз, а столько раз, сколько ячеек в таблице подстановки, то есть 7х7 = 49. С точки зрения вычислений, модель сейчас утяжелилась в 50 раз. Тут этого еще не заметно, но если исходная модель будет покрупнее или компьютер послабее, то вы обнаружите, что после каждой введенной цифры Excel подвисает на несколько секунд, и это конечно никуда не годится.

 

Для того, чтобы устранить эту проблему, в Excel есть специальная опция…

 

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

 

9. Сценарное планирование

Планирование это всегда неопределенность, и очень часто при подготовке исходных данных формируется несколько сценариев. Они, как правило, похожи друг на друга, но часть данных в них отличается: например в прогноз закладываются разные цены или разные объемы продаж. То есть модель нужна одна, но с несколькими вариациями.

 

Разработка такой модели начинается с создания обычной модели для одного сценария. А дальше мы добавляем в нее механизм управления сценариями. Для этого у нас будет отдельный лист Сценарии.

 

Здесь у нас будет два блока, я их себе заготовил. В одном в одном мы размещаем данные текущего сценария. Они будут отсюда переноситься в основную модель.

 

Второй блок это собственно наши сценарии. Здесь будут те данные которые между сценариями различаются. Допустим у нас есть три сценария которые отличаются друг от друга ценой и графиком продаж. начнём с базового сценария. Сделаем поле для его названия и перенесем сюда данные из основной модели.

 

Теперь размножаем это на три сценария.

 

И пусть это будут сценарии под названием Рост и Кризис, и у них будут немного разные данные.

 

А блок Текущий сценарий заполняется у нас как выборка данных того сценария, номер которого написан сейчас вверху. Для этого мы используем функцию ВЫБОР().

 

Теперь в этой таблице всегда текущий сценарий. Осталось перенести данные в основную модель. Желательно при этом как-то обозначить, что это теперь не редактируемые данные, а информация из сценариев.

 

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

 

10. Аккуратное отображение коэффициентов

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

 

Поэтому обычно нельзя просто указать формулу как деление одной ячейки на другую. Она будет немного сложнее.

 

У нас есть два варианта. Первый – мы можем воспользоваться функцией ЕСЛИОШИБКА(). Например, рентабельность продаж здесь в первые два года будет давать деление на ноль, потому что нет продаж. Добавим ЕСЛИОШИБКА(). Теперь функция подставляет аккуратный прочерк вместо сообщения об ошибке.

 

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

 

В данном случае, нам нужна функция ЕСЛИ(). Мы ставим проверку того, что денежные потоки положительные и только в этом случае рассчитываем коэффициент, а для отрицательных просто показываем прочерк. В результате модель выглядит аккуратнее и легче читается.

 


 

Ранее опубликовано на CFin.ru

Career
17522

Что читают Говард Маркс и сотрудники Oaktree? Книжные рекомендации для вас /

Чтение — нечто большее, чем просто накопление знаний....

Career
15391

4 причины, по которым искусственный интеллект не решит проблемы с вашим резюме /

Процесс поиска работы может стать настолько стрессовым,...

Career
15252

Люди сами саботируют свою карьеру, совершая эти распространенные ошибки /

Если вы будете знать об этих распространенных ошибках...

Career
15515

5 инновационных техник тайм-менеджмента /

Традиционные методы вроде списков дел и цифровых календарей...

Career
14694

5 способов начать карьеру публичного спикера онлайн и офлайн /

Если вы чем-то увлечены и хотите поделиться этим со...

Career
15293

Выгорание: сделайте эти 8 шагов, пока не перегорели /

Выгорание, часто называемое "тихой эпидемией" — убийца...