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

如何在Julia中创建NA矩阵?并修复二项树定价代码报错

问题解决:Julia中创建含缺失值的矩阵并修复欧式期权二项树定价代码错误

一、报错原因分析

你遇到的InexactError: Int64(1.2140275816016999),本质是类型不匹配:

  • 你用missings(Int, (N+1),(N+1))创建了整数类型的缺失值矩阵,但期权定价计算的结果是浮点数(带小数),无法存入整数矩阵,导致类型转换失败。

二、Julia中创建含缺失值矩阵的正确方式

Julia是强类型语言,和R的弱类型逻辑不同,创建含缺失值的矩阵时必须指定正确的数值类型:

  • 如果要存储浮点数(比如期权价格),有两种常用方式:
    # 方式1:用missings函数指定浮点类型
    tree = missings(Float64, N+1, N+1)
    # 方式2:直接声明矩阵类型为Union{Missing, Float64}
    tree = Matrix{Union{Missing, Float64}}(missing, N+1, N+1)
    
  • 对应你R中的matrix(NA, nrow=4, ncol=4),Julia里的missing等价于R的NA,但必须明确数值类型才能正常存储计算结果。

三、完整修复后的代码

除了矩阵类型问题,你的循环for j in (N-1):0在Julia中是无效的(默认是递增序列,从大到小遍历需要指定步长-1),否则不会执行反向计算步骤。修复后的完整代码如下:

import Pkg
Pkg.add("Missings")
using Missings

Eurocall = function(S, T , K, r, sigma , N)
    
    # S : 标的资产价格
    # T : 到期时间
    # K : 执行价格
    # r : 无风险利率
    # sigma : 资产波动率
    # N : 二项树步数
    
    deltaT = T/N
    u = exp(sigma*sqrt(deltaT))
    d = 1/u
    p = (exp(r*deltaT)-d)/(u-d)
    
    # 改为浮点类型的缺失值矩阵
    tree = missings(Float64, N+1, N+1)
  
    # 计算到期日的期权价值
    for i in 0:N
        tree[i+1, N+1] = max(0, (S*u^i*d^(N-i)) - K)
    end
    
    # 从后往前反向计算期权价值,指定步长为-1
    for j in (N-1):-1:0 
        for i in 0:j
            tree[i+1, j+1] = exp(-r*deltaT)*(p*tree[i+2, j+2] + (1-p)*tree[i+1, j+2])
        end
    end
    
    price = tree[1,1] 
    return price
end

四、测试验证

调用Eurocall(10,10,11,0.05,0.1,10),会返回正确的欧式看涨期权价格(约4.09),不再报错。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 12:30:42