我的任务是创建一个“风险价值”功能,该功能可以引用一个范围和几个单元格中的数据。代码是:
Option Explicit
Function VaR(returns As Range, days, confidenceinterval, portfoliovalue)
VaR = (Application.WorksheetFunction.Average(returns) * Application.WorksheetFunction.SQRT(days)) - (Application.WorksheetFunction.NormSDist(confidenceinterval) * (Application.WorksheetFunction.StDev_S(returns) * Application.WorksheetFunction.SQRT(days))) * portfoliovalue
End Function
Returns是一系列回报,而其他仅仅是单元格中的值。
您可以推断,我只是复制了我的excel测试公式,在每个参数之前添加了application.worksheet。但是,尽管我的测试公式有效,但以VBA应该识别的格式转换的相同代码却没有。
原始公式是
=(AVERAGE(returns)*SQRT(days))-(NORMSDIST(confidenceinterval)*(STDEV.S(returns)*SQRT(days)))*portfoliovalue
任何帮助都是非常棒的!
提前谢谢!
答案 0 :(得分:2)
如果您希望VBA函数返回值,则格式为
'Function functionName(parameters As parameterType) As returnType
因此,您的(假设我选择的类型是正确的)应该解析为:
Function VaR(returns As Range, days As Integer, confidenceinterval as Double, portfoliovalue As Double) As Double
根据Scott的建议,您可以选择一种分解并“逐步完成”正在研究的公式的方法。如果在代码窗口中显示View > Locals Window
,可以使用 F8 逐行浏览代码,则可以看到part1
和part2
的值,因为它们每次操作更新。
Option Explicit
Function VaR(returns As Range, days As Integer, confidenceinterval As Double, portfoliovalue As Double) As Double
Dim part1 As Double
Dim part2 As Double
With Application.WorksheetFunction
part1 = .Average(returns) * .SQRT(days)
part2 = .NormSDist(confidenceinterval) * (.StDev_S(returns) * .SQRT(days))
VaR = part1 - part2 * portfoliovalue
End With
End Function
因为您必须使用的测试公式是
=(AVERAGE(returns)*SQRT(days))-(NORMSDIST(confidenceinterval)*(STDEV.S(returns)*SQRT(days)))*portfoliovalue
我建议将每个部分分开,以便您可以比较例如我的part1
与=(AVERAGE(returns)*SQRT(days))
等
答案 1 :(得分:2)
您有两个问题。首先,您的函数名称VaR
与Excel的内置VAR
(方差)函数冲突。其次,没有Application.WorksheetFunction.SQRT
函数;请改用VBA的Sqr
。这应该起作用:
Function ValueAtRisk(returns As Range, days, confidenceinterval, portfoliovalue)
With Application.WorksheetFunction
ValueAtRisk = (.Average(returns) * Sqr(days)) - (.NormSDist(confidenceinterval) * (.StDev_S(returns) * Sqr(days))) * portfoliovalue
End With
End Function
希望有帮助