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

Julia中Monte Carlo美式看跌期权代码触发MethodError求助

解决Julia LSMC美式看跌期权代码的MethodError

问题场景

运行以下美式看跌期权的LSMC蒙特卡洛计算代码时,触发MethodError:

function lsmc_am_put(S, K, r, σ, t, N, P)
    Δt = t / N
    R = exp(r * Δt)
    T = typeof(S * exp(-σ^2 * Δt / 2 + σ * √Δt * 0.1) / R)
    X = Array{T}(N+1, P)

    for p = 1:P
        X[1, p] = x = S
        for n = 1:N
            x *= R * exp(-σ^2 * Δt / 2 + σ * √Δt * randn())
            X[n+1, p] = x
        end
    end

    V = [max(K - x, 0) / R for x in X[N+1, :]]

    for n = N-1:-1:1
        I = V .!= 0
        A = [x^d for d = 0:3, x in X[n+1, :]]
        β = A[:, I]' \ V[I]
        cV = A' * β
        for p = 1:P
            ev = max(K - X[n+1, p], 0)
            if I[p] && cV[p] < ev
                V[p] = ev / R
            else
                V[p] /= R
            end
        end
    end

    return max(mean(V), K - S)
end

lsmc_am_put(100, 90, 0.05, 0.3, 180/365, 1000, 10000)

报错信息:

MethodError: no method matching (Array{Float64})(::Int64, ::Int64)
Closest candidates are:
  (Array{T})(::LinearAlgebra.UniformScaling, ::Integer, ::Integer) where T at /Volumes/Julia-1.8.3/Julia-1.8.app/Contents/Resources/julia/share/julia/stdlib/v1.8/LinearAlgebra/src/uniformscaling.jl:508
  (Array{T})(::Nothing, ::Any...) where T at baseext.jl:45
  (Array{T})(::UndefInitializer, ::Int64) where T at boot.jl:473
  ...
Stacktrace:
 [1] lsmc_am_put(S::Int64, K::Int64, r::Float64, σ::Float64, t::Float64, N::Int64, P::Int64)
   @ Main ./REPL[39]:5
 [2] top-level scope
   @ REPL[40]:1

报错原因

Julia 1.0+版本中,创建指定类型的数组时必须显式指定初始化方式。旧语法Array{T}(dims...)(比如Array{Float64}(1001,10000))已被废弃,编译器无法识别该调用方式,因此抛出MethodError。

修复方案

将数组创建语句修改为新版本支持的语法:

  • 替换X = Array{T}(N+1, P)为X = Array{T}(undef, N+1, P),其中undef表示创建未初始化的数组(后续会通过循环填充值,未初始化不影响结果)。

修复后的完整代码

function lsmc_am_put(S, K, r, σ, t, N, P)
    Δt = t / N
    R = exp(r * Δt)
    T = typeof(S * exp(-σ^2 * Δt / 2 + σ * √Δt * 0.1) / R)
    # 修改数组创建语法,添加undef初始化标记
    X = Array{T}(undef, N+1, P)

    for p = 1:P
        X[1, p] = x = S
        for n = 1:N
            x *= R * exp(-σ^2 * Δt / 2 + σ * √Δt * randn())
            X[n+1, p] = x
        end
    end

    V = [max(K - x, 0) / R for x in X[N+1, :]]

    for n = N-1:-1:1
        I = V .!= 0
        A = [x^d for d = 0:3, x in X[n+1, :]]
        β = A[:, I]' \ V[I]
        cV = A' * β
        for p = 1:P
            ev = max(K - X[n+1, p], 0)
            if I[p] && cV[p] < ev
                V[p] = ev / R
            else
                V[p] /= R
            end
        end
    end

    return max(mean(V), K - S)
end

# 调用验证
lsmc_am_put(100, 90, 0.05, 0.3, 180/365, 1000, 10000)

运行结果

修改后代码可正常执行,返回美式看跌期权的蒙特卡洛估算价格(结果会因随机数种子略有差异,当前参数下执行价K=90远低于标的价S=100,期权内在价值为0,估算结果接近0)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 12:50:26