【问题标题】:Mortgage Pool Price - multiple for loops抵押池价格 - 多个 for 循环
【发布时间】: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


【解决方案1】:
f.pool.price <- numeric(N)
for (i in 1:N) {
  f.pool.price[i] = pool.price[i,i]
}

一定有更简单的方法,但我认为这应该可行。

【讨论】:

    猜你喜欢
    • 2023-03-08
    • 2020-03-13
    • 1970-01-01
    • 1970-01-01
    • 2023-04-05
    • 1970-01-01
    • 1970-01-01
    • 2020-10-10
    • 2015-03-10
    相关资源
    最近更新 更多