我正在编写我的Masters最终项目,其中我使用Black Scholes Merton模型得出默认概率。我已经陷入了R代码。在数学上,我想用包nleqslv
来解决这个非线性方程组:
library(nleqslv)
T <- 1
D1 <- 20010.75
R <- 0.8516
sigmaS <- .11
SO1 <- 1311.74
fnewton <- function(x){
y <- numeric(2)
d1 <- (log(x[1]/D1)+(R+x[2]^2/2)*T)/x[2]*sqrt(T)
d2 <- d1 - x[2]*sqrt(T)
y[1] <- SO1 - (x[1]*pnorm(d1) - exp(-R*T)*D1*pnorm(d2))
y[2] <- sigmaS*SO1 - pnorm(d1)*x[2]*x[1]
y
}
xstart <- c(1311.74,0.11)
nleqslv(xstart, fnewton, method="Broyden")
# $x
# [1] 1311.74 0.11
# $fvec
# [1] 1311.7400 144.2914
# $termcd
# [1] 6
# $message
# [1] "Jacobian is singular (see allowSingular option)"
# $scalex
# [1] 1 1
# $nfcnt
# [1] 0
# $njcnt
# [1] 1
# $iter
# [1] 1
我已经尝试了5个输入的许多值(上面已说明我为不同年份的2家公司计算过),但我没有得到S0和sigma V的最终值。
我收到的消息为"Jacobian is singular (see allowSingular option)"
如果我允许单个Jacobean使用&#34; control = list(trace = 1,allowSingular = TRUE)&#34;,那么也不会显示答案。我现在不知道如何获得这两个变量的解决方案。
我真的不知道,我在Teterevas幻灯片上定位我的模型时出错了(在5号幻灯片上是她的模型代码),谁的演示是googeling的第一个结果 https://www.google.de/search?q=moodys+KMV+in+R&rlz=1C1SVED_enDE401DE401&aq=f&oq=moodys+KMV+in+R&aqs=chrome.0.57.13309j0&sourceid=chrome&ie=UTF-8#q=distance+to+default+in+R Q =距离+至+默认+在+ R 与我一样,无论多么成功,她都会通过Black Scholes Merton方法计算违约距离风险度量。在此模型中,权益的价值(通常由市值表示,> SO1)可以写成欧洲看涨期权。
其他变量是:
x[1]: the variable I want to derive, value of total assets
x[2]: the variable I want to derive, volatility of total assets
D1: the book value of debt (19982009)
R: a riskfree interest rate
T: is set to 1 year (time)
sigmaS: estimated (historical) equity volatility
答案 0 :(得分:1)
您应该可以使用SO1
和sigmaS
的初始值作为nleqslv
的起始值。
首先,Tetereva给出的R代码看起来不太正确(变量Z
应该是D1
,因为你已经命名了; S0
的类似变化和D
)。
我已将Tetereva修改为:
library(nleqslv)
T <- 1
D1 <- 33404048
R <- 2.32
sigmaS <- .02396919
SO1 <- 4740291 # Ve?
fnewton <- function(x){
y <- numeric(2)
d1 <- (log(x[1]/D1)+(R+x[2]^2/2)*T)/x[2]*sqrt(T)
d2 <- d1 - x[2]*sqrt(T)
y[1] <- SO1 - (x[1]*pnorm(d1) - exp(-R*T)*D1*pnorm(d2))
y[2] <- sigmaS*SO1 - pnorm(d1)*x[2]*x[1]
y
}
xstart <- c(SO1,sigmaS)
nleqslv(xstart, fnewton, method="Broyden",control=list(trace=1))
nleqslv(xstart, fnewton, method="Newton",control=list(trace=1))
这将给出Tetereva给出的解决方案。 (我在这里使用trace=1
来检查迭代步骤。)
我相信你为R
提供的价值应该是8.516而不是别的。使用参数值
T <- 1
D1 <- 20010.75
R <- 8.516 # modified
sigmaS <- .11
SO1 <- 1311.74
像这样
xstart <- c(1311.74,0.11)
nleqslv(xstart, fnewton, method="Broyden")
nleqslv(xstart, fnewton, method="Newton")
然后使用这些值运行nleqslv
会很快收敛。
如果使用R <- 2.32
(如Tetereva),nleqslv
也会收敛,但会有更多的迭代。
我无法帮助你R
实际应该是什么,但是从Tetereva的演讲中我假设R
是百分比。由于我对Black-Scholes模型没有足够的了解,因此我无法找到各种参数的正确值。它取决于你。