Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 用户定义的函数输入,用于循环数据帧的每一行_R_Function_Loops_Lapply_Quantitative Finance - Fatal编程技术网

R 用户定义的函数输入,用于循环数据帧的每一行

R 用户定义的函数输入,用于循环数据帧的每一行,r,function,loops,lapply,quantitative-finance,R,Function,Loops,Lapply,Quantitative Finance,我正试图在R中创建我自己的第一个项目,但遇到了一个障碍 我有一个如下所示的数据框,其中每一行代表一个金融期权的数据集 type <- c("C", "C") marketV <- c(1.1166, 1.911) S <- c(20, 60) K <- c(20, 56) T <- c(0.333, 0.5) df <- data.frame(type, marketV, S, K, T) type这是您的程序的正确版本: df <- data.fra

我正试图在R中创建我自己的第一个项目,但遇到了一个障碍

我有一个如下所示的数据框,其中每一行代表一个金融期权的数据集

type <- c("C", "C")
marketV <- c(1.1166, 1.911)
S <- c(20, 60)
K <- c(20, 56)
T <- c(0.333, 0.5)
df <- data.frame(type, marketV, S, K, T)

type这是您的程序的正确版本:

df <- data.frame(type=c("C", "C"), marketV=c(1.1166, 1.911), S=c(20, 60), K=c(20, 56), T=c(0.333, 0.5))

IV <- function(df) {
  # check if df has more then 1 row:
  if (nrow(df)>1) { message("!! nrow(df)>1 !!");  return(NA) }

  # Initializing of variables
  r <- 0
  sigma <- 0.3
  sigma_down <- 0.001
  sigma_up <- 1
  count <- 0

  type <- df$type; marketV <- df$marketV; S <- df$S; K <- df$K; T <- df$T

  d1 <- (log(S/K) + (sigma^2/2)*T)/(sigma*sqrt(T))
  d2 <- (log(S/K) - (sigma^2/2)*T)/(sigma*sqrt(T))

  if(type=="C") {
    V <- exp(-r*T)*(S*pnorm(d1) - K*pnorm(d2))
  } else {
    V <- exp(-r*T)*(K*pnorm(-d2) - S*pnorm(-d1)) }

  difference <- V - marketV

  # Root finding of sigma by Bisection method
  while(abs(difference)>0.001 && count<1000) {
    if(difference < 0) {
      sigma_down <- sigma
      sigma <- (sigma_up + sigma)/2 
    } else {
      sigma_up <- sigma
      sigma <- (sigma_down + sigma)/2
    }

    d1 <- (log(S/K) + (sigma^2/2)*T)/(sigma*sqrt(T))
    d2 <- d1 - sigma*sqrt(T)

    if(type=="C") {
      V <- exp(-r*T)*(S*pnorm(d1) - K*pnorm(d2))
    } else {
      V <- exp(-r*T)*(K*pnorm(-d2) - S*pnorm(-d1)) }

    difference <- V - marketV
    count <- count + 1
  }
  if(count == 1000){
    return(NA)          # If sigma to satisfy Black76 price cannot be found
  } else{
    return(sigma)
  }
}

sapply(split(df, seq(nrow(df))), IV)
df <- data.frame(type=c("C", "C"), marketV=c(1.1166, 1.911), S=c(20, 60), K=c(20, 56), T=c(0.333, 0.5))

IV2 <- function(type, marketV, S, K, T) {
  r <- 0; sigma <- 0.3
  sigma_down <- 0.001; sigma_up <- 1
  count <- 0

  if(type=="C") {
    f.sig <- function(sigma)  {
      d1 <- (log(S/K) + (sigma^2/2)*T)/(sigma*sqrt(T))
      d2 <- d1 - sigma*sqrt(T)
      exp(-r*T)*(S*pnorm(d1) - K*pnorm(d2)) - marketV
    } 
  } else {
    f.sig <- function(sigma)  {
      d1 <- (log(S/K) + (sigma^2/2)*T)/(sigma*sqrt(T))
      d2 <- d1 - sigma*sqrt(T)
      exp(-r*T)*(K*pnorm(-d2) - S*pnorm(-d1)) - marketV
    }
  }
  ifelse(f.sig(sigma_down)*f.sig(sigma_up) < 0, uniroot(f.sig, c(sigma_down,sigma_up))$root, NA) # sigma
}

