Как вычислить опцию Блэка-Шоулза - PullRequest
0 голосов
/ 08 апреля 2020

Я новичок в R и пытаюсь понять, как рассчитать опцион пут в модели цены опционов Блэка Шоулза. Я написал следующий код, но он не выводит ожидаемое число. Обратитесь ниже. Это не тянет в расчете пут, который я ожидал. Спасибо заранее за любую информацию! Это мои данные, которые я пытаюсь сделать многоразовой функцией для

s0 = 100
K = 70
r = 0.05
sigma =  0.16
T = 1

P <- 70*exp(-0.05*1)*pnorm(-d2) - 100*pnorm(-d1)

Я затем сделал эту функцию.

 put <- function(s0, K, r, T, sigma) {
 d1 <- (log(s0/K) + (r + sigma^2/2)*T) / (sigma*sqrt(T))
 d2 <- d1 - sigma*sqrt(T)
 p <- K*exp(-r*1)*pnorm(-d2) - 100*pnorm(-d1)
 p
 }

1 Ответ

0 голосов
/ 08 апреля 2020

Вы не используете T и s0 при расчете цены пута в функции пута. У вас есть значение по умолчанию 1 вместо T и значение 100 вместо s0. См. Формулу для пут и колл цен ниже. И проверка на положенный паритет вызова. Обратите внимание, что это формулы Блэка и Шоулза, они не учитывают дивиденды. (И никаких проверок на ошибки.)

s0 = 100
K = 70
r = 0.05
sigma =  0.16
T = .5

put_price <- function(s0, K, r, T, sigma) {
  d1 <- (log(s0/K) + T*(r + sigma^2/2)) / (sigma*sqrt(T))
  d2 <- d1 - sigma*sqrt(T)
  p <- K*exp(-r*T)*pnorm(-d2) - s0*pnorm(-d1)
  p
}

call_price <- function(s0, K, r, T, sigma) {
  d1 <- (log(s0/K) + T*(r + sigma^2/2)) / (sigma*sqrt(T))
  d2 <- d1 - sigma*sqrt(T)
  c <- s0*pnorm(d1) - K*exp(-r*T)*pnorm(d2)
  c
}

# put call parity
all.equal(put_price(s0, K, r, T, sigma), call_price(s0, K, r, T, sigma) + K * exp(-r*T) - s0)
...