对于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
答案 0 :(得分:1)
如果您将公式简化得如此之类的话:
然后,这是将其表示为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