晚安社区!
我目前正在尝试计算R中的历史风险值。这需要一个包含Daimler->DAI
列的股票价格(date
)数据框, price
和daily 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
。
我希望我能解决这个问题,并且有人可以提供帮助。 谢谢!
答案 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)
这可能会成为一个非常复杂的话题,涉及回归和其他建模技术,因为股票价格几乎肯定不是固定的,并且您的历史数据可能未捕捉到未来变动的真正潜力。希望这能回答您的编码问题。