sapply(split(df, seq(nrow(df))), do.call, what="IV2")
原始函数中有许多错误:最大的错误是访问
S
K
等等。您可能会考虑从数据帧
df
中获取值。但事实上,您是从工作区中获取值的!我通过重新定义:

type <- df$type; marketV <- df$marketV; S <- df$S; K <- df$K; T <- df$T
以下是您的程序的清理版本:

df <- data.frame(type=c("C", "C"), marketV=c(1.1166, 1.911), S=c(20, 60), K=c(20, 56), T=c(0.333, 0.5))

IV <- function(df) {
  # check if df has more then 1 row:
  if (nrow(df)>1) { message("!! nrow(df)>1 !!");  return(NA) }

  # Initializing of variables
  r <- 0
  sigma <- 0.3
  sigma_down <- 0.001
  sigma_up <- 1
  count <- 0

  type <- df$type; marketV <- df$marketV; S <- df$S; K <- df$K; T <- df$T

  d1 <- (log(S/K) + (sigma^2/2)*T)/(sigma*sqrt(T))
  d2 <- (log(S/K) - (sigma^2/2)*T)/(sigma*sqrt(T))

  if(type=="C") {
    V <- exp(-r*T)*(S*pnorm(d1) - K*pnorm(d2))
  } else {
    V <- exp(-r*T)*(K*pnorm(-d2) - S*pnorm(-d1)) }

  difference <- V - marketV

  # Root finding of sigma by Bisection method
  while(abs(difference)>0.001 && count<1000) {
    if(difference < 0) {
      sigma_down <- sigma
      sigma <- (sigma_up + sigma)/2 
    } else {
      sigma_up <- sigma
      sigma <- (sigma_down + sigma)/2
    }

    d1 <- (log(S/K) + (sigma^2/2)*T)/(sigma*sqrt(T))
    d2 <- d1 - sigma*sqrt(T)

    if(type=="C") {
      V <- exp(-r*T)*(S*pnorm(d1) - K*pnorm(d2))
    } else {
      V <- exp(-r*T)*(K*pnorm(-d2) - S*pnorm(-d1)) }

    difference <- V - marketV
    count <- count + 1
  }
  if(count == 1000){
    return(NA)          # If sigma to satisfy Black76 price cannot be found
  } else{
    return(sigma)
  }
}

sapply(split(df, seq(nrow(df))), IV)
df <- data.frame(type=c("C", "C"), marketV=c(1.1166, 1.911), S=c(20, 60), K=c(20, 56), T=c(0.333, 0.5))

IV2 <- function(type, marketV, S, K, T) {
  r <- 0; sigma <- 0.3
  sigma_down <- 0.001; sigma_up <- 1
  count <- 0

  if(type=="C") {
    f.sig <- function(sigma)  {
      d1 <- (log(S/K) + (sigma^2/2)*T)/(sigma*sqrt(T))
      d2 <- d1 - sigma*sqrt(T)
      exp(-r*T)*(S*pnorm(d1) - K*pnorm(d2)) - marketV
    } 
  } else {
    f.sig <- function(sigma)  {
      d1 <- (log(S/K) + (sigma^2/2)*T)/(sigma*sqrt(T))
      d2 <- d1 - sigma*sqrt(T)
      exp(-r*T)*(K*pnorm(-d2) - S*pnorm(-d1)) - marketV
    }
  }
  ifelse(f.sig(sigma_down)*f.sig(sigma_up) < 0, uniroot(f.sig, c(sigma_down,sigma_up))$root, NA) # sigma
}

