diff --git a/src/Quant.jl b/src/Quant.jl index 3f9e45f..428415a 100644 --- a/src/Quant.jl +++ b/src/Quant.jl @@ -17,6 +17,7 @@ export d2, blackscholes_call, blackscholes_put, + BlackScholes, end include("blackscholes.jl") diff --git a/src/blackscholes.jl b/src/blackscholes.jl index 2c44feb..7c79dfd 100644 --- a/src/blackscholes.jl +++ b/src/blackscholes.jl @@ -8,27 +8,47 @@ using Distributions Φ = 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 """ -function d1(S, K, σ, r, T, t=0) - return (log(S./K) + (r + σ.^2/2).*(T-t)) ./ (σ.*sqrt(T-t)) +function d1(S, K, σ, r, q, T, t=0) + return (log(S./K) + (r - q + σ.^2/2).*(T-t)) ./ (σ.*sqrt(T-t)) end function d2(d1_val, σ, T, t=0) return d1_val - σ .* sqrt(T-t) end -function blackscholes_call(S, K, σ, r, T, t=0) - d1_val = d1(S, K, σ, r, T, t) +function blackscholes_call(S, K, σ, r, q, T, t=0) + d1_val = d1(S, K, σ, r, q, 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 -function blackscholes_put(S, K, σ, r, T, t=0) - d1_val = d1(S, K, σ, r, T, t) +function blackscholes_call(model::BlackScholes) + 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) - 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 diff --git a/test/blackscholes.jl b/test/blackscholes.jl index 52f4f87..a65d5c0 100644 --- a/test/blackscholes.jl +++ b/test/blackscholes.jl @@ -2,21 +2,28 @@ using Base.Test #include("../src/blackscholes.jl") using Quant -@test 15.047 < blackscholes_call(100, 95, .25, .05, 2, 1) < 15.0471 -@test blackscholes_call(100, 95, .25, .05, 2, 1) == - blackscholes_call(100, 95, .25, .05, 1) +@test 15.047 < blackscholes_call(100, 95, .25, .05, 0, 2, 1) < 15.0471 +@test blackscholes_call(100, 95, .25, .05, 0, 2, 1) == + blackscholes_call(100, 95, .25, .05, 0, 1) precompute_low = [15.047, 15.047] precompute_high = [15.0471, 15.0471] S = [100, 100]; K = [95, 95]; σ = [.25, .25]; r = [.05, .05] -T = [2, 2]; t = [1, 1] -@test all(precompute_low .< blackscholes_call(S, K, σ, r, T, t) +q = [.0, .0]; T = [2, 2]; t = [1, 1] +@test all(precompute_low .< blackscholes_call(S, K, σ, r, q, T, t) .< precompute_high) -@test 5.413 < blackscholes_put(100, 95, .25, .05, 2, 1) < 5.414 -@test blackscholes_put(100, 95, .25, .05, 2, 1) == blackscholes_put(100, 95, .25, .05, 1) +@test 5.413 < blackscholes_put(100, 95, .25, .05, .0, 2, 1) < 5.414 +@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_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) + +@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))