stock_tree = function(S, N, u, d){
   tree = matrix(0, nrow=N+1, ncol=N+1)
   
   for(i in 1:(N+1)){
      for(j in 1:i){
         tree[i,j] = S * u^(j-1) * d^((i-1)-(j-1))}}
   tree}

p = function(r, delta, h, u, d){
   (exp((r - delta)*h) - d)/(u - d)}

European_option = function(S, K, N, h, r, delta, sigma, type){
   u = exp((r - delta)*h + sigma*sqrt(h))
   d = exp((r - delta)*h - sigma*sqrt(h))
   stock_tree = stock_tree(S, N, u, d)
   p = p(r, delta, h, u, d)
   option_tree = matrix(0, nrow=nrow(stock_tree), ncol=ncol(stock_tree))
   
   if(type == "call"){
      option_tree[nrow(option_tree),] = pmax(stock_tree[nrow(stock_tree),]-K, 0)}
   else if(type == "put"){
      option_tree[nrow(option_tree),] = pmax(K-stock_tree[nrow(stock_tree),], 0)}
   
   for(i in (nrow(option_tree)-1):1){
      for(j in 1:i){
         option_tree[i,j] = exp(-(r * h)) * (p * option_tree[i+1,j+1] + (1-p) * option_tree[i+1,j])}}
   option_tree}
European_call = European_option(14, 12, 4, 0.25, 0.027, 0, 0.2, "call")
European_call
##           [,1]     [,2]     [,3]     [,4]     [,5]
## [1,] 2.5540117 0.000000 0.000000 0.000000 0.000000
## [2,] 1.4147450 3.849511 0.000000 0.000000 0.000000
## [3,] 0.5305344 2.412120 5.492960 0.000000 0.000000
## [4,] 0.0000000 1.124430 3.869630 7.365336 0.000000
## [5,] 0.0000000 0.000000 2.383149 5.567618 9.457137
European_put = European_option(14, 12, 4, 0.25, 0.027, 0, 0.2, "put")
European_put
##           [,1]       [,2] [,3] [,4] [,5]
## [1,] 0.2343466 0.00000000    0    0    0
## [2,] 0.4206686 0.03177036    0    0    0
## [3,] 0.7516031 0.06092724    0    0    0
## [4,] 1.3356548 0.11684251    0    0    0
## [5,] 2.3586867 0.22407339    0    0    0
straddle_price = European_call[1,1] + European_put[1,1]
straddle_price
## [1] 2.788358
European_call = European_option(14, 13, 4, 0.25, 0.027, 0, 0.2, "call")
European_call
##           [,1]      [,2]     [,3]     [,4]     [,5]
## [1,] 1.9221761 0.0000000 0.000000 0.000000 0.000000
## [2,] 0.9614553 3.0113431 0.000000 0.000000 0.000000
## [3,] 0.3079154 1.6974369 4.506370 0.000000 0.000000
## [4,] 0.0000000 0.6526047 2.876357 6.372064 0.000000
## [5,] 0.0000000 0.0000000 1.383149 4.567618 8.457137
European_put = European_option(14, 13, 4, 0.25, 0.027, 0, 0.2, "put")
European_put
##           [,1]      [,2] [,3] [,4] [,5]
## [1,] 0.5758722 0.0000000    0    0    0
## [2,] 0.9473325 0.1735558    0    0    0
## [3,] 1.5155748 0.3328347    0    0    0
## [4,] 2.3289275 0.6382900    0    0    0
## [5,] 3.3586867 1.2240734    0    0    0
straddle_price = European_call[1,1] + European_put[1,1]
straddle_price
## [1] 2.498048
European_call = European_option(14, 14, 4, 0.25, 0.027, 0, 0.2, "call")
European_call
##            [,1]      [,2]      [,3]     [,4]     [,5]
## [1,] 1.29034041 0.0000000 0.0000000 0.000000 0.000000
## [2,] 0.50816555 2.1731750 0.0000000 0.000000 0.000000
## [3,] 0.08529631 0.9827537 3.5197789 0.000000 0.000000
## [4,] 0.00000000 0.1807795 1.8830844 5.378791 0.000000
## [5,] 0.00000000 0.0000000 0.3831492 3.567618 7.457137
European_put = European_option(14, 14, 4, 0.25, 0.027, 0, 0.2, "put")
European_put
##           [,1]      [,2] [,3] [,4] [,5]
## [1,] 0.9173978 0.0000000    0    0    0
## [2,] 1.4739965 0.3153413    0    0    0
## [3,] 2.2795465 0.6047423    0    0    0
## [4,] 3.3222003 1.1597375    0    0    0
## [5,] 4.3586867 2.2240734    0    0    0
straddle_price = European_call[1,1] + European_put[1,1]
straddle_price
## [1] 2.207738
European_call = European_option(14, 15, 4, 0.25, 0.027, 0, 0.2, "call")
European_call
##           [,1]      [,2]     [,3]     [,4]     [,5]
## [1,] 0.8825392 0.0000000 0.000000 0.000000 0.000000
## [2,] 0.2696956 1.5724194 0.000000 0.000000 0.000000
## [3,] 0.0000000 0.5716007 2.700915 0.000000 0.000000
## [4,] 0.0000000 0.0000000 1.211467 4.385518 0.000000
## [5,] 0.0000000 0.0000000 0.000000 2.567618 6.457137
European_put = European_option(14, 15, 4, 0.25, 0.027, 0, 0.2, "put")
European_put
##          [,1]      [,2]      [,3] [,4] [,5]
## [1,] 1.482958 0.0000000 0.0000000    0    0
## [2,] 2.215480 0.6945394 0.0000000    0    0
## [3,] 3.180841 1.1801799 0.1677264    0    0
## [4,] 4.315473 1.9722308 0.3216553    0    0
## [5,] 5.358687 3.2240734 0.6168508    0    0
straddle_price = European_call[1,1] + European_put[1,1]
straddle_price
## [1] 2.365497