You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修复R二项式定价代码,解决N=1:100时第100个值异常问题?

问题分析

你的Task_binom函数仅适配标量类型的N参数,当传入向量N=1:100时,内部逻辑会出现致命错误:

  • 循环for (i in 1:N):当N是向量时,1:N会被解析为1:N[1](即1:1),仅处理了第一个N值,后续的99个N值完全没参与计算。
  • 向量运算不匹配:choose(N,i)、pi^i等操作会按向量元素配对计算,而非针对每个N值独立完成完整的二项式定价流程,直接导致计算结果完全偏离预期。
修复方案

方案1:快速包装成支持向量输入的版本

用R内置的Vectorize()函数,直接将原函数转换为支持向量输入的版本,无需修改原函数逻辑:

# 保留原Task_binom函数不变,生成支持向量输入的新函数
Task_binom_vec <- Vectorize(Task_binom, vectorize.args = "N")

# 验证结果
Task_binom(100, 0.0833, 0.3299, 0.0472, 134.51, 134.51, put=F)
# 输出:5.352954

Task_binom_vec(1:100, 0.0833, 0.3299, 0.0472, 134.51, 134.51, put=F)[100]
# 输出:5.352954,与单独计算结果一致

方案2:原生支持向量输入的重写版本

如果想避免依赖Vectorize(),可以手动重写函数,通过sapply遍历每个N值独立计算,同时修复原函数中漏掉i=0路径的逻辑漏洞:

Task_binom <- function(N, Time, sigma, rho, St, K, put = TRUE){
  sapply(N, function(n){
    h <- Time / n
    rf <- rho * h
    sd <- sigma * sqrt(h)
    u <- exp(sd)
    d <- 1 / u
    pi_val <- (1 + rf - d) / (u - d)
    
    sum_val <- 0
    if(put){
      # 遍历所有可能的上涨次数(从0到n)
      for (i in 0:n) {
        payoff <- max(K - St * u^i * d^(n - i), 0)
        prob <- choose(n, i) * pi_val^i * (1 - pi_val)^(n - i)
        sum_val <- sum_val + prob * payoff
      }
    } else {
      for (i in 0:n) {
        payoff <- max(St * u^i * d^(n - i) - K, 0)
        prob <- choose(n, i) * pi_val^i * (1 - pi_val)^(n - i)
        sum_val <- sum_val + prob * payoff
      }
    }
    p0 <- sum_val / (1 + rf)^n
    return(p0)
  })
}

# 验证结果
Task_binom(100, 0.0833, 0.3299, 0.0472, 134.51, 134.51, put=F)
# 输出:5.352954

Task_binom(1:100, 0.0833, 0.3299, 0.0472, 134.51, 134.51, put=F)[100]
# 输出:5.352954

注:原函数的循环从i=1开始,漏掉了i=0(全下跌路径)的情况,这是二项式定价的逻辑漏洞,修复后的版本补上了该路径,确保计算完整性。

内容的提问来源于stack exchange,提问作者user20396712

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 03:50:17