求解R / BlackScholesMerton模型中的非线性方程组

时间:2016-02-17 05:58:46

标签: r

我正在编写我的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

1 个答案:

答案 0 :(得分:1)

您应该可以使用SO1sigmaS的初始值作为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模型没有足够的了解,因此我无法找到各种参数的正确值。它取决于你。