Время на прочтение
5 мин
Количество просмотров 37K
Статья адресована и будет полезна в первую очередь тем, кто начал изучать опционы и хочет разобраться в их ценообразовании. Ну и во вторую очередь тем, кто ещё не использует инструмент VBA в своих расчётах в екселе, но хочет научиться — вы увидите, как это на самом деле просто.
Основы опционов
Для начала кратко о сути и ценообразовании опционов. Опцион имеет четыре основных параметра:
1. Базовый актив
2. Тип опциона (Колл или Пут)
3. Цена страйка (цена исполнения опциона)
4. Дата экспирации (истечения) опциона
Для покупателя опциона он представляет собой право
купить (опцион Колл) или продать (опцион Пут) базовый актив по цене страйка в день экспирации.
Для продавца опциона он представляет собой обязанность
продать (опцион Колл) или купить (опцион Пут) базовый актив по цене страйка в день экспирации. Фактически опцион представляет собой страховку от изменения цены базового актива (БА) от момента сделки до даты экспирации — в роли страховщика выступает продавец (в случае неблагоприятного изменения цены БА он выплачивает страховку покупателю опциона), а страхователем является покупатель опциона (он платит за страховку продавцу).
Как и цена страховки цена опциона полностью определяется вероятностью «страхового случая», т.е. исполнения опциона (исполнения права покупателя опциона). Основные составляющие, которые влияют эту вероятность и на цену опциона, на стоимость страховки, которую платит покупатель и получает продавец:
- Разница между ценой страйка и ценой базового актива. Т.е. при покупке Колла, чем выше его страйк, тем он дешевле (т.к. снижается вероятность того, что на момент экспирации БА будет выше цены страйка)
- Волатильность базового актива. Чем выше волатильность (грубо размах колебаний цены) БА, тем выше вероятность достичь страйка до экспирации.
- Время до экспирации. Чем больше времени до экспирации опциона, тем при покупке Колла выше вероятность что за это время цена базового актива уйдёт выше страйка, соответственно цена опциона выше.
При этом зависимость цены опциона по каждой из этих трёх составляющих нелинейная. Ставшая общепринятой формула оценки опционов с учётом этих основных факторов была выведена Фишером Блэком и Майроном Шоулзом в 1973 году.
Формула Блэка-Шоулза имеет следующий вид (подробно можно посмотреть в Википедии):
Цена (европейского) опциона call:
Цена (европейского) опциона put:
Обозначения:
C(S,t) — текущая стоимость опциона call в момент t до истечения срока опциона (до экспирации);
S — текущая цена базового актива;
N(x) — вероятность того, что отклонение будет меньше в условиях стандартного нормального распределения (таким образом, и ограничивают область значений для функции стандартного нормального распределения);
K — цена исполнения опциона;
r — безрисковая процентная ставка;
T — t — время до истечения срока опциона;
— волатильность доходности (квадратный корень из дисперсии) базового актива.
Греки опционов
Для оценки чувствительности цены опциона к цене БА, волатильности, и времени до экспирации, применяют коэффициенты, называемые Греками (коэффициенты в основном обозначаются греческими буквами, за исключением «веги»).
Греки в модели Блэка-Шоулза вычисляются следующим образом:
1. Дельта () — скорость изменения цены опциона от изменения цены БА. Для опциона Колл дельта равна
, для опциона Пут
. Дельта показывает текущий наклон кривой стоимости опциона в зависимости от цены БА.
2. Гамма ( ) — скорость изменения цены опциона от изменения Дельты (или ускорение от изменения цены БА). Гамма равна
.
3. Вега ( ) — описывает зависимость цены опциона от изменения волатильности БА:
. Вега отражает число пунктов изменения стоимости опциона на каждый процентный пункт (1%) изменения волатильности.
4. Тета ( ) — описывает снижение цены опциона в зависимости от времени до экспирации. Для Колла —
, для Пута —
.
Вышеприведенные формулы верны для общего случая, в том числе для случая опционов на акции. Для расчёта опционов на фьючерсные контракты безрисковая ставка r не применяется. Т.к. на Московской бирже торгуются опционы на фьючерсы, далее в расчётах процентную ставку не учитываем.
Реализация модели в MS Excel
Итак, реализация модели Блэка-Шоулза в Excel+VBA.
Для удобства создадим функцию для каждой переменной из модели БШ. В каждой функции будут входные переменные:
S — цена БА
X — цена страйка
d — число дней до экспирации
y — число дней в году
v — волатильность
OptionType — тип опциона «Call» или «Put» (только для расчета цены и дельты)
Запись обычной функции в VBA выглядит следующим образом:
Function НазваниеФункции(входные переменные через запятую)
… вычисления…
НазваниеФункции =… вычисления…
End Function
Такую функцию можно вызывать как из других функций, так и из листа Excel.
Функции записываются в созданный Модуль (запускаем VBA в Excel, например нажатием Alt+F11, выбираем Insert -> Module):
Function d_1(S, X, d, y, v)
T = d / y
d_1 = (Log(S / X) + (0.5 * (v ^ 2)) * T) / (v * (T ^ 0.5))
End FunctionFunction d_2(S, X, d, y, v)
T = d / y
d_2 = d_1(S, X, d, y, v) — v * (T ^ 0.5)
End FunctionFunction Nd_1(S, X, d, y, v)
Nd_1 = Application.NormSDist(d_1(S, X, d, y, v))
End FunctionFunction Nd_2(S, X, d, y, v)
Nd_2 = Application.NormSDist(d_2(S, X, d, y, v))
End FunctionFunction N_d_1(S, X, d, y, v)
N_d_1 = Application.NormSDist(-d_1(S, X, d, y, v))
End FunctionFunction N_d_2(S, X, d, y, v)
N_d_2 = Application.NormSDist(-d_2(S, X, d, y, v))
End FunctionFunction N1d_1(S, X, d, y, v)
T = d / y
N1d_1 = 1 / (2 * Application.Pi()) ^ 0.5 * (Exp(-0.5 * d_1(S, X, d, y, v) ^ 2))
End FunctionFunction OptionPrice(OptionType, S, X, d, y, v)
If OptionType = «Call» Then
OptionPrice = S * Nd_1(S, X, d, y, v) — X * Nd_2(S, X, d, y, v)
ElseIf OptionType = «Put» Then
OptionPrice = X * N_d_2(S, X, d, y, v) — S * N_d_1(S, X, d, y, v)
End If
End FunctionFunction Delta(OptionType, S, X, d, y, v)
If OptionType = «Call» Then
Delta = Application.NormSDist(d_1(S, X, d, y, v))
ElseIf OptionType = «Put» Then
Delta = Application.NormSDist(d_1(S, X, d, y, v)) — 1
End If
End FunctionFunction Theta(S, X, d, y, v)
T = d / y
Theta = -((S * v * N1d_1(S, X, d, y, v)) / (2 * (T ^ 0.5))) / y
End FunctionFunction Gamma(S, X, d, y, v)
T = d / y
Gamma = N1d_1(S, X, d, y, v) / (S * (v * (T ^ 0.5)))
End FunctionFunction Vega(S, X, d, y, v)
T = d / y
Vega = (S * (T ^ 0.5) * N1d_1(S, X, d, y, v)) / 100
End Function
Готовый Excel-файл можно скачать по ссылке.
Теперь в екселевской ячейке можем вызывать любую прописанную нами функцию, например введя в ячейке =OptionPrice(«Put»;76870;90000;13;365;0.47) мы получим теоретическую цену опциона Пут при цене базового актива 76870, страйке 90000, предполагаемой волатильности 45% и за 13 дней до экспирации.
Некоторые моменты, которые хотелось бы отметить
- Полученные в нашей программе значения теорцены практически идентичны тем, что транслирует Мосбиржа, это значит что биржа в своих расчётах использует именно модель БШ.
- На самом деле опцион (как и страховка) не имеет истинной справедливой стоимости — она для каждого своя, и зависит от того какая предполагается волатильность или например какое учитывать число дней (учитывать ли выходные, с каким весом учитывать разные дни недели, сколько дней в году использовать в формуле) и т.д.
- Греки обладают замечательным свойством — чтобы получить значение греков для портфеля фьючерсов и опционов нужно просто сложить соответствующие греки для отдельных активов портфеля. Т.е. мы легко можем рассчитать, например, сколько нужно купить/продать базовых фьючерсов чтобы общая стоимость портфеля не изменялась при изменении цены этого фьючерса (т.н. выравнивание Дельты или дельта-хеджирование).
- Не смотря на свою распространённость, модель БШ основана на допущении, что доходность актива имеет нормальное распределение, что на реальном рынке не выполняется никогда.
Итог
Итак, мы получили рабочий опционный калькулятор на VBA, который можно использовать как для изучения свойств опционов (строить диаграммы зависимостей цены и греков от разных параметров рынка), так и использовать для торговли и построения более сложных программ.
Excel, VBA, basic math skills and background finance knowledge provide a good foundation for using financial models. Suitable for financial projections of all types, models identify and display relationships between two or more variables using mathematical terms and “what-if” scenarios, ultimately providing a wealth of information for making good financial decisions. Start with Excel functions and formulas, and then expand the functionality of models with Visual Basic for Applications macros to ask, answer and solve your financial questions and problems.
Facts
-
The deterministic model is the most common framework for both personal and business financial models. Deterministic models most often base projections on historical data and seek to establish a relationship between historical data and key dependent variables. Although on the surface you may see little to no difference between a deterministic financial model and a common Excel spreadsheet, the functions and formulas working behind-the-scenes — many of which are available in the Data Analysis Toolpak add-in — are often more complex. The presence of VBA macros that assist in performing complex calculations and in automating financial models differentiate models from common spreadsheets even further.
Organization
-
Structure and organization are keys to a good financial model. Although underlying calculations may be complex, a simple, well-organized interface will make your model easier to read and understand. Start by including a detailed description of the models’ objective/objectives and a statement as to how you plan to achieve these objectives. Use a single worksheet for short, simple models but consider breaking models with large amounts of data into multiple worksheets. Group input and output data to make them easier to read, and use color-coding, descriptive titles, column and row names to identify model components.
Coding Components
-
Excel functions and VBA code use dynamic independent variables, and static intermediate and immediate dependent variables in calculations to create what can become complex “what-if” scenarios. Independent variables, including user input and optional parameters, provide the information a model needs to perform calculations. Intermediate dependent variables are an interim result in a multi-step calculation, while their immediate counterpart is the final, visible result of modeling calculations. For a simple financial model that calculates after-tax income, gross income is a dynamic independent variable, tax bracket and tax rate information are static, dependent variable parameters, income tax due is an intermediate dependent variable and the result, your after-tax income is the immediate dependent variable.
Considerations
-
Developing good financial modeling skills takes knowledge, time and practice. As you move around and up the learning curve, let your skill level, the complexity of a calculation and frequency of use determine whether an Excel function or a VBA macro is the more appropriate choice. In general, built-in functions are appropriate for “one-time” or short calculations, while VBA macros can be handy for calculations you need to perform often or for longer, complicated calculations. Built-in functions, available from within Excel or from the Data Analysis Toolpak add-in, are a good option if you are new to financial modeling. No-cost training on general Excel topics and the specifics of financial modeling can help you get there faster and is available from Microsoft, as well as independent sites such as the Financial Modeling Guide, Chandoo and the Family Computer Club.
3 / 3 / 0 Регистрация: 21.09.2014 Сообщений: 67 |
|
1 |
|
08.02.2015, 21:24. Показов 1366. Ответов 19
Доброго времени суток! подскажите пожалуйста как в VBA в Excel закодить программу, которая считала бы доход по вкладу в банке, была возможность подсчета эффективной ставки, возможность пополнения счета, и снятие средств со счета и переход на др. вклад…
0 |
Programming Эксперт 94731 / 64177 / 26122 Регистрация: 12.04.2006 Сообщений: 116,782 |
08.02.2015, 21:24 |
19 |
2079 / 1232 / 464 Регистрация: 20.12.2014 Сообщений: 3,237 |
|
08.02.2015, 22:23 |
2 |
доход по вкладу в банке Доход по вкладу в банке считается элементарно при помощи встроенных финансовых функций Excel как раз по вашим данным:
сумма вклада, период, ставка Эффективность ставки, не уверен, но тоже, вроде бы, в них есть.
0 |
3 / 3 / 0 Регистрация: 21.09.2014 Сообщений: 67 |
|
08.02.2015, 22:27 [ТС] |
3 |
chumich, в том то и дело что все это у меня сделано с использованием финансовых функций… Но нужно именно в VBA это реализовать в коде…
0 |
2079 / 1232 / 464 Регистрация: 20.12.2014 Сообщений: 3,237 |
|
08.02.2015, 22:59 |
4 |
Решение Я бы конечно всё сделал средствами Excel, а с помощью VBA только выходил из формы на нужные ячейки. Интересно, как вы можете писать диплом по программированию, если у вас с ним «туго»?
1 |
3 / 3 / 0 Регистрация: 21.09.2014 Сообщений: 67 |
|
09.02.2015, 20:05 [ТС] |
5 |
Спасибо Вам большое за помощь) дело в том, что то программирование, которое я изучаю в универе это lisp, haskell, prolog и т.д… а таких простых вещей как макросы в Excel не знаю)
0 |
3 / 3 / 0 Регистрация: 21.09.2014 Сообщений: 67 |
|
18.02.2015, 10:52 [ТС] |
6 |
chumich, здравствуйте снова) все сделала как Вы сказали, однако при вызове созданной функции выдает ошибку (ниже прикрепила скрин) . Расскажите пожалуйста как исправить данную ошибку? при вызове встроенных функций такой проблемы не возникало… Миниатюры
0 |
3827 / 2254 / 751 Регистрация: 02.11.2012 Сообщений: 5,930 |
|
18.02.2015, 13:19 |
7 |
в ячейках цифры а в функции текст (String).
0 |
3 / 3 / 0 Регистрация: 21.09.2014 Сообщений: 67 |
|
18.02.2015, 17:46 [ТС] |
8 |
Vlad999, ему не полегчало. Миниатюры
0 |
2079 / 1232 / 464 Регистрация: 20.12.2014 Сообщений: 3,237 |
|
18.02.2015, 20:45 |
9 |
как исправить данную ошибку? Светлана20, прикрепите файл, или хотя бы покажите код, где вы задаете переменные, а то так очень сложно определить ошибку.
0 |
3 / 3 / 0 Регистрация: 21.09.2014 Сообщений: 67 |
|
18.02.2015, 21:20 [ТС] |
10 |
chumich, в том то и дело что не вылазиет окошко где эти аргументы нужно задать, после выбора функций определенных пользователем, и выборе мной созданную функцию, не вылазиет окошко где задавать аргументы, а вылазиет это окошко с надписью: у данной функции нет аргументов. полазила на разных форумах, написано нужно задать какую то справку к этой функции…
0 |
3 / 3 / 0 Регистрация: 21.09.2014 Сообщений: 67 |
|
18.02.2015, 21:22 [ТС] |
11 |
chumich,
0 |
2079 / 1232 / 464 Регистрация: 20.12.2014 Сообщений: 3,237 |
|
19.02.2015, 00:44 |
12 |
Светлана20, поясните немного: как вы это вообще видите? Значения переменных будут вводиться в ячейки? Или в поля формы? Или в диалоговые окна для ввода?
0 |
3827 / 2254 / 751 Регистрация: 02.11.2012 Сообщений: 5,930 |
|
19.02.2015, 08:30 |
13 |
Светлана20 зачем вы расплодили один и тот же код да ещё и с одним и тем же именем. удалите все не нужные оставьте только один.
0 |
3 / 3 / 0 Регистрация: 21.09.2014 Сообщений: 67 |
|
19.02.2015, 08:42 [ТС] |
14 |
chumich, я представляю это так, как в ссылке http://www.planetaexcel.ru/techniques/3/59/ в пункте Создание пользовательских функций на VBA. Но не выходит окна с Аргументами функции.
0 |
2079 / 1232 / 464 Регистрация: 20.12.2014 Сообщений: 3,237 |
|
19.02.2015, 17:03 |
15 |
не выходит окна с Аргументами функции Чего-то я не нашел ничего про окно с аргументами функции. Но, работает
0 |
2079 / 1232 / 464 Регистрация: 20.12.2014 Сообщений: 3,237 |
|
19.02.2015, 18:44 |
16 |
Но я бы сделал так
1 |
3 / 3 / 0 Регистрация: 21.09.2014 Сообщений: 67 |
|
19.02.2015, 19:59 [ТС] |
17 |
chumich, спасибо большое) но я уже сама днем сделала)
1 |
3 / 3 / 0 Регистрация: 21.09.2014 Сообщений: 67 |
|
19.02.2015, 20:00 [ТС] |
18 |
chumich, не вылазило окно с заданием аргументов, т.к в самой формуле в макросе я использовала не буквами обозначения, а целыми словами) оказывается ларчик просто открывался
0 |
2079 / 1232 / 464 Регистрация: 20.12.2014 Сообщений: 3,237 |
|
19.02.2015, 20:13 |
19 |
Про окно всё равно не понял, потому что у меня как-то и без него всё получилось. Ну, и ладно
0 |
Vlad999 3827 / 2254 / 751 Регистрация: 02.11.2012 Сообщений: 5,930 |
||||
20.02.2015, 08:28 |
20 |
|||
для красоты, избавится бы ещё от лишних селектов.
0 |
Рассмотрим пример, в котором с помощью уже знакомых элементов управления мы создадим автоматизированную книгу для формирования списка сотрудников для получения денежного вознаграждения. Начнем создание новой книги, и один из листов (рис. 2.20) будет содержать списки сотрудников различных филиалов (или различных подразделений). Фактически это достаточно статическая справочная информация, которая время от времени корректируется (производится добавление и удалите сведений непосредственно в ячейках рабочего листа). Эти данные будут использоваться далее па первом листе, который назовем Начисления (рис. 2.21).
Рис. 2.20. Списки сотрудников филиалов
В верхней части листа Начисления расположены три переключателя для выбора одного из филиалов. Далее, правее — поле со списком и три кнопки. Значения свойства Name всех перечисленных элементов управления указаны в табл. 2.1.
Таблица 2.1. Перечень элементов управления на листе Начисления
Тип элемента управления | Name | Caption |
---|---|---|
Переключатель | Op1 | Филиал 1 |
Переключатель | Op2 | Филиал 2 |
Переключатель | Op3 | Филиал 3 |
Кнопка | VKL | Включить |
Кнопка | CLR | Очистка |
Кнопка | Prn | Печать |
Поле со списком | SPK |
Поясним, в чем заключается функционирование книги. Цель достаточно простая — заполнить необходимыми данными столбцы В, С и D. А именно: заполнить выборочный список сотрудников с указанием денежного вознаграждения. Для этого предназначено поле со списком и кнопка Включить.
Рис. 2.21. Оформление листа Начисления
В поле со списком заносятся фамилии сотрудников одного из филиалов, что производится с помощью щелчка на одном из переключателей в верхней части листа. В листинге 2.28 приведена процедура, которая выполняется по щелчку на переключателе с подписью Филиал 1. Здесь поле со списком сначала очищается, а затем заполняется данными из первого столбца второго листа.
1 2 3 4 5 6 7 8 9 10 11 |
' Листинг 2.28. Обработка щелчка на переключателе Филиал 1 Private Sub Op1_Click() N = 0 While Worksheets(2).Cells(N + 2, 1).Value <> "" N = N + 1 Wend Spk.Clear For i = 1 To N Spk.AddItem Worksheets(2).Cells(i + 1, 1).Value Next End Sub |
Процедуры, выполняемые по щелчкам на других переключателях (Филиал 2 и Филиал 3), представлены в листинге 2.29.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
' Листинг 2.29. Обработка щелчков на переключателях Филиал 2 и Филиал 3 Private Sub Op2_Click() N = 0 While Worksheets(2).Cells(N + 2, 2).Value <> "" N = N + 1 Wend Spk.Clear For i = 1 To N Spk.AddItem Worksheets(2).Cells(i + 1, 2).Value Next End Sub Private Sub Op3_Click() N = 0 While Worksheets(2).Cells(N + 2, 3).Value <> "" N = N + 1 Wend Spk.Clear For i = 1 To N Spk.AddItem Worksheets(2).Cells(i + 1, 3).Value Next End Sub |
Теперь, после того как поле со списком включает сотрудников выбранного филиала, пользователь должен указать необходимую фамилию и затем щелчком на кнопке Включить добавить ее в перечень (столбец С) на листе Начисления (рис. 2.22). Процедура, которая для этого потребуется, приведена в листинге 2.30.
1 2 3 4 5 6 7 8 9 |
' Листинг 2.30. Обработка щелчка на кнопке Включить Private Sub Vk1_Click() N = 0 While Cells(N + 8, 2).Value <> "" N = N + 1 Wend Cells(N + 8, 2).Value = N + 1 Cells(N + 8, 3).Value = Spk.Text End Sub |
Теперь необходимо разработать процедуру (листинг 2.31) заполнения листа Печать, где информация приведена без лишних элементов управления. В ней для формирования необходимых границ мы воспользовались коллекцией Borders. На рис. 2.23 приведен один из вариантов ее заполнения.
Рис. 2.22. Внесение фамилий и начисленных сумм
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
' Листинг 2.31. Процедура, выполняемая по щелчку на кнопке Печать Private Sub Prn_Click() ' Подсчет числа строк с фамилиями на 3-м листе N = 0 While Worksheets(3).Cells(N + 5, 3).Value <> "" N = N + 1 Wend ' Очистка информации с удалением границ For i = 1 To N For j = 1 To 3 Worksheets(3).Cells(4 + i, j + 1).Value = "" Worksheets(3).Cells(4 + i, j + 1).Borders.LineStyle = xlNone Next Next ' Подсчет числа строк с фамилиями на 1-м листе N1 = 0 While Cells(N1 + 8, 3).Value <> "" N1 = N1 + 1 Wend ' Цикл для заполнения 3-го листа For i = 1 To N1 Worksheets(3).Cells(4 + i, 2).Value = i Worksheets(3).Cells(4 + i, 3).Value = Cells(i + 7, 3) Worksheets(3).Cells(4 + i, 4).Value = Cells(i + 7, 4) ' Оформление ячеек границей For j = 1 To 3 Worksheets(3).Cells(4 + i, j + 1).Borders.LineStyle = xlContinuous Next Next Worksheets(3).Activate End Sub |
Рис. 2.23. Оформление листа Печать
Теперь осталась только процедура, выполняемая по щелчку на кнопке Очистка. Она приведена в листинге 2.32. Разработка готова, и вы можете проверить ее работоспособность.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
' Листинг 2.32. Процедура, выполняемая по щелчку на кнопке Очистка Private Sub Clr_Click() N = 0 While Cells(N + 8, 2).Value <> "" N = N + 1 Wend ' Очистка данных на текущем листе Range(Cells(8, 2), Cells(8 + N, 4)) = "" ' Подсчет заполненных ячеек на третьем листе N = 0 While Worksheets(3).Cells(N + 5, 3).Value <> "" N = N + 1 Wend ' Очистка ячеек на третьем листе For i = 1 To N For j = 1 To 3 Worksheets(3).Cells(4 + i, j + 1).Value = "" Worksheets(3).Cells(4 + i, j + 1).Borders.LineStyle = xlNone Next Next End Sub |
Материалы
Календарный план выпуска изделий
- Подробности
- Создано 03 Июнь 2011
Содержание |
---|
Описание примеров |
Условия задачи |
Пример с использованием итерационных вычислений |
Пример с использованием программы VBA |
Замечания по работе |
Недостатки алгоритмов |
Заключение |
Одной из самых сложных задач экономического менеджмента является составление календарного плана выпуска продукции в условиях дефицита производственных мощностей. Расчетные алгоритмы производственных программ или ERP-систем в большинстве случаев формируют планы только по номенклатуре и укрупненным плановым периодам. В дальнейшем эти планы вручную обрабатывает менеджер-планировщик, формируя ежедневные сменные задания. В терминах методики производственного планирования MRP II (Manufacturing Resource Planning) этот сформированный план имеет название Master Production Schedule (MPS, главный календарный план-график производства). Очевидно, что качество и оптимальность такого плана целиком и полностью зависит от опыта специалиста-планировщика.
Сложность поиска оптимального плана работы обусловлена множеством неизвестных, из-за чего бывает очень сложно написать алгоритм даже под конкретного заказчика – в реальной работе постоянно возникают ситуации, предусмотреть и формализовать которые заранее было невозможно. Эти сложности многократно возрастают при написании универсальных программ, ориентированных на определенную отрасль или тип производства.
Алгоритмы, использующие методы перебора всех возможных вариантов также не годятся для использования «впрямую», так как количество вариантов даже для недельного графика работы может составлять астрономические числа. Время работы таких «неумных» переборных алгоритмов может составлять дни, месяцы, а то и годы, что, очевидно, не очень годится для задач недельного планирования.
Описание примеров
Представленные в статье примеры реализуют частный случай задачи и дают общее направление по созданию моделей, помогающих в составлении календарного плана выпуска продукции.
Доступны два файла mps.xls и mps_vba.xls. Для работы последнего требуется подключение макросов:
В обоих файлах для поиска решения используется перебор вариантов, которые ограничены различными условиями. Причем ограничения добавляются в течение работы алгоритма. Аналогичный принцип применен в статье с решением головоломки Судоку.
Первый файл использует стандартные возможности итерационных вычислений Excel. Во втором файле перебор вариантов реализован при помощи программы VBA. Проверка условий в обоих случаях происходит с использованием формул рабочего листа. Структура справочников и форма вывода результатов абсолютна одинакова в обоих файлах.
Стоит обратить особое внимание на задание ограничений перебора вариантов. Необходимо добиться минимально количества неизвестных в задаче, а уже затем запускать алгоритм. Так, очевидно, что стоит искать решение только для дефицитных изделий на ограниченном количестве производственных ресурсов. Причем в процессе поиска может понадобиться ввод дополнительных ограничений, если прогнозное время работы будет составлять недопустимое значение.
В приведенных примерах ограничениями поиска выступают:
- Количество дней и смен
- Количество видов производимых изделий (номенклатура)
- Количество производственных линий (участков)
- Возможность производства определенных изделий на определенных участках
- Время работы и время на переналадку оборудования
- Предварительно установленные сменные задания на определенные даты и линии
Последнее ограничение самым существенным образом влияет на увеличение скорости работы алгоритма, поэтому желательно стремиться указать все точно известные планы заранее. Например, если точно известно, что переналадка линии 1 в плановый период не целесообразна (хотя и теоретически возможна), то нужно ввести планы изделия на все дни и смены работы этой линии.
Условия задачи
Рассмотрим подробнее условия задачи. Ее содержание основано (с некоторыми допущениями) на реальном опыте работы на действующем промышленном предприятии.
Имеется план выпуска по номенклатуре изделий на определенный период (в примере 5 дней), предприятие работает в 2 смены. Производство продукции может вестись одновременно на 3х производственных линиях. На переналадку линии на выпуск с одного изделия на другое требуется определенное время, указанное в справочнике. Имеется набор предустановленных сменных заданий.
Требуется составить календарный план-график выпуска изделий по датам-сменам и линиям, так чтобы общий выпуск был не меньше установленного номенклатурного плана на период.
Подразумевается, что для алгоритмического расчета используются только те изделия, составление прогнозного плана по которым представляет определенные трудности. В действительности план выпуска может содержать десятки других изделий, не требующих сложного алгоритма для распределения по дням и сменам.
Справочники и ограничения настраиваются в специальных таблицах – ячейки для этого выделены зеленым цветом. При настройке времени переналадки необходимо указать все возможные варианты для выпускаемых изделий по каждой производственной линии.
Наличие предустановленных сменных заданий является обязательным условием для планирования более чем на 3 дня (2 смены) с количеством изделий больше 5. В противном случае алгоритм будет перебирать варианты недопустимо большое время.
Пример с использованием итерационных вычислений
В примере 1 для изменения условий требуется ввести «1» в ячейку переключатель, затем нажать F9 (пересчет Excel в ручном режиме). Для запуска расчета введите туда же «0», затем также нажмиет F9.
Результаты расчетов отображаются в таблицах «Предлагаемый план выпуска» и «Выпуск по изделиям». Для оценки сложности написания переборного алгоритма формулами Excel можно открыть скрытые столбцы в файле.
Итерационный метод расчета заданный в файле по умолчанию позволяет перебрать максимально 30 000 вариантов плана. Если заданные ограничения не позволили найти вариант, но время расчета не прогнозируется как бесконечное, то для продолжения работы алгоритма необходимо нажать F9 еще раз (см.информацию в ячейке под переключателем расчета).
Пример с использованием программы VBA
В примере 2 вместо ячейки-переключателя имеется специальная кнопка «Пуск», предназначенная для запуска алгоритма поиска решения.
Пример с использование VBA также имеет скрытее столбцы с расчетными ячейками. Они используются только для контроля выполнения условий задачи, поэтому формулы там достаточно простые.
Замечания по работе
Настройку алгоритма под конкретные условия Вашего предприятия можно производить на любом файле. Пожалуй, проще это сделать на файле с программой VBA. Следует только понимать, что увеличение количества неизвестных в задаче приводит к увеличению времени работы алгоритма в геометрической прогрессии.
Неоднозначные результаты дает сравнение производительности алгоритмов с использованием итераций и VBA. Итерационный алгоритм дает сравнимый результат в различных версиях Excel. А вот решение на VBA в Excel 2000 работает в 4-5 раза быстрее, чем в Excel 2007. Причем в старых версиях и итерации и программа дают почти одинаковый результат по скорости поиска решения. Быстродействие можно существенно повысить, если убрать условное форматирование и запретить перерисовку экрана в программе (Excel тратит много времени на обновление экрана). В приведенных примерах этого не сделано специально, чтобы показать работу перебора вариантов.
ВНИМАНИЕ! Не открывайте одновременно оба файла примера в одном Excel. Параметр применения итерационных вычислений действует на все открытые файлы.
Недостатки алгоритмов
- Обязательная односимвольная кодировка номенклатуры. Причем для VBA-примера, необходимо использовать английские буквы «A-Z» (либо необходимо исправлять процедуру mdlCalc.CheckValueProd_).
- Перебор номенклатуры только в одном направлении. В примере – в обратном порядке по алфавиту кодов номенклатуры.
- Нет возможности поиска альтернативных вариантов без задания новых ограничений.
- Отсутствие прогноза времени выполнения поиска. Примерно представить себе скорость работы можно только визуально, глядя на меняющиеся варианты.
- Формулы, использованные в примере со стандартными итерационными вычислениями, очень сложны для понимания.
- Быстродействие программу VBA можно существенно увеличить за счет переноса всех проверок ограничений в код. Но это, во-первых, ведет к значительному усложнению процедур. Во-вторых, в таком случае программа станет практически независимой от Excel.
Заключение
Примеры к статье вряд ли подойдут без изменений для использования на Вашем предприятии в качестве программы автоматизации календарного производственного планирования. Задача статьи — показать общее направление и возможности Excel для решения подобных задач. Для экономиста планового отдела использование подобных алгоритмов может, как минимум, повысить понимание проблем при составлении производственного графика работы. А в лучшем случае позволит заменить или облегчить работу менеджеров производственных участков.
Смотри также
» Перекрестный расчет себестоимости
При разработке экономических моделей одной из самых интересных задач является решение проблемы перекрестных связей между формулами….
» Объединение строк
У продвинутых пользователей Excel очень популярен вопрос о возможности объединения диапазона ячеек, содержащих текст, в одну строку при…
» Распределение начислений по платежам
При ведении финансового учета в электронных таблицах обычно ограничиваются, так называемым «котловым» методом расчета задолженности…
» Судоку
Пример решения головоломки «Судоку 9х9» без программирования. К экономике отношения не имеет, зато отлично показывает возможности Excel в…
» Поиск кратчайшего маршрута
При решении сложных алгоритмических задач с использование электронных таблиц иногда приходится сталкиваться с ошибками из-за…
Предложите, как улучшить StudyLib
(Для жалоб на нарушения авторских прав, используйте
другую форму
)
Ваш е-мэйл
Заполните, если хотите получить ответ
Оцените наш проект
1
2
3
4
5
Выложил в открытый доступ надстройку для Excel с дополнительными финансовыми функциями для тех, кто делает финансовые модели проектов и компаний. Сам использую эти функции в работе уже несколько лет.
При установленной надстройке становятся доступны функции расчета простого и дисконтированного срока окупаемости (PBP, DPBP), Profitability Index, CAGR, налога на прибыль и другие. Эти функции позволяют сэкономить время, отказавшись от написания сложных формул, и избежать в моделях ячеек с промежуточными техническими расчетами.
Использование надстройки не требует внедрения макросов в сами файлы моделей.
Надстройку можно безопасно использовать в командах. Коллега, который тоже установит эту надстройку, без проблем откроет вашу модель с новыми формулами. Для этого надстройка при открытии файлов проверяет и обновляет нужные пути.
Настройка распространяется с открытым кодом. В репозитории на GitHub можно посмотреть исходники всех макросов и скачать уже готовый к установке файл.
Чтобы установить надстройку достаточно скачать готовую надстройку “InvestmentFunctions.xlam” и подключить ее в настройках Excel. Детальная инструкция в конце этой заметки.
Список функций и как их использовать
Disclaimer:
- Сигнатура функции описывает, какие аргументы принимает функция. Названия аргументов подобраны так, чтобы было понятно, что они означают. Для аргументов и особенной использования даны пояснения.
- Реальные примеры использования функций можно также посмотреть в файле-примере на листах “Examples”.
fCAGR — расчет CAGR по вектору значений
Рассчитывает совокупный среднегодовой темп роста (CAGR) по диапазону ячеек.
Сигнатура функции: fCAGR(rValuesRange As Range) As Double
Особенности:
- CAGR рассчитывается по первому столбцу или по первой строке диапазона, в зависимости от того, что длиннее. В случае равенства длин — по первой строке.
- Формула использует только первое и последнее значения диапазона. Поэтому ячейки в середине диапазона могут быть любыми.
fCAGR2 — расчет CAGR по начальному и конечному значению
Рассчитывает совокупный среднегодовой темп роста (CAGR) по начальному и конечному значению показателя с указанием периодов.
Сигнатура функции: fCAGR2(dStartValue As Double, dEndValue As Double, dStartYear As Double, dEndYear As Double) As Double
fDepreciation — расчет амортизации
Рассчитывает амортизацию в текущем периоде на базе диапазона предыдущих капитальных вложений и среднего срока амортизации активов.
Сигнатура функции: fDepreciation(rCapex As Range, dDepreciationPeriod As Double) As Double
Особенности:
- “rCapex” — диапазон ячеек с суммами капитальных вложений в предыдущие периоды. Порядок ячеек слева — направо.
fExtendAP — продлить ряд значений как арифметическую прогрессию
fExtendAP принимает на вход ряд значений, а далее продлевает его как арифметическую прогрессию. Функция может использоваться для продления денежного потока для формул ЧПС() и ВСД().
Сигнатура функции: fExtendAP(vInput As Variant, iPeriods As Variant, Optional dGrowthRate As Variant) As Variant
Особенности:
- “vInput” — может быть диапазоном ячеек или одним числом
- “iPeriods” — на какое количество периодов продлевать ряд
- Опциональный показатель “dGrowthRate” — шаг или разность арифметической прогрессии. По умолчанию — ноль.
fExtendGP — продлить ряд значений как геометрическую прогрессию
fExtendGP принимает на вход ряд значений, а далее продлевает его как геометрическую прогрессию. Функция может использоваться для продления денежного потока для формул ЧПС() и ВСД().
Сигнатура функции: fExtendGP(vInput As Variant, iPeriods As Variant, Optional dGrowthRate As Variant) As Variant
Особенности:
- “vInput” — может быть диапазоном ячеек или одним числом
- “iPeriods” — на какое количество периодов продлевать ряд
- Опциональный показатель “dGrowthRate” — знаменатель геометрической прогрессии. По умолчанию — 1.
fIncomeTax — расчет налога на прибыль
Рассчитывает налог на прибыль в текущем периоде с учетом прибыли и убытков прошлых периодов.
Сигнатура функции: fIncomeTax(rProfitRange As Range, dTaxRate As Double, Optional dPriorProfitsAndLosses As Double) As Double
Особенности:
- “rProfitRange” — диапазон ячеек с суммами прибыли до налога в предыдущие периоды, включая текущий период. Порядок ячеек слева — направо.
- “dTaxRate” — налоговая ставка в процентах. Например, “20% или “0,2”.
- Опциональный показатель “dPriorProfitsAndLosses” — входящая накопленная прибыль/убыток до первого периода. Значение убытка указывается с минусом.
fLimit — ограничение значения параметра в целевом диапазоне
Берет входящее значение и ограничивает сверху и снизу его в целевом диапазоне. Это продвинутый МИН(МАКС()), в котором не надо думать о порядке аргументов.
Сигнатура функции: fLimit(varInput, varLimit1, varLimit2)
Особенности:
- “varInput” — входящий параметр, значение которого мы хотим ограничить
- “varLimit1”, “varLimit2” — границы диапазона. Порядок указания (нижняя, верхняя границы) не важен.
fPayout — расчет свободного денежного потока с учетом будущих поступлений и платежей
Формула рассчитывает, сколько денег можно безопасно извлечь из денежного потока текущего периода, чтобы в будущем деньги на счетах не снижались ниже заданного лимита.
Сигнатура функции: fPayout(dPayoutBase As Double, rFutureCashFlow As Range, Optional dWACC As Double, Optional dMinCashLimit As Double) As Double
Особенности:
- “dPayoutBase” — денежный поток текущего периода, из которого мы берем деньги на дивиденды
- “rFutureCashFlow” — диапазон ячеек с денежными потокам в будущие периоды, не включая текущий период
- Опциональный показатель “dWACC” — стоимость капитала. Подразумевается, что неиспользованные деньги на счетах каждый период приносят эту доходность. По умолчанию — ноль.
- Опциональный показатель “dMinCashLimit” — неснижаемый денежный остаток. По умолчанию — ноль.
fPBP — расчет простого и дисконтированного срока окупаемости
Формула рассчитывает срок окупаемости для денежного потока с возможностью продления потока за период прогнозирования. (Wikipedia: Простой срок окупаемости, Дисконтированный срок окупаемости)
Сигнатура функции: fPBP(varCashFlowRange As Range, Optional varDiscountRate As Variant, Optional varGrowthRate As Variant) As Variant
Особенности:
- “varCashFlowRange” — диапазон ячеек с денежными потоками. Порядок ячеек слева-направо. Первая ячейка в диапазоне учитывается как нулевой период.
- Опциональный показатель “varDiscountRate” — ставка дисконтирования в процентах. Например, “20% или “0,2”. Если параметр не указан, то, по умолчанию, берется нулевое значение и формула считает простой срок окупаемости.
- Опциональный показатель “varGrowthRate” — темп роста в постпрогнозный период. Например, “1.05”. По умолчанию значение ноль. Если указать значение, то формула возьмет денежный поток последнего периода и будет продлевать его с заданным темпом. Максимальное количество периодов, на которое формула продляет денежный поток — 360.
fPI — расчет Profitability Index (PI)
Формула рассчитывает Profitability Index (“Индекс рентабельности”») денежного потока. (Wikipedia: Индекс рентабельности (PI))
Сигнатура функции: fPI(varCashFlowRange As Range, Optional varDiscountRate As Variant) As Variant
Особенности:
- “varCashFlowRange” — диапазон ячеек с денежными потоками. Порядок ячеек слева-направо.
- Опциональный параметр “varDiscountRate” — ставка дисконтирования в процентах. Например, “20% или “0,2”. Если параметр не указан, то, по умолчанию, берется нулевое значение.
Инструкция по установке
Все материалы доступны в репозитории на GitHub.
- Скачать файл “InvestmentFunctions.xlam” и сохранить, где будет удобно
- В Microsoft Excel войти в меню “Файл”->“Параметры”
- Далее перейти в раздел “Надстройки”. В поле внизу экрана выбрать “Надстройки Excel” и нажать “Перейти”.
- В появишемся окне нажать “Обзор” и указать путь к ранее сохраненному файлу “InvestmentFunctions.xlam”. В списке надстроек слева появится надстройка “Investmentfunctions”.
- Если все прошло успешно, то в Excel станут доступны новые функции.
Обратная связь
Вопросы, информацию о багах или предложения по развитию пишите здесь в комментариях или в Issues на GitHub.
comments powered by