【发布时间】:2021-07-05 13:57:33
【问题描述】:
我对 R 比较陌生,这可能是一个很容易解决的问题,但是有没有更好的方法来获取矩阵的对角线值并立即获取 100 个不同值的数值向量?
n <- 10 # 10 periods
m <- 12
PV <- 7500000
i <- 0.05
N <- 100 # number of market rates
market.rate <- runif(N, min = 0.01, max = 0.04)
prep.rates <- 0.03-0.06*market.rate
pool.price <- matrix(0,N,N) # one pool price for every market rate and corresponding prepayment rate
for (k in 1:N) { # start the prepayment rates loop
mlc <- 1/sum(sapply(1:(n*m), function(t) 1/(1+i/m)^t)) # mortgage loan constant
mp <- numeric(n*m) ; mp[1] <- PV*mlc; mp[1] # monthly payments
lb.b <- numeric(n) ; lb.b[1] <- PV # initial mortgage pool
mp <- numeric(n*m) ; mp[1] <- lb.b[1]*mlc; mp[1] # monthly payments
ip <- numeric(n*m) ; ip[1] <- i/m*lb.b[1] # interest payments
pr <- numeric(n*m) ; pr[1] <- mp[1] - ip[1] # principal reduction
prep <- numeric(n*m) ; prep[1] <- prep.rates[k]*lb.b[1] # monthly prepayment: some fraction of loan balance
total.p.and.i <- numeric(n*m) # principal + interest + prepayment
total.p.and.i[1] <- mp[1] + prep[1]
lb.e <- numeric(n*m) ; lb.e[1] <- lb.b[1] - pr[1] - prep[1]
#----- periods 2 to 10 -----
for (j in 2:(n*m)) {
mlc <- 1/sum(sapply(1:(n*m-j+1), function(t) 1/(1+i/m)^t))
lb.b[j] <- lb.e[j-1]
mp[j] <- lb.b[j]*mlc
ip[j] <- i/m*lb.b[j]
pr[j] <- mp[j] - ip[j]
prep[j] <- prep.rates[k]*lb.b[j]
if (j == n*m) prep[j] <- 0 # no prepayments in the last month
total.p.and.i[j] <- mp[j] + prep[j]
lb.e[j] <- lb.b[j] - pr[j] - prep[j]
}
for (j in 1:N) {
disc.rate <- sapply(1:(n*m), function(t) 1/(1+market.rate[j]/m)^t) # discount rate
pool.price[j,k] <- sum(total.p.and.i*disc.rate)
}
}
f.pool.price <- diag(pool.price)
【问题讨论】:
-
您能否更详细地解释您的问题?是否要提取矩阵对角线上的所有值?
-
感谢您的回复!我的目标是模拟 100 种不同市场价格的池价格。提前还款率与市场利率呈线性关系。现在我将所有 100 个市场利率与所有 100 个预付利率结合起来,所以我得到一个 100x100 值的矩阵,但我只想将第一个市场利率与第一个预付利率相匹配,依此类推,这就是为什么我认为对角线值矩阵的技术上是我正在寻找的。这有意义吗?
标签: r loops for-loop matrix finance