I am trying to calibrate an option pricing model (nonlinear) with 3 parameters to estimate, but not sure how to do it in Julia.
function GKprice(S0, K, r, T, σ, d, Flag = "call")
normcdf(x) = cdf(Normal(0, 1), x)
d1=(log(S0/K)+(r-d+σ*σ*0.5)*T)/(σ*sqrt(T))
d2=d1-σ*sqrt(T)
Price=0.0
if Flag == "call"
Price=S0*exp(-d*T)*normcdf(d1)-K*exp(-r*T)*normcdf(d2);
else
Price=-S0*exp(-d*T)*normcdf(-d1)+K*exp(-r*T)*normcdf(-d2);
end
return Price;
end
function GCprice(spot, K, r, T, sigma, d, gamma1, gamma2, FlagIsCall)
#FlagIsCall equals 1 for call option and 0 for put option
D = ( log(spot / K) + (r - d + 0.5 * sigma ^ 2 ) * T ) / ( sigma * sqrt(T) )
dist = Normal(0, 1)
parity = spot * exp(-d * T) - K * exp(-r * T)
part1 = spot * exp(-d * T) * pdf(dist, D) * sigma * sqrt(T)
part2 = gamma1 * (2 * sigma * sqrt(T) - D ) / ( 6 * sqrt(T))
part3 = gamma2 * (1 - D^2 + 3 * D * sigma * sqrt(T) - 3 * sigma^2 * T) / (24 * T)
adjustment = part1 * (part2 - part3)
Price = GKprice(spot, K, r, T, sigma, d) + adjustment - (FlagIsCall - 1) * parity
return Price
end
GCprice is my model and I made up the data sample as an example (no variation in some independent variables). The real data is a exchange rate option data.
df = DataFrame(FlagIsCall = rand(0:1, 100),
K = collect(1941:0.2:1960.8), spot = 1943.09, d = 0.021589, T = 0.0219178,
r = 0.00390208, GC_price = rand(1:30, 100))
GC_price is my dependent variable, my independent variables include K,
spot, d, T and r. It has 3 parameters to estimate, which are sigma, gamma1, and gamm2. I want to do a least squared estimate for them, but have to write my code from scratch and use the Optim package to find the minimum SSE. I want to know if there is easy way to fit a nonlinear model in Julia. Thanks.