JuliaForDataAnalysis/ch14_server.jl

51 lines
1.3 KiB
Julia
Raw Normal View History

# run this file using julia --project -t4 ch14_server.jl command
2022-02-08 20:58:33 +01:00
using Genie
using Statistics
using ThreadsX
2022-03-14 00:12:33 +01:00
function payoff_asian_sample(T, X0, K, r, s, m)::Float64
2022-02-08 20:58:33 +01:00
X = X0
sumX = X
d = T / m
for i in 1:m
2022-03-14 00:12:33 +01:00
X *= exp((r - s^2 / 2) * d + s * sqrt(d) * randn())
2022-02-08 20:58:33 +01:00
sumX += X
end
2022-03-14 00:12:33 +01:00
Y = sumX / (m + 1)
return exp(-r * T) * max(Y - K, 0)
2022-02-08 20:58:33 +01:00
end
2022-03-14 00:12:33 +01:00
function asian_value(T, X0, K, r, s, m, max_time)
2022-02-08 20:58:33 +01:00
result = Float64[]
start_time = time()
while time() - start_time < max_time
2022-03-14 00:12:33 +01:00
append!(result,
2022-05-03 23:32:01 +02:00
ThreadsX.map(i -> payoff_asian_sample(T, X0, K, r, s, m),
2022-03-14 00:12:33 +01:00
1:10_000))
2022-02-08 20:58:33 +01:00
end
n = length(result)
mv = mean(result)
sdv = std(result)
lo95 = mv - 1.96 * sdv / sqrt(n)
hi95 = mv + 1.96 * sdv / sqrt(n)
zero = mean(==(0), result)
2022-03-13 07:25:29 +01:00
return (; n, mv, lo95, hi95, zero)
2022-02-08 20:58:33 +01:00
end
Genie.config.run_as_server = true
Genie.Router.route("/", method=POST) do
message = Genie.Requests.jsonpayload()
return try
K = float(message["K"])
max_time = float(message["max_time"])
2022-03-14 00:12:33 +01:00
value = asian_value(1.0, 50.0, K, 0.05, 0.3, 200, max_time)
2022-02-08 20:58:33 +01:00
Genie.Renderer.Json.json((status="OK", value=value))
catch
Genie.Renderer.Json.json((status="ERROR", value=""))
end
end
Genie.startup()