在R中建模美国看涨期权

时间:2018-02-18 10:07:42

标签: r quantitative-finance

我正在尝试使用二叉树方法在R中建模美国看涨期权。我已经使用二项式方法获得了欧洲看涨期权的代码,我想知道如何调整我的代码以检查每一步是否是最佳的早期锻炼。欧洲看涨期权的代码如下所示;

{{1}}

1 个答案:

答案 0 :(得分:0)

您已经确定了需要检查运动是否最佳的线路。您目前在此行进行的计算是保留delta_t次{。}}期权的结果。

当您填充网格的边界节点时,您已经计算了每个股票价格状态j的期权的内在价值,即option_tree[nrow(option_tree),j]。回想一下,期权的内在价值是现在行使期权的收益。

因此,所有艰苦的工作已经完成。为了反映在i时间保持或锻炼之间做出最佳决策的回报,你只需要更换一行

      option_tree[i, j] = ((1-q)*option_tree[i+1,j] + q*option_tree[i+1,j+1])/exp(r*delta_t)#change here for American Option

使用

      exercise.payoff <- option_tree[nrow(option_tree),j]
      hold.payoff <- ((1-q)*option_tree[i+1,j] + q*option_tree[i+1,j+1]) / exp(r*delta_t)
      option_tree[i, j] <- max(exercise.payoff, hold.payoff)

自下而上的动态编程非常优雅。

请注意,您不需要对运动支付进行折扣,因为它会在时间i发生,而不像i+1时发生的保留支付。

编辑:我之前关于已经计算exercise.payoff的评论仅适用于三叉树模型。由于您使用的是二叉树,实际上您必须在每次迭代时使用

计算exercise.payoff
      exercise.payoff <- if(type == 'put') max(X - tree[i,j], 0) else max(tree[i,j] - X, 0)

此外,您的build_stock_tree()功能出现了错误,导致我很难生成美国通话价格比相应的欧洲通话价格更有价值的情况。特别是,你需要提高&#34;折扣&#34;因子exp(-div_yield * delta_t)(i-1)而不是N次幂,即

      tree[i,j] = S * u^(j-1) * d^((i-1)-(j-1)) * exp(-div_yield * delta_t *(i - 1))

i = 1期是今天,因此tree[1,1]中根本不会有任何分红。在此之后的每个时期,由于股息支付,股票的价值应该减少相同的因素。

编辑2:这是一个与问题无关的挑剔事物,但你应该在R中使用更多惯用的矢量化操作。在value_binomial_option()中对外循环进行矢量化是不可能的,因为它涉及动态编程,但您可以轻松地对内循环进行矢量化。我会用

完成它
build_stock_tree <- function(S, sigma, delta_t, div_yield, T, N) {
  tree <- matrix(0, nrow = N + 1, ncol = N + 1)

  u <- exp(+sigma * sqrt(delta_t))
  d <- exp(-sigma * sqrt(delta_t))

  for (i in 1:(N + 1)) {
    j <- 1:i
    tree[i, j] <- S * u ^ (j - 1) * d ^ ((i - 1) - (j - 1)) * exp(-div_yield * delta_t * (i - 1))
  }
  tree
}

value_binomial_option <- function(tree, sigma, delta_t, r, X, type) {
  q <- q_prob(r, delta_t, sigma)
  option_tree <- matrix(0, nrow = nrow(tree), ncol = ncol(tree))
  option_tree[nrow(option_tree), ] <- if (type == 'put') pmax(X - tree[nrow(tree), ], 0) else pmax(tree[nrow(tree), ] - X, 0)
  for (i in (nrow(tree) - 1):1) {
    j <- 1:i
    exercise.payoff <- if (type == 'put') pmax(X - tree[i, j], 0) else pmax(tree[i, j] - X, 0)
    hold.payoff <- ((1 - q) * option_tree[i + 1, j] + q * option_tree[i + 1, j + 1]) / exp(r * delta_t)
    option_tree[i, j] <- pmax(exercise.payoff, hold.payoff)
  }
  option_tree
}