如何修复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
相关产品推荐
相关产品推荐

