R говорит, что моя функция не является функцией, когда я использую sapply - PullRequest
0 голосов
/ 03 мая 2020

Я пытаюсь использовать функцию sapply для создания вектора с ценами опционов. У меня есть функция, которая возвращает цены опционов, но когда я пытаюсь использовать функцию sapply, я получаю сообщение об ошибке:

Ошибка в match.fun (FUN):
'binomial_option (n, type)' не является функцией, символом или символом.

Я не совсем понимаю, почему он говорит, что это не функция, а потому, что в окружении он обозначен как функция. Вот мой код:

#EXAMPLE PARAMETERS
strike=100
startprice = 110
sigma = 0.15
r=0.1
R=r+1
alpha = r-0.5*sigma^2
T = 1

#AktivTræ
StockTree <- function(n){
  tree = matrix(0, nrow = n+1, ncol =  n+1)
  dt = T/n
  u = exp(sigma*sqrt(dt))
  d = exp(-sigma*sqrt(dt))
  for(i in 1:(n+1)){
    for(j in 1:i){
      tree[i,j] <- startprice*u^(j-1)*d^((i-1)-(j-1))
    }
  }
  return(tree)
}

StockTree(5)

#q-ssh.
q_prob <- function(n){
  dt = T/n
  u = exp(sigma*sqrt(dt))
  d = exp(-sigma*sqrt(dt))

  return((exp(r*dt)-d)/(u-d))
}

q_prob(4)

#OptionsTræ
OptionValue <- function(n,type,tree){
  dt = T/n
  q = q_prob(n)
  OptionTree = matrix(0,nrow=nrow(tree), ncol=ncol(tree))

  if(type == 'put'){
    OptionTree[nrow(OptionTree),] <- pmax(strike-tree[nrow(tree),],0)
  }else if(type == 'call'){
    OptionTree[nrow(OptionTree),] <- pmax(tree[nrow(tree),]-strike,0)
  }
  for (i in (nrow(tree)-1):1) {
    for (j in 1:i){
      OptionTree[i,j] = ((1-q)*OptionTree[i+1,j]+q*OptionTree[i+1,j+1])/exp(r*dt)
    }
  }
  return(OptionTree)
}

OptionValue(5,'call',StockTree((5)))

#Standard Binomial Model
binomial_option <- function(n,type){
  q <- q_prob(n)
  tree <- StockTree(n)
  option <- OptionValue(n,type,tree)
  return(option[1,1])
}

binomial_option(500,'call')

6#New and improved?

Yeet <- function(n,type){
  g <- (1:n)
  Vec = sapply(g,binomial_option(n,type))
  return(Vec)
}

Yeet(5,"Call") 

Ответы [ 2 ]

0 голосов
/ 03 мая 2020

Здесь:

Yeet <- function(n, type){
  g <- 1:n
  Vec = sapply(g, function(x) binomial_option(x, type))
  return(Vec)
}

Yeet(5,"call")
#[1] 20.42243 20.32801 19.99258 20.30529 20.16248
0 голосов
/ 03 мая 2020

Вам, вероятно, нужно указать, какой аргумент binomial_option вы хотите, чтобы последовательные значения g были в вашем хранилище.

Возможно, это то, что вы хотите:

Yeet <- function(n,type){
  g <- (1:n)
  Vec = sapply(g,function(x) binomial_option(x,type))
  return(Vec)
}

Yeet(5,"call")

Вывод:

[1] 20.42243 20.32801 19.99258 20.30529 20.16248

(я предполагаю, что вы хотели, чтобы значения g стали n аргументом binomial_option)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...