计算R中的VaR并将其添加到数据帧

时间:2019-11-23 19:01:01

标签: r function dataframe dplyr finance

晚安社区!

我目前正在尝试计算R中的历史风险值。这需要一个包含Daimler->DAI列的股票价格(date)数据框, pricedaily returns。 我找到了一个包PerformanceAnalytics,该包可以让我计算该值,但只接受所有值(~3,600观测值)并返回一个数字。相反,我想添加一个列,其中包含每个时间的特定计算得出的VaR

由于我对R并不陌生,因此我首先必须弄清楚如何制作自制函数并提出以下建议:

require(dplyr)
# Read table from csv#
TableDAI <- read.csv2(xxx)
#Take columns from table to a dataframe#
DAI <- data.frame(Date=TableDAI$Date,  DAI.Close=TableDAI$Close)
### formulate an easy function for daily returns#
f.returns <- function(x, n=1){
  Returns <- x/lag(x,n)-1
  return(Returns)
}
## Open new column with returns##
DAI$DAI.Returns <- f.returns(DAI$DAI.Close)

到目前为止很好。

现在,如果我要进行下一步,则需要计算一个VaR函数,该函数需要准确地250过去的收益观察值,然后对这些历史收益进行.05分位数。之后,它将用sqrt(20)来计时该值。

我的方法:

#Calculate the historic VaR for each row#
VaR.hist <- function(x, n=250, hd=20, q=0.05){
  quantil <- quantile(lag(x,n):x,q)
  VaR <- quantil*sqrt(hd)
  return(VaR)
}

不幸的是,结果只是0的一列。我看到的另一个问题是,由于没有足够的观测值,因此无法计算第一个250

我希望我能解决这个问题,并且有人可以提供帮助。 谢谢!

1 个答案:

答案 0 :(得分:0)

我不确定您如何为此历史数据定义VaR。您是否只需要第95个经验百分位数?如果是这样,假设您的向量是x

VaR_95 <- quantile(x, .95)

另一方面,如果您想对平均值假设平稳和高斯“误差”,以便估计股票价格与历史价格的简单标准差,然后使用该标准差来计算您的VaR:

mu_hat <- mean(x)
sigma_hat <- var(x) %>% sqrt
VaR_95 <- qnorm(.95, mu_hat, sigma_hat)

我不确定您遇到麻烦的部分是否在数据框的边缘上应用了此功能。如果是这样...

my_func <- function(x, q) {
    mu_hat <- mean(x)
    sigma_hat <- var(x) %>% sqrt
    qnorm(q, mu_hat, sigma_hat) %>%
      return()
}

apply(df, 1, my_func, q = .95)

这可能会成为一个非常复杂的话题,涉及回归和其他建模技术,因为股票价格几乎肯定不是固定的,并且您的历史数据可能未捕捉到未来变动的真正潜力。希望这能回答您的编码问题。