sapply(split(df, seq(nrow(df))), do.call, what="IV2")

df这是您程序的正确版本:

df <- data.frame(type=c("C", "C"), marketV=c(1.1166, 1.911), S=c(20, 60), K=c(20, 56), T=c(0.333, 0.5))

IV <- function(df) {
  # check if df has more then 1 row:
  if (nrow(df)>1) { message("!! nrow(df)>1 !!");  return(NA) }

  # Initializing of variables
  r <- 0
  sigma <- 0.3
  sigma_down <- 0.001
  sigma_up <- 1
  count <- 0

  type <- df$type; marketV <- df$marketV; S <- df$S; K <- df$K; T <- df$T

  d1 <- (log(S/K) + (sigma^2/2)*T)/(sigma*sqrt(T))
  d2 <- (log(S/K) - (sigma^2/2)*T)/(sigma*sqrt(T))

  if(type=="C") {
    V <- exp(-r*T)*(S*pnorm(d1) - K*pnorm(d2))
  } else {
    V <- exp(-r*T)*(K*pnorm(-d2) - S*pnorm(-d1)) }

  difference <- V - marketV

  # Root finding of sigma by Bisection method
  while(abs(difference)>0.001 && count<1000) {
    if(difference < 0) {
      sigma_down <- sigma
      sigma <- (sigma_up + sigma)/2 
    } else {
      sigma_up <- sigma
      sigma <- (sigma_down + sigma)/2
    }

    d1 <- (log(S/K) + (sigma^2/2)*T)/(sigma*sqrt(T))
    d2 <- d1 - sigma*sqrt(T)

    if(type=="C") {
      V <- exp(-r*T)*(S*pnorm(d1) - K*pnorm(d2))
    } else {
      V <- exp(-r*T)*(K*pnorm(-d2) - S*pnorm(-d1)) }

    difference <- V - marketV
    count <- count + 1
  }
  if(count == 1000){
    return(NA)          # If sigma to satisfy Black76 price cannot be found
  } else{
    return(sigma)
  }
}

sapply(split(df, seq(nrow(df))), IV)
df <- data.frame(type=c("C", "C"), marketV=c(1.1166, 1.911), S=c(20, 60), K=c(20, 56), T=c(0.333, 0.5))

IV2 <- function(type, marketV, S, K, T) {
  r <- 0; sigma <- 0.3
  sigma_down <- 0.001; sigma_up <- 1
  count <- 0

  if(type=="C") {
    f.sig <- function(sigma)  {
      d1 <- (log(S/K) + (sigma^2/2)*T)/(sigma*sqrt(T))
      d2 <- d1 - sigma*sqrt(T)
      exp(-r*T)*(S*pnorm(d1) - K*pnorm(d2)) - marketV
    } 
  } else {
    f.sig <- function(sigma)  {
      d1 <- (log(S/K) + (sigma^2/2)*T)/(sigma*sqrt(T))
      d2 <- d1 - sigma*sqrt(T)
      exp(-r*T)*(K*pnorm(-d2) - S*pnorm(-d1)) - marketV
    }
  }
  ifelse(f.sig(sigma_down)*f.sig(sigma_up) < 0, uniroot(f.sig, c(sigma_down,sigma_up))$root, NA) # sigma
}

sapply(split(df, seq(nrow(df))), do.call, what="IV2")
原始函数中有许多错误:最大的错误是访问
S
K
等等。您可能会考虑从数据帧
df
中获取值。但事实上,您是从工作区中获取值的!我通过重新定义:

type <- df$type; marketV <- df$marketV; S <- df$S; K <- df$K; T <- df$T
以下是您的程序的清理版本:

df <- data.frame(type=c("C", "C"), marketV=c(1.1166, 1.911), S=c(20, 60), K=c(20, 56), T=c(0.333, 0.5))

