Моделирование Монте-Карло в VBA / Excel - PullRequest
0 голосов
/ 12 ноября 2018

Я пытаюсь создать «общий / стандартизированный» макрос для моделирования Монте-Карло в VBA / Excel. Мне удалось написать довольно эффективный код, который хорошо работает в простых случаях, когда весь расчет / формула записывается в одной ячейке (с входными данными из других ячеек). Однако я изо всех сил пытаюсь найти способ написать эффективный код для более сложных вычислений.

Всякий раз, когда я работаю с симуляцией в VBA / Excel, я всегда стараюсь выполнять все вычисления в VBA и получать только ввод / вывод в Excel - чтобы максимально увеличить скорость симуляции. К сожалению, для «сложных» вычислений (читай: несколько вычислений, в конечном итоге приводящих к одному результату), например анализ дисконтированных денежных потоков, где результат представляет собой сумму приведенной стоимости прогнозируемых денежных потоков за несколько лет вперед, а денежный поток за каждый год основан на нескольких допущениях, это довольно трудоемкий и почти невозможный процесс записи всех расчеты в VBA. Единственный способ выполнить моделирование по методу Монте-Карло в таких моделях, о которых я только мог подумать, - это написать цикл, в котором я заменяю желаемую входную переменную на случайное извлечение из соответствующего распределения и пересчитываю рабочую книгу для каждого прогона цикла и сохранить результат каждого прогона в выходной лист. Вот очень грубый пример кода:

Sub MCDCF()

Dim i As Long, iterations As Long
Dim target As Range, variable As Range

With Application
                .ScreenUpdating = False
                .EnableEvents = False
                .Calculation = xlCalculationManual
End With

iterations = Cells(5, 17).Value

Set target = Cells(28, 3)
Set variable = Cells(47, 3)

For i = 1 To iterations
    variable.Value = Application.WorksheetFunction.NormInv(Rnd(), Cells(7, 17).Value, Cells(8, 17).Value)
    ActiveSheet.Calculate
    Cells(5 + i, 19).Value = target.Value
Next

With Application
                .ScreenUpdating = True
                .EnableEvents = True
                .Calculation = xlCalculationAutomatic
End With

End Sub

Вышеуказанный подход слишком медленный. У кого-нибудь есть предложения по альтернативному подходу?

Дополнительная информация. Под «общим / стандартизированным» макросом я подразумеваю, что я создам пользовательскую форму с входными данными RefEdit для выходной ячейки, ячейкой, содержащей переменную, которую необходимо смоделировать, и числом итераций - с целью применения макроса. к нескольким различным моделям Excel.

И да, я знаю, что VBA / Excel - далеко не лучший инструмент для моделирования. Тем не менее, это единственная альтернатива для людей, которые будут использовать это.

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