R KMV在求解非线性方程组中的应用
我目前正在做关于默顿KMV模型的硕士论文,我需要将其应用到一些公司。这是我使用的链接 我试图循环求解非线性方程组的过程。到目前为止,我已经找到了一个解决方案,通过手动实现每个参数来解决它,但现在我需要将它应用到整个数据帧 这是我到目前为止提出的代码: 加载文件和库,设置索引R KMV在求解非线性方程组中的应用,r,loops,dataframe,while-loop,R,Loops,Dataframe,While Loop,我目前正在做关于默顿KMV模型的硕士论文,我需要将其应用到一些公司。这是我使用的链接 我试图循环求解非线性方程组的过程。到目前为止,我已经找到了一个解决方案,通过手动实现每个参数来解决它,但现在我需要将它应用到整个数据帧 这是我到目前为止提出的代码: 加载文件和库,设置索引 library(nleqslv)#这是一个解决非线性方程的软件包,根据默顿模型中的布莱克和斯科尔斯公式计算资产价值及其波动率 df您应该使用 df <- read.csv("AREX_D.csv", stringsAs
library(nleqslv)#这是一个解决非线性方程的软件包,根据默顿模型中的布莱克和斯科尔斯公式计算资产价值及其波动率
df您应该使用
df <- read.csv("AREX_D.csv", stringsAsFactors=FALSE)
D
等的值应作为标量传递给函数
nleqslv
返回由各种项目组成的列表。其中之一是x
:参数x
的最终值。
您不能以out[1]
和out[2]的身份访问这些文件
您需要将输出存储在数据帧的每一行中
您希望将这些存储在数据帧中,因此请使用out$x[1]
和out$x[2]
。
起始值xstart
的一些初始值包含NA
。
因此,在调用nleqslv
之前,需要测试xstart
是否包含NA
代码和最后的while
循环中还有其他错误。
所以把最后一个循环改成这个
df$termcd <- -1
kstart <- which(df$Date == "03/01/2017")
kend <- NROW(df)
for( k in kstart:kend ) {
xstart <- c(E[k]+D[k], sigmaE[k])
if(anyNA(xstart)) { next } # skip NA in input
out <- nleqslv(xstart,fnewton,method="Newton", D=D[k],E=E[k],sigmaE=sigmaE[k])
df$Asset[k] <- out$x[1]
df$sigmaA[k] <- out$x[2]
df$termcd[k] <- out$termcd
}
df$termcd请提供一个可复制的示例。看见请在前后使用空格,谢谢你的精确性。我已经编辑了代码并包含了对我使用的CSV文件的引用。我希望它更接近于一个可复制的例子。哇,非常感谢你,它现在看起来像一个魅力!我唯一想不出的是df$termcd
列的有用性,但我认为sigma_a和资产计算正确,再次感谢!抱歉,回复阅读nleqslv
的文档花了这么长时间。它告诉您什么是termcd
;它是nleqslv
的返回代码,告诉您nleqslv
是否成功。如果你很满意,就投赞成票。
fnewton <- function(x)
{
y <- numeric(2)
d1 <- (log(x[1]/D)+(r+x[2]^2/2)*T)/x[2]*sqrt(T)
d2 <- d1-x[2]*sqrt(T)
y[1] <- E-(x[1]*pnorm(d1)-exp(-r*T)*D*pnorm(d2))
y[2] <- sigmaE*E-pnorm(d1)*x[2]*x[1]
y
}
xstart <- c(E+D, sigmaE)#initialising the x-values (asset value and volatility for the function to solve the non linear equation
while (theDate<=end)
{
out <- nleqslv(xstart,fnewton,method="Newton")
df$Asset <- out[1]
df$sigmaA <- out[2]
theDate <- theDate+1
}
print(tail(df))
df <- read.csv("AREX_D.csv", stringsAsFactors=FALSE)
fnewton <- function(x, D, E, sigmaE)
{
y <- numeric(2)
d1 <- (log(x[1]/D)+(r+x[2]^2/2)*T)/x[2]*sqrt(T)
d2 <- d1-x[2]*sqrt(T)
y[1] <- E-(x[1]*pnorm(d1)-exp(-r*T)*D*pnorm(d2))
y[2] <- sigmaE*E-pnorm(d1)*x[2]*x[1]
y
}
df$termcd <- -1
kstart <- which(df$Date == "03/01/2017")
kend <- NROW(df)
for( k in kstart:kend ) {
xstart <- c(E[k]+D[k], sigmaE[k])
if(anyNA(xstart)) { next } # skip NA in input
out <- nleqslv(xstart,fnewton,method="Newton", D=D[k],E=E[k],sigmaE=sigmaE[k])
df$Asset[k] <- out$x[1]
df$sigmaA[k] <- out$x[2]
df$termcd[k] <- out$termcd
}