Черная модель выбора варианта Скоулза в R - PullRequest
1 голос
/ 25 апреля 2020

Я имею здесь попытку кодировать модель BS в R. Математически, я думаю, что это довольно хорошо, но код возвращает ошибку.


price = function(S, K, r, T, sigma, type){

  if(type=="C"){
  d1 <- (log(S/K) + (r + sigma^2/2)*T) / (sigma*sqrt(T))
  d2 <- d1 - sigma*sqrt(T)

  price = S*pnorm(d1) - K*exp(-r*T)*pnorm(d2)
  return(price)}

  if (type=="P"){
  d1 <- (log(S/K) + (r + sigma^2/2)*T) / (sigma*sqrt(T))
  d2 <- d1 - sig*sqrt(T)

  price =  (K*exp(-r*T)*pnorm(-d2) - S*pnorm(-d1))
  return(price)}

Я пытался использовать if, иначе if оба возвращали «Ошибка: неполное выражение:» - я хочу остаться в стороне от остальных, потому что тип параметра должен быть либо «C». Вызов или "P" для Put.

Мне нужна ваша помощь, чтобы проверить, почему код не работает.

С уважением

1 Ответ

1 голос
/ 25 апреля 2020

Вам необходимо закрыть скобку для функции. Кроме того, во втором операторе if сигма, а не сигма. Я изменил то, что дает:

price = function(S, K, r, T, sigma, type){

  if(type=="C"){
    d1 <- (log(S/K) + (r + sigma^2/2)*T) / (sigma*sqrt(T))
    d2 <- d1 - sigma*sqrt(T)

    price = S*pnorm(d1) - K*exp(-r*T)*pnorm(d2)
    return(price)}

  if (type=="P"){
    d1 <- (log(S/K) + (r + sigma^2/2)*T) / (sigma*sqrt(T))
    d2 <- d1 - sigma*sqrt(T)

    price =  (K*exp(-r*T)*pnorm(-d2) - S*pnorm(-d1))
    return(price)}
}

Это тогда работает:

price(50,50,0.05,0.5,0.25,'C')
[1] 4.130008

price(50,50,0.05,0.5,0.25,'P')
[1] 2.895503
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...