我正在尝试创建一个宏,将组合的估计std dev返回给单元格。然而,作为股票的一部分,他们的covar以及他们的权重将基本上不断变化,并且我想在VBA中使用不同的投资组合(我的最终目标是尽可能简化报告)。
我似乎无法理解 ctrl + shift + 输入或sqr部分。
你可以看看我的代码帮帮我吗?Sub PorteføljeRisiko()
Dim RapportBok As Workbook
Dim RapportArk As Worksheet
Set RapportBok = Workbooks("Rapport kunder")
Set RapportArk = RapportBok.Sheets(1)
Dim Region1 As Long
Dim RegionA As Long
Dim Matrise As Range
(因为股票的数量不同,我在这里找出实际包含一个值的行数(即每股的权重%))
Region1 = Application.WorksheetFunction.CountIf(RapportArk.Range("AC7:AC18"), "<>" & "")
RegionA = Region1 - 1
(获得股票之间的covar矩阵,因为股票的变化与购买和出售股票有关。矩阵从单元格开始(3,55)
SisteKolonne = RapportArk.Cells(RegionA + 3, RegionA + 55)
Set Matrise = RapportArk.Range(Cells(3, 55), Cells(3 + RegionA, 55 + RegionA))
Set Region = RapportArk.Range("AC7:AC" & Region1 + 6)
(我希望结果在Range(“AG21”)中)
RapportArk.Range("AG21").FormulaArray = MMult(Application.MMult(Region, Matrise), Application.Transpose(Region))
(一切正常,除了它返回#VALUE!因为我似乎无法得到 ctrl + shift + 输入部分也不是宏中的SQR部分
End Sub
答案 0 :(得分:6)
首先,您在VBA中计算的内容不是formula
,而是value
。除此之外,我无法验证您的所有计算,但我可以在这里看到问题:
Application.MMult(Region, Matrise)
尺寸不符合矩阵乘法的规则。通过分析代码,Region
是一个大小为Region1
的列向量,而Matrise
是一个Region1 x Region1
矩阵。
请记住,矩阵乘法不是可交换的。很可能你想要的是切换这些操作数的顺序:
Application.MMult(Matrise, Region)
这将为您提供大小为Region1
的列向量。但是你想要一个带有向量Region
的点积,这里再次出现行向量,所以你应该在第一个操作数上应用Transpose
而不是在第二个。所以正确的陈述应该是:
RapportArk.Range("AG21").value = _
Application.MMult(Application.Transpose(Application.MMult(Matrise, Region)), Region)
由于上一次操作是两个向量的dot-product
,您可以使用SumProduct
简化它:
RapportArk.Range("AG21").value = _
Application.SumProduct(Application.MMult(Matrise, Region), Region)