是否可以翻转 R 中的公式?

Is it possible to flip a formula in R?

我正在处理一个项目,我使用 PerformanceAnalytics 包中的 VaR() 函数来计算风险价值。我想找出股票产生 1% 或更多损失的概率。我通过将数字插入概率变量并控制它是否接近 -1% 找到了解决问题的方法。但是,我很好奇是否可以翻转公式,这样我就可以插入输出,然后函数将产生输入。

以 97.5% 的概率产生损失:

VaR(DNOlog, p = 0.975)

通过改变概率直到它适合产生 -1% 的损失:

VaR(DNOlog, p = 0.6512184)

你要的是inverse function。如果计算函数的大量值不是太昂贵,那么您可以通过计算许多 x-y 对然后将 y 作为 x 的函数来获得很好的近似值。因为你并没有真正说出你的函数是什么,所以我将使用一个简单的函数 y = x + sin(x) 作为例子。

x = seq(0,6, 0.01)
y = x + sin(x)
InverseFunction = approxfun(y,x)

## Test with an example
InverseFunction(4)      ## gives 4.967601

x1 = 4.967601
x1 + sin(x1)            ## 3.999991

如果您想要更高的准确性,请在 x 之间使用更小的间距。

让我们得到一个可重现的例子来演示你将如何去做:

library(PerformanceAnalytics)

set.seed(2)
returns <- rnorm(1000, sd = 0.01)

这给了我们一个合理的结果 VaR

VaR(returns, p = 0.975)
#>            [,1]
#> VaR -0.01893631

要扭转这一点,我们可以使用 uniroot。这是一个函数,它使用迭代方法来查找构成函数 return 0:

的输入值
inverse_VaR <- function(x, target) {
  f <- function(p) VaR(x, p)[1, 1] - target
  uniroot(f, c(0.6, 0.99999), tol = .Machine$double.eps)$root
}

在我们的例子中,如果我们想找到 p 值使得 VaR 使用我们的向量 returns 给出 -0.01 的输出,我们可以这样做:

inverse_VaR(returns, -0.01)
#> [1] 0.848303

为了展示这个作品,我们可以这样做:

VaR(returns, 0.848303)
#>             [,1]
#> VaR -0.009999999

reprex package (v2.0.1)

于 2022-04-16 创建