Add new Black-Scholes type for easy use
parent
da2483088b
commit
3a0e0cf0c0
|
@ -17,6 +17,7 @@ export
|
||||||
d2,
|
d2,
|
||||||
blackscholes_call,
|
blackscholes_call,
|
||||||
blackscholes_put,
|
blackscholes_put,
|
||||||
|
BlackScholes,
|
||||||
end
|
end
|
||||||
|
|
||||||
include("blackscholes.jl")
|
include("blackscholes.jl")
|
||||||
|
|
|
@ -8,27 +8,47 @@ using Distributions
|
||||||
|
|
||||||
Φ = x -> cdf(Normal(0, 1), x)
|
Φ = x -> cdf(Normal(0, 1), x)
|
||||||
|
|
||||||
|
type BlackScholes
|
||||||
|
S0::Float64
|
||||||
|
K::Float64
|
||||||
|
σ::Float64
|
||||||
|
r::Float64
|
||||||
|
q::Float64
|
||||||
|
t::Float64
|
||||||
|
T::Float64
|
||||||
|
end
|
||||||
|
|
||||||
"""
|
"""
|
||||||
Calculate the value of \$d_1\$ in the Black-Scholes Formula
|
Calculate the value of \$d_1\$ in the Black-Scholes Formula
|
||||||
"""
|
"""
|
||||||
function d1(S, K, σ, r, T, t=0)
|
function d1(S, K, σ, r, q, T, t=0)
|
||||||
return (log(S./K) + (r + σ.^2/2).*(T-t)) ./ (σ.*sqrt(T-t))
|
return (log(S./K) + (r - q + σ.^2/2).*(T-t)) ./ (σ.*sqrt(T-t))
|
||||||
end
|
end
|
||||||
|
|
||||||
function d2(d1_val, σ, T, t=0)
|
function d2(d1_val, σ, T, t=0)
|
||||||
return d1_val - σ .* sqrt(T-t)
|
return d1_val - σ .* sqrt(T-t)
|
||||||
end
|
end
|
||||||
|
|
||||||
function blackscholes_call(S, K, σ, r, T, t=0)
|
function blackscholes_call(S, K, σ, r, q, T, t=0)
|
||||||
d1_val = d1(S, K, σ, r, T, t)
|
d1_val = d1(S, K, σ, r, q, T, t)
|
||||||
d2_val = d2(d1_val, σ, T, t)
|
d2_val = d2(d1_val, σ, T, t)
|
||||||
|
|
||||||
return Φ(d1_val) .* S - Φ(d2_val) .* K .* exp(-r .* (T - t))
|
return Φ(d1_val) .* S - Φ(d2_val) .* K .* exp(-(r-q) .* (T - t))
|
||||||
end
|
end
|
||||||
|
|
||||||
function blackscholes_put(S, K, σ, r, T, t=0)
|
function blackscholes_call(model::BlackScholes)
|
||||||
d1_val = d1(S, K, σ, r, T, t)
|
return blackscholes_call(model.S0, model.K, model.σ, model.r, model.q,
|
||||||
|
model.T, model.t)
|
||||||
|
end
|
||||||
|
|
||||||
|
function blackscholes_put(S, K, σ, r, q, T, t=0)
|
||||||
|
d1_val = d1(S, K, σ, r, q, T, t)
|
||||||
d2_val = d2(d1_val, σ, T, t)
|
d2_val = d2(d1_val, σ, T, t)
|
||||||
|
|
||||||
return Φ(-d2_val).*K.*exp(-r.*(T-t)) - Φ(-d1_val).*S
|
return Φ(-d2_val).*K.*exp(-(r-q).*(T-t)) - Φ(-d1_val).*S
|
||||||
|
end
|
||||||
|
|
||||||
|
function blackscholes_put(model::BlackScholes)
|
||||||
|
return blackscholes_put(model.S0, model.K, model.σ, model.r, model.q,
|
||||||
|
model.T, model.t)
|
||||||
end
|
end
|
||||||
|
|
|
@ -2,21 +2,28 @@ using Base.Test
|
||||||
#include("../src/blackscholes.jl")
|
#include("../src/blackscholes.jl")
|
||||||
using Quant
|
using Quant
|
||||||
|
|
||||||
@test 15.047 < blackscholes_call(100, 95, .25, .05, 2, 1) < 15.0471
|
@test 15.047 < blackscholes_call(100, 95, .25, .05, 0, 2, 1) < 15.0471
|
||||||
@test blackscholes_call(100, 95, .25, .05, 2, 1) ==
|
@test blackscholes_call(100, 95, .25, .05, 0, 2, 1) ==
|
||||||
blackscholes_call(100, 95, .25, .05, 1)
|
blackscholes_call(100, 95, .25, .05, 0, 1)
|
||||||
|
|
||||||
precompute_low = [15.047, 15.047]
|
precompute_low = [15.047, 15.047]
|
||||||
precompute_high = [15.0471, 15.0471]
|
precompute_high = [15.0471, 15.0471]
|
||||||
S = [100, 100]; K = [95, 95]; σ = [.25, .25]; r = [.05, .05]
|
S = [100, 100]; K = [95, 95]; σ = [.25, .25]; r = [.05, .05]
|
||||||
T = [2, 2]; t = [1, 1]
|
q = [.0, .0]; T = [2, 2]; t = [1, 1]
|
||||||
@test all(precompute_low .< blackscholes_call(S, K, σ, r, T, t)
|
@test all(precompute_low .< blackscholes_call(S, K, σ, r, q, T, t)
|
||||||
.< precompute_high)
|
.< precompute_high)
|
||||||
|
|
||||||
@test 5.413 < blackscholes_put(100, 95, .25, .05, 2, 1) < 5.414
|
@test 5.413 < blackscholes_put(100, 95, .25, .05, .0, 2, 1) < 5.414
|
||||||
@test blackscholes_put(100, 95, .25, .05, 2, 1) == blackscholes_put(100, 95, .25, .05, 1)
|
@test blackscholes_put(100, 95, .25, .05, .0, 2, 1) ==
|
||||||
|
blackscholes_put(100, 95, .25, .05, 0, 1)
|
||||||
|
|
||||||
precompute_low = [5.413, 5.413]
|
precompute_low = [5.413, 5.413]
|
||||||
precompute_high = [5.414, 5.414]
|
precompute_high = [5.414, 5.414]
|
||||||
@test all(precompute_low .< blackscholes_put(S, K, σ, r, T, t)
|
@test all(precompute_low .< blackscholes_put(S, K, σ, r, q, T, t)
|
||||||
.< precompute_high)
|
.< precompute_high)
|
||||||
|
|
||||||
|
@test blackscholes_call(100, 95, .25, .05, 0, 2, 1) ==
|
||||||
|
blackscholes_call(BlackScholes(100, 95, .25, .05, 0, 1, 2))
|
||||||
|
|
||||||
|
@test blackscholes_put(100, 95, .25, .05, 0, 2, 1) ==
|
||||||
|
blackscholes_put(BlackScholes(100, 95, .25, .05, 0, 1, 2))
|
||||||
|
|
Loading…
Reference in New Issue