Мои финансы excel vba

Время на прочтение
5 мин

Количество просмотров 37K

Статья адресована и будет полезна в первую очередь тем, кто начал изучать опционы и хочет разобраться в их ценообразовании. Ну и во вторую очередь тем, кто ещё не использует инструмент VBA в своих расчётах в екселе, но хочет научиться — вы увидите, как это на самом деле просто.

Основы опционов

Для начала кратко о сути и ценообразовании опционов. Опцион имеет четыре основных параметра:

1. Базовый актив
2. Тип опциона (Колл или Пут)
3. Цена страйка (цена исполнения опциона)
4. Дата экспирации (истечения) опциона

Для покупателя опциона он представляет собой право

купить (опцион Колл) или продать (опцион Пут) базовый актив по цене страйка в день экспирации.

Для продавца опциона он представляет собой обязанность

продать (опцион Колл) или купить (опцион Пут) базовый актив по цене страйка в день экспирации. Фактически опцион представляет собой страховку от изменения цены базового актива (БА) от момента сделки до даты экспирации — в роли страховщика выступает продавец (в случае неблагоприятного изменения цены БА он выплачивает страховку покупателю опциона), а страхователем является покупатель опциона (он платит за страховку продавцу).

Как и цена страховки цена опциона полностью определяется вероятностью «страхового случая», т.е. исполнения опциона (исполнения права покупателя опциона). Основные составляющие, которые влияют эту вероятность и на цену опциона, на стоимость страховки, которую платит покупатель и получает продавец:

  • Разница между ценой страйка и ценой базового актива. Т.е. при покупке Колла, чем выше его страйк, тем он дешевле (т.к. снижается вероятность того, что на момент экспирации БА будет выше цены страйка)
  • Волатильность базового актива. Чем выше волатильность (грубо размах колебаний цены) БА, тем выше вероятность достичь страйка до экспирации.
  • Время до экспирации. Чем больше времени до экспирации опциона, тем при покупке Колла выше вероятность что за это время цена базового актива уйдёт выше страйка, соответственно цена опциона выше.

При этом зависимость цены опциона по каждой из этих трёх составляющих нелинейная. Ставшая общепринятой формула оценки опционов с учётом этих основных факторов была выведена Фишером Блэком и Майроном Шоулзом в 1973 году.

Формула Блэка-Шоулза имеет следующий вид (подробно можно посмотреть в Википедии):

Цена (европейского) опциона call:

image
image
image

Цена (европейского) опциона put:

image

Обозначения:
C(S,t) — текущая стоимость опциона call в момент t до истечения срока опциона (до экспирации);
S — текущая цена базового актива;
N(x) — вероятность того, что отклонение будет меньше в условиях стандартного нормального распределения (таким образом, и ограничивают область значений для функции стандартного нормального распределения);
K — цена исполнения опциона;
r — безрисковая процентная ставка;
T — t — время до истечения срока опциона;
image — волатильность доходности (квадратный корень из дисперсии) базового актива.

Греки опционов

Для оценки чувствительности цены опциона к цене БА, волатильности, и времени до экспирации, применяют коэффициенты, называемые Греками (коэффициенты в основном обозначаются греческими буквами, за исключением «веги»).

Греки в модели Блэка-Шоулза вычисляются следующим образом:

1. Дельта (image) — скорость изменения цены опциона от изменения цены БА. Для опциона Колл дельта равна image, для опциона Пут image. Дельта показывает текущий наклон кривой стоимости опциона в зависимости от цены БА.

2. Гамма ( image) — скорость изменения цены опциона от изменения Дельты (или ускорение от изменения цены БА). Гамма равна image.

3. Вега ( image ) — описывает зависимость цены опциона от изменения волатильности БА: image. Вега отражает число пунктов изменения стоимости опциона на каждый процентный пункт (1%) изменения волатильности.

4. Тета ( image) — описывает снижение цены опциона в зависимости от времени до экспирации. Для Колла — image, для Пута — image.

Вышеприведенные формулы верны для общего случая, в том числе для случая опционов на акции. Для расчёта опционов на фьючерсные контракты безрисковая ставка 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 Function

