是否可以翻转 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 创建
我正在处理一个项目,我使用 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 创建