Hi all,
I’m using SciMLSensitivity.jl to get the sensitivities of the transformation defined by:
f(S_T) = exp(- r * T) * max(S(T) - K, 0.0),
where S_T is the solution at time T of a SDE system of the form:
dS_t = \mu * S_t * dt + \sigma * S_t * dW_t .
I’m particularly interested in computing the derivative of f w.r.t t, i.e:
\frac{\partial f(S_t)}{\partial t} \vert_{t=0}
Unfortunately, I can’t get the correct results.
When running the following example not only \frac{\partial f(S_t)}{\partial t} \vert_{t=0} breaks but all the other derivatives too:
using DifferentialEquations
using SciMLSensitivity
using ForwardDiff
using Statistics
f(u, p, t) = p[2] * u
g(u, p, t) = p[3] * u
out(u, p) = max(u(p[4])[1] - p[5], 0.0)
u0 = 100.
μ = 0.02
σ = 0.12
K = 90.0
T = 1.0
p = [u0, μ, σ, T, K]
prob = SDEProblem{false}(f, g, u0, (0.0, 1.0), p)
function mean_of_solution(x)
_prob = remake(prob; u0 = x[1], p = x, tspan=(0.0, x[4]))
ens = EnsembleProblem(_prob, output_func = (sol, i) -> (out(sol, x), false))
sol = solve(ens, EM(); dt=1/252, trajectories=10000, sensealg=ForwardDiffSensitivity())
v = exp(- x[2] * x[4]) * mean(sol)
return v
end
ForwardDiff.gradient(sum_of_solution, p)
Moreover, when running this example
using DifferentialEquations
using SciMLSensitivity
using ForwardDiff
using Statistics
f(u, p, t) = p[2] * u
g(u, p, t) = p[3] * u
out(u, p) = max(u(p[4])[1] - p[5], 0.0)
u0 = 100.
μ = 0.02
σ = 0.12
K = 90.0
T = 1.0
p = [u0, μ, σ, T, K]
prob = SDEProblem{false}(f, g, u0, (0.0, 1.0), p)
function mean_of_solution(x)
_prob = remake(prob; u0 = x[1], p = x, tspan=(0.0, 1.0))
ens = EnsembleProblem(_prob, output_func = (sol, i) -> (out(sol, x), false))
sol = solve(ens, EM(); dt=1/252, trajectories=10000, sensealg=ForwardDiffSensitivity())
v = exp(- x[2] * x[4]) * mean(sol)
return v
end
ForwardDiff.gradient(sum_of_solution, p)
The results are all correct except for \frac{\partial f(S_t)}{\partial t} \vert_{t=0}.
Any idea about the causes of this behaviour?
Thanks in advance!