Вы не используете 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)