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