IV <- function(df) {
  # check if df has more then 1 row:
  if (nrow(df)>1) { message("!! nrow(df)>1 !!");  return(NA) }

  # Initializing of variables
  r <- 0
  sigma <- 0.3
  sigma_down <- 0.001
  sigma_up <- 1
  count <- 0

  type <- df$type; marketV <- df$marketV; S <- df$S; K <- df$K; T <- df$T

  d1 <- (log(S/K) + (sigma^2/2)*T)/(sigma*sqrt(T))
  d2 <- (log(S/K) - (sigma^2/2)*T)/(sigma*sqrt(T))

  if(type=="C") {
    V <- exp(-r*T)*(S*pnorm(d1) - K*pnorm(d2))
  } else {
    V <- exp(-r*T)*(K*pnorm(-d2) - S*pnorm(-d1)) }

  difference <- V - marketV

  # Root finding of sigma by Bisection method
  while(abs(difference)>0.001 && count<1000) {
    if(difference < 0) {
      sigma_down <- sigma
      sigma <- (sigma_up + sigma)/2 
    } else {
      sigma_up <- sigma
      sigma <- (sigma_down + sigma)/2
    }

    d1 <- (log(S/K) + (sigma^2/2)*T)/(sigma*sqrt(T))
    d2 <- d1 - sigma*sqrt(T)

    if(type=="C") {
      V <- exp(-r*T)*(S*pnorm(d1) - K*pnorm(d2))
    } else {
      V <- exp(-r*T)*(K*pnorm(-d2) - S*pnorm(-d1)) }

    difference <- V - marketV
    count <- count + 1
  }
  if(count == 1000){
    return(NA)          # If sigma to satisfy Black76 price cannot be found
  } else{
    return(sigma)
  }
}

sapply(split(df, seq(nrow(df))), IV)
df <- data.frame(type=c("C", "C"), marketV=c(1.1166, 1.911), S=c(20, 60), K=c(20, 56), T=c(0.333, 0.5))

IV2 <- function(type, marketV, S, K, T) {
  r <- 0; sigma <- 0.3
  sigma_down <- 0.001; sigma_up <- 1
  count <- 0

  if(type=="C") {
    f.sig <- function(sigma)  {
      d1 <- (log(S/K) + (sigma^2/2)*T)/(sigma*sqrt(T))
      d2 <- d1 - sigma*sqrt(T)
      exp(-r*T)*(S*pnorm(d1) - K*pnorm(d2)) - marketV
    } 
  } else {
    f.sig <- function(sigma)  {
      d1 <- (log(S/K) + (sigma^2/2)*T)/(sigma*sqrt(T))
      d2 <- d1 - sigma*sqrt(T)
      exp(-r*T)*(K*pnorm(-d2) - S*pnorm(-d1)) - marketV
    }
  }
  ifelse(f.sig(sigma_down)*f.sig(sigma_up) < 0, uniroot(f.sig, c(sigma_down,sigma_up))$root, NA) # sigma
}

sapply(split(df, seq(nrow(df))), do.call, what="IV2")

df
lappy(df,IV)
?您没有以正确的方式定义参数。您需要考虑在函数中输入的内容(看起来您希望输入整个数据集),以及在函数中应该如何使用这些输入
R
不知道函数中的
S
K
T
是输入变量。我没有查看整个函数,但可能尝试在函数开头插入
attach(df)
,然后调用
IV(yourdf)
。谢谢@jogo,你说得对。这行不通。
lappy(df,IV)
?您没有以正确的方式定义参数。您需要考虑在函数中输入的内容(看起来您希望输入整个数据集),以及在函数中应该如何使用这些输入
R
不知道函数中的
S
K
T
是输入变量。我没有查看整个函数,但可能尝试在函数开头插入
attach(df)
,然后调用
IV(yourdf)
。谢谢@jogo,你说得对。这行不通。