Guaranteed Minimum Withdraw Benefits
From ThetaWiki
Overview
ThetaScript
Model GMWB import S "Stock price process" import T "Maturity time" import g "Guaranteed ratio" import fee "Fonds management fee" import EUR "Numeraire" export F_obs "Fonds value" export G_cost "Cost of guarantee" F0 = 100 F = F0 % # of payment periods per year periods = 12 delta_t = 1/periods n = T*12 loop n % Remember S for return computation S_old = S E_V = E(G_cost + A) Theta delta_t % New fonds value = Fund_earning - Fee - Withdraw F = F* S/S_old *exp(-fee*delta_t) - delta_t*g*F0*EUR % Compute future benefits A = A! + g*delta_t*F0 % If fonds value too low, Guarantee knocks in if F < 0 % Update guarantee costs by payed guarantee G_cost = G_cost! + F % Reset fonds value to zero F = 0 end F_obs = F end % Remaining benefits are payed to customer A = F G_cost = 0 end
% Compute Model GMWB_early_exercise import S "Stock price process" import T "Maturity time" import g "Guaranteed ratio" import fee "Fonds management fee" import EUR "Numeraire" import penalty "Early exercise penalty" export F_obs "Fonds value" export G_cost "Cost of guarantee" F0 = 100 F = F0 % # of payment periods per year periods = 12 delta_t = 1/periods n = T*12 loop n % Remember S for return computation S_old = S E_V = E(G_cost + A) % Exercise early if too low expected gains if E(G_cost + A) < (1-penalty) * F G_cost = (1-penalty) * F A = 0 end Theta delta_t % New fonds value = Fund_earning - Fee - Withdraw F = F* S/S_old *exp(-fee*delta_t) - delta_t*g*F0*EUR % Compute future benefits A = A! + g*delta_t*F0 % If fonds value too low, Guarantee knocks in if F < 0 % Update guarantee costs by payed guarantee G_cost = G_cost! + F % Reset fonds value to zero F = 0 end F_obs = F end % Remaining benefits are payed to customer A = F G_cost = 0 end
Model GMWB_hedged_early_exercise import S "Stock price process" import T "Maturity time" import g "Guaranteed ratio" import fee "Fonds management fee" import EUR "Numeraire" import penalty "Early exercise penalty" export Pi_obs "Hedge Portfolio" export F_obs "Fonds value" export G_cost "Cost of guarantee" F0 = 100 F = F0 Pi_obs = Pi! % # of payment periods per year periods = 12 % # of hedges per year (4 for weekly, 21 for daily) hedge_periods = 21 delta_t = 1/periods n = T*12 loop n % Remember S for return computation S_old = S E_V = E(G_cost + A) % Exercise early if too low expected gains if E(G_cost + A) < (1-penalty) * F G_cost = (1-penalty) * F A = 0 Pi = 0 end % Update values of hedge with higher frequency loop hedge_periods Pi = Pi! - Beta(S,Pi)*(S!*EUR!-S*EUR) Theta delta_t / hedge_periods end % New fonds value = Fund_earning - Fee - Withdraw F = F* S/S_old *exp(-fee*delta_t) - delta_t*g*F0*EUR % Compute future benefits A = A! + g*delta_t*F0 % If fonds value too low, Guarantee knocks in if F < 0 % Update portfolio value by payed guarantee Pi = Pi! + F % Update guarantee costs by payed guarantee G_cost = G_cost! + F % Reset fonds value to zero F = 0 end F_obs = F Pi_obs = Pi end % Hedge does not pay anything Pi = 0 % Remaining benefits are payed to customer A = F G_cost = 0 end