Function d_2(S, X, d, y, v)
T = d / y
d_2 = d_1(S, X, d, y, v) — v * (T ^ 0.5)
End Function

Function Nd_1(S, X, d, y, v)
Nd_1 = Application.NormSDist(d_1(S, X, d, y, v))
End Function

Function Nd_2(S, X, d, y, v)
Nd_2 = Application.NormSDist(d_2(S, X, d, y, v))
End Function

Function N_d_1(S, X, d, y, v)
N_d_1 = Application.NormSDist(-d_1(S, X, d, y, v))
End Function

Function N_d_2(S, X, d, y, v)
N_d_2 = Application.NormSDist(-d_2(S, X, d, y, v))
End Function

Function 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 Function

Function 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 Function

Function 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 Function

Function 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 Function

Function Gamma(S, X, d, y, v)
T = d / y
Gamma = N1d_1(S, X, d, y, v) / (S * (v * (T ^ 0.5)))
End Function

Function 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

  1. 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

  1. 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

  1. 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

  1. 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

Цитата
Сообщение от Светлана20
Посмотреть сообщение

доход по вкладу в банке

Доход по вкладу в банке считается элементарно при помощи встроенных финансовых функций Excel как раз по вашим данным:

Цитата
Сообщение от Светлана20
Посмотреть сообщение

сумма вклада, период, ставка

Эффективность ставки, не уверен, но тоже, вроде бы, в них есть.
Пополнение и снятие средств со счета — это элементарное внесение данных в нужные ячейки.
Вам нужно четко представлять (без программирования), что и как должно происходить в вашей программе, изучить финансовые функции и азы работы в VBA Excel, хотя бы здесь:
http://dpivi.ru/96-2-osnovy-pr… e-vba.html
http://www.on-line-teaching.com/vba/index.html
Потом попробовать написать программу. Выложить ее сюда и попросить исправить ошибки.



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

Лучший ответ Сообщение было отмечено Светлана20 как решение

Решение

Я бы конечно всё сделал средствами Excel, а с помощью VBA только выходил из формы на нужные ячейки. Интересно, как вы можете писать диплом по программированию, если у вас с ним «туго»?
Во вложении примеры реализации финансовых функций средствами VBA — мне кажется там как раз то, что вам нужно. Посмотрите в упражнениях. А в ссылке хороший материал по общим вопросам программирования на VBA.
http://www.askit.ru/custom/vba… e_plan.htm



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, здравствуйте снова) все сделала как Вы сказали, однако при вызове созданной функции выдает ошибку (ниже прикрепила скрин) . Расскажите пожалуйста как исправить данную ошибку? при вызове встроенных функций такой проблемы не возникало…

Миниатюры

VBA.  Использование финансовых функций
 

VBA.  Использование финансовых функций
 



0



3827 / 2254 / 751

Регистрация: 02.11.2012

Сообщений: 5,930

18.02.2015, 13:19

7

в ячейках цифры а в функции текст (String).
вам нужно исправить String на Currency



0



3 / 3 / 0

Регистрация: 21.09.2014

Сообщений: 67

18.02.2015, 17:46

 [ТС]

8

Vlad999, ему не полегчало.

Миниатюры

VBA.  Использование финансовых функций
 

VBA.  Использование финансовых функций
 



0



2079 / 1232 / 464

Регистрация: 20.12.2014

Сообщений: 3,237

18.02.2015, 20:45

9

Цитата
Сообщение от Светлана20
Посмотреть сообщение

как исправить данную ошибку?

Светлана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

Цитата
Сообщение от Светлана20
Посмотреть сообщение

не выходит окна с Аргументами функции

Чего-то я не нашел ничего про окно с аргументами функции. Но, работает



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

для красоты, избавится бы ещё от лишних селектов.
например

Visual Basic
1
2
3
4
5
это
Range("C36").Select
ActiveCell.FormulaR1C1 = "=S(R[1]C,R[2]C,R[3]C,R[4]C)"
можно записать так
Range("C36").FormulaR1C1 = "=S(R[1]C,R[2]C,R[3]C,R[4]C)"



0



