Когда в компании решают начать считать риски методом Монте-Карло, первым встает вопрос инструмента. Аналитики с опытом программирования предлагают Python, финансисты — Excel. Правильный ответ зависит не от вкуса, а от того, кто будет строить модель, кто будет ее проверять и как часто она будет меняться.
Один пример — три способа
Возьмем модель из статьи «Метод Монте-Карло в Excel»: прибыль = объем × (цена − переменные затраты) − постоянные затраты, план — 1,2 млн руб., каждый фактор задан тремя оценками и PERT-распределением.
1. Формулы Excel без надстроек
Каждый фактор — формула со случайным числом, например для объема:
=БЕТА.ОБР(СЛЧИС();2,6;3,4;8000;13000)
Модель копируется на 5000 строк (по строке на итерацию), результаты собираются функциями СРЗНАЧ, ПРОЦЕНТИЛЬ.ВКЛ и СЧЁТЕСЛИ. Все видно в ячейках, но при каждом изменении книга пересчитывается заново, а корреляции и торнадо-диаграмму придется строить вручную.
2. Excel с надстройкой МоделРиск
Объем: =VoseInput("Объем продаж")+VosePERT(8000;10000;13000)
Прибыль: =VoseOutput("Прибыль")+C3*(C4-C5)-C6
Модель остается в одной строке, симуляцию запускает кнопка, а окно результатов показывает гистограмму, S-кривую, статистику и торнадо-диаграмму.
3. Python с NumPy
import numpy as np
rng = np.random.default_rng(2026)
n = 10_000
def pert(a, m, b, size):
al = 1 + 4 * (m - a) / (b - a)
be = 1 + 4 * (b - m) / (b - a)
return a + (b - a) * rng.beta(al, be, size)
volume = pert(8_000, 10_000, 13_000, n)
price = pert(900, 1_000, 1_050, n)
var_cost = pert(560, 600, 700, n)
fixed = pert(2.6e6, 2.8e6, 3.3e6, n)
profit = volume * (price - var_cost) - fixed
print(f"Средняя прибыль: {profit.mean() / 1e6:.2f} млн руб.")
print(f"P10–P90: {np.percentile(profit, 10) / 1e6:.2f}–{np.percentile(profit, 90) / 1e6:.2f} млн руб.")
print(f"Вероятность ниже плана: {(profit < 1.2e6).mean():.0%}")
print(f"Вероятность убытка: {(profit < 0).mean():.1%}")
Результат: средняя прибыль 1,04 млн руб., P10–P90 — 0,36–1,75 млн руб., вероятность не выполнить план — 63 %, вероятность убытка — 2,0 %. Это те же выводы, что и в Excel, с точностью до случайной погрешности (в Excel-версии 5000 итераций и другие случайные числа).
Сравнение
| Формулы Excel | Excel + МоделРиск | Python | |
|---|---|---|---|
| Кто может построить модель | Любой пользователь Excel | Любой пользователь Excel | Аналитик, пишущий код |
| Кто может проверить модель | Финансисты, аудиторы | Финансисты, аудиторы | Только те, кто читает код |
| Распределения | Несколько встроенных | Более ста, включая подбор по данным | Десятки в NumPy и SciPy |
| Корреляции | Вручную, громоздко | Корреляционные матрицы и копулы | Код, нужна квалификация |
| Анализ чувствительности | Вручную | Торнадо, паук-диаграммы, рассеяние | Код |
| Отчеты и графики | Вручную | Окно результатов, экспорт отчетов | Код (matplotlib и др.) |
| Размер модели и скорость | Небольшие модели | Типичные финансовые и проектные модели | Любые, включая большие данные |
| Автоматизация, интеграция | Ограничена | В рамках Excel | Полная |
| Стоимость | Бесплатно | Лицензия | Бесплатно, но время разработчика |
Когда выбрать Python
- Модель встроена в информационную систему и пересчитывается автоматически, например ежедневно.
- Исходные данные — большие массивы: тысячи договоров, позиций, скважин, объектов.
- Нужны нестандартные методы: машинное обучение, сложные стохастические процессы.
- Модель строят и сопровождают специалисты по данным, а пользователи видят только результаты.
Когда выбрать Excel
- Модель уже существует в Excel: бюджет, финансовая модель проекта, смета. Переписывать ее на Python — значит создать вторую модель, которую придется сверять с первой.
- Модель должны понимать и проверять финансисты, сметчики, инвестиционный комитет, аудиторы.
- Модель часто меняется по ходу обсуждения: «а если цена будет другой», «добавьте этот риск».
- Результат нужно быстро превратить в отчет для руководства.
Для простых моделей хватит формул. Когда нужны корреляции, подбор распределений по данным, анализ чувствительности и воспроизводимые отчеты, удобнее надстройка: МоделРиск добавляет в Excel функции распределений, симуляцию и окно результатов, не меняя логику модели.
Типичные ошибки в обоих случаях
- Одно случайное число на несколько величин. В Excel — ссылка на одну ячейку СЛЧИС из разных формул, в Python — повторное использование одного массива. Величины становятся полностью зависимыми.
- Нет фиксированного начального числа генератора. Результаты меняются при каждом запуске, и невозможно воспроизвести цифры отчета.
- Мало итераций. Для средних хватает тысяч, для хвостов (P99) нужно больше — см. статью «Метод Монте-Карло в анализе рисков».
- Независимость по умолчанию. Связанные величины моделируются как независимые — см. «Корреляция рисков».
Обзор специализированных программ — в статье «Программы для анализа рисков методом Монте-Карло».
Частые вопросы
Какая библиотека Python нужна для метода Монте-Карло?
Для большинства задач достаточно NumPy: генераторы случайных чисел и распределения, векторные вычисления. SciPy добавляет больше распределений и подбор параметров по данным, pandas — работу с таблицами, matplotlib — графики.
Можно ли сделать Монте-Карло в Google Таблицах или LibreOffice?
Да, принцип тот же, что в Excel: функции случайных чисел и обратные функции распределений, много строк или таблица данных. Ограничения тоже те же: скорость, сложность корреляций и анализа чувствительности.
Python быстрее Excel?
Векторные вычисления в NumPy обычно намного быстрее пересчета тысяч строк формул Excel. Но для типичной финансовой модели или сметы и надстройка Excel выполняет тысячи итераций за секунды, так что скорость редко бывает решающим фактором.
Как проверить, что модель на Python считает правильно?
Так же, как в Excel: сравнить детерминированный расчет при наиболее вероятных значениях с исходной моделью, проверить средние и диапазоны отдельных распределений, запустить симуляцию с другим начальным числом генератора и убедиться, что результаты близки.
МоделРиск
МоделРиск — надстройка Excel для анализа рисков методом Монте-Карло. Пробная версия на 30 дней без ограничений.
