Разделение матриц с использованием функции VBA - PullRequest
0 голосов
/ 28 февраля 2019

Очень плохо знаком с VBA, поэтому прошу прощения, если это действительно простой вопрос.Это связано с управлением финансами / портфелем.

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

Я могу ввести эту формулу непосредственно в ячейки Excel, чтобы получить веса: = MMULT (MINVERSE (S), единицы) / SUM (MMULT (MINVERSE (S), единицы))) где S - дисперсионно-ковариационная матрица, а единицы - матрица столбцов, содержащая «1» s

Нет проблем с отображением размеров матриц (если S - 5x5, то единицы будут 5x1)

Я пытался создать функцию VBA, чтобы мне не приходилось каждый раз вводить длинную формулу, чтобы найти GMVP.Вот код, который у меня есть.До этого я также пытался написать все очень длинной строкой, используя «/» для деления (не сработало)

Интересно, так ли это, потому что мы не можем использовать «/» для разделения матриц?в VBA?Есть ли способ превратить формулу в функцию?

Спасибо!

Function GMVPcol(S As Range, Ones As Range) As Range
Dim num As Range
Dim dem As Range

num = Application.WorksheetFunction.MMult(Application.WorksheetFunction.MInverse(S), Ones)
dem = Application.WorksheetFunction.Sum(Application.WorksheetFunction.MMult(Application.WorksheetFunction.MInverse(S), Ones))

GMVPcol = Application.WorksheetFunction.MMult(num, Application.WorksheetFunction.MInverse(dem))

End Function

1 Ответ

0 голосов
/ 28 февраля 2019

Если вы чрезвычайно упрощаете свою формулу до чего-то вроде этого:

enter image description here

тогда, это правильный способ представить ее как функцию VBAи вызвать его в Excel:

Public Function SimpleMultiplication(matrix1 As Range, matrix2 As Range) As Variant
    SimpleMultiplication = WorksheetFunction.MMult(matrix1, matrix2)
End Function

Функция возвращает вариант, а не диапазон.И в своем коде всегда используйте ключевое слово Set, когда нужно назначить объект типа range.В общем, если вы хотите пройти через средний диапазон и назначить его, тогда лучше работать с массивом и брать оттуда числа - Создание массива из диапазона в VBA

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