使用VBA函数划分矩阵

时间:2019-02-28 12:10:23

标签: excel vba matrix

对于VBA来说是非常新的知识,如果这是一个非常简单的问题,敬请原谅。这与财务/投资组合管理有关。

我想创建一个VBA函数,该函数可以仅使用资产的方差-协方差矩阵为我提供一组资产的全局最小方差投资组合(GMVP)权重。

我可以直接在Excel中的单元格中键入此公式以获取权重: = MMULT(MINVERSE(S),Ones)/ SUM(MMULT(MINVERSE(S),Ones))< / strong>,其中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 :(得分:1)

如果您将公式简化得如此之类的话:

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。通常,如果要通过中间范围并进行分配,那么最好使用数组并从那里获取数字-Creating an Array from a Range in VBA