Рассмотрим пример, в котором с помощью уже знакомых элементов управления мы создадим автоматизированную книгу для формирования списка сотрудников для получения денежного вознаграждения. Начнем создание новой книги, и один из листов (рис. 2.20) будет содержать списки сотрудников различных филиалов (или различных подразделений). Фактически это достаточно статическая справочная информация, которая время от времени корректируется (производится добавление и удалите сведений непосредственно в ячейках рабочего листа). Эти данные будут использоваться далее па первом листе, который назовем Начисления (рис. 2.21).

Рис. 2.20. Списки сотрудников филиалов

Рис. 2.20. Списки сотрудников филиалов

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

Таблица 2.1. Перечень элементов управления на листе Начисления

Тип элемента управления Name Caption
Переключатель Op1 Филиал 1
Переключатель Op2 Филиал 2
Переключатель Op3 Филиал 3
Кнопка VKL Включить
Кнопка CLR Очистка
Кнопка Prn Печать
Поле со списком SPK

Поясним, в чем заключается функционирование книги. Цель достаточно простая — заполнить необходимыми данными столбцы В, С и D. А именно: заполнить выборочный список сотрудников с указанием денежного вознаграждения. Для этого предназначено поле со списком и кнопка Включить.

Рис. 2.21. Оформление листа Начисления

Рис. 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. Внесение фамилий и начисленных сумм

Рис. 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.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, налога на прибыль и другие. Эти функции позволяют сэкономить время, отказавшись от написания сложных формул, и избежать в моделях ячеек с промежуточными техническими расчетами.

installation_step4

Использование надстройки не требует внедрения макросов в сами файлы моделей.

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

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

Чтобы установить надстройку достаточно скачать готовую надстройку “InvestmentFunctions.xlam” и подключить ее в настройках Excel. Детальная инструкция в конце этой заметки.


Список функций и как их использовать

Disclaimer:

  • Сигнатура функции описывает, какие аргументы принимает функция. Названия аргументов подобраны так, чтобы было понятно, что они означают. Для аргументов и особенной использования даны пояснения.
  • Реальные примеры использования функций можно также посмотреть в файле-примере на листах “Examples”.

fCAGR — расчет CAGR по вектору значений

Рассчитывает совокупный среднегодовой темп роста (CAGR) по диапазону ячеек.

Сигнатура функции: fCAGR(rValuesRange As Range) As Double

fcagr

Особенности:

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

fCAGR2 — расчет CAGR по начальному и конечному значению

Рассчитывает совокупный среднегодовой темп роста (CAGR) по начальному и конечному значению показателя с указанием периодов.

Сигнатура функции: fCAGR2(dStartValue As Double, dEndValue As Double, dStartYear As Double, dEndYear As Double) As Double

fCAGR2


fDepreciation — расчет амортизации

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

Сигнатура функции: fDepreciation(rCapex As Range, dDepreciationPeriod As Double) As Double

fDepreciation

Особенности:

  • “rCapex” — диапазон ячеек с суммами капитальных вложений в предыдущие периоды. Порядок ячеек слева — направо.

fExtendAP — продлить ряд значений как арифметическую прогрессию

fExtendAP принимает на вход ряд значений, а далее продлевает его как арифметическую прогрессию. Функция может использоваться для продления денежного потока для формул ЧПС() и ВСД().

Сигнатура функции: fExtendAP(vInput As Variant, iPeriods As Variant, Optional dGrowthRate As Variant) As Variant

fExtendAP

Особенности:

  • “vInput” — может быть диапазоном ячеек или одним числом
  • “iPeriods” — на какое количество периодов продлевать ряд
  • Опциональный показатель “dGrowthRate” — шаг или разность арифметической прогрессии. По умолчанию — ноль.

fExtendGP — продлить ряд значений как геометрическую прогрессию

fExtendGP принимает на вход ряд значений, а далее продлевает его как геометрическую прогрессию. Функция может использоваться для продления денежного потока для формул ЧПС() и ВСД().

Сигнатура функции: fExtendGP(vInput As Variant, iPeriods As Variant, Optional dGrowthRate As Variant) As Variant

fExtendGP

Особенности:

  • “vInput” — может быть диапазоном ячеек или одним числом
  • “iPeriods” — на какое количество периодов продлевать ряд
  • Опциональный показатель “dGrowthRate” — знаменатель геометрической прогрессии. По умолчанию — 1.

fIncomeTax — расчет налога на прибыль

Рассчитывает налог на прибыль в текущем периоде с учетом прибыли и убытков прошлых периодов.

Сигнатура функции: fIncomeTax(rProfitRange As Range, dTaxRate As Double, Optional dPriorProfitsAndLosses As Double) As Double

fIncomeTax

Особенности:

  • “rProfitRange” — диапазон ячеек с суммами прибыли до налога в предыдущие периоды, включая текущий период. Порядок ячеек слева — направо.
  • “dTaxRate” — налоговая ставка в процентах. Например, “20% или “0,2”.
  • Опциональный показатель “dPriorProfitsAndLosses” — входящая накопленная прибыль/убыток до первого периода. Значение убытка указывается с минусом.

fLimit — ограничение значения параметра в целевом диапазоне

Берет входящее значение и ограничивает сверху и снизу его в целевом диапазоне. Это продвинутый МИН(МАКС()), в котором не надо думать о порядке аргументов.

Сигнатура функции: fLimit(varInput, varLimit1, varLimit2)

fLimit

Особенности:

  • “varInput” — входящий параметр, значение которого мы хотим ограничить
  • “varLimit1”, “varLimit2” — границы диапазона. Порядок указания (нижняя, верхняя границы) не важен.

fPayout — расчет свободного денежного потока с учетом будущих поступлений и платежей

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

Сигнатура функции: fPayout(dPayoutBase As Double, rFutureCashFlow As Range, Optional dWACC As Double, Optional dMinCashLimit As Double) As Double

fPayout

Особенности:

  • “dPayoutBase” — денежный поток текущего периода, из которого мы берем деньги на дивиденды
  • “rFutureCashFlow” — диапазон ячеек с денежными потокам в будущие периоды, не включая текущий период
  • Опциональный показатель “dWACC” — стоимость капитала. Подразумевается, что неиспользованные деньги на счетах каждый период приносят эту доходность. По умолчанию — ноль.
  • Опциональный показатель “dMinCashLimit” — неснижаемый денежный остаток. По умолчанию — ноль.

fPBP — расчет простого и дисконтированного срока окупаемости

Формула рассчитывает срок окупаемости для денежного потока с возможностью продления потока за период прогнозирования. (Wikipedia: Простой срок окупаемости, Дисконтированный срок окупаемости)

Сигнатура функции: fPBP(varCashFlowRange As Range, Optional varDiscountRate As Variant, Optional varGrowthRate As Variant) As Variant

fPBP

Особенности:

  • “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

fPI

Особенности:

  • “varCashFlowRange” — диапазон ячеек с денежными потоками. Порядок ячеек слева-направо.
  • Опциональный параметр “varDiscountRate” — ставка дисконтирования в процентах. Например, “20% или “0,2”. Если параметр не указан, то, по умолчанию, берется нулевое значение.

Инструкция по установке

Все материалы доступны в репозитории на GitHub.

  1. Скачать файл “InvestmentFunctions.xlam” и сохранить, где будет удобно
  2. В Microsoft Excel войти в меню “Файл”->“Параметры” Файл->Параметры
  3. Далее перейти в раздел “Надстройки”. В поле внизу экрана выбрать “Надстройки Excel” и нажать “Перейти”. Надстройки Excel
  4. В появишемся окне нажать “Обзор” и указать путь к ранее сохраненному файлу “InvestmentFunctions.xlam”. В списке надстроек слева появится надстройка “Investmentfunctions”. Надстройки Excel
  5. Если все прошло успешно, то в Excel станут доступны новые функции. Надстройки Excel

Обратная связь

Вопросы, информацию о багах или предложения по развитию пишите здесь в комментариях или в Issues на GitHub.

comments powered by

Понравилась статья? Поделить с друзьями:
  • Мои строительные таблицы в excel
  • Мои разработки в excel
  • Мои программы бесплатно excel
  • Мои навыки в excel
  • Мои документы аналог word