ALM of a non-life insurance company
An ALM Model Implemented in ThetaML
The following is a ThetaML model for ALM. As an extended payoff description language, ThetaML describes the complete structure of financial products independently from the underlying stochastic processes that are applied to them. In this case, the economic state variables EUR and S are stochastic processes simulated externally and subsequently imported into the structural model ALM.
The structural model ALM is defined by the model body in the following ThetaML Script. It lives on a model time axis. The model time axis is a time grid that collects all the model time points in the state variables (EUR, S and Asset). Time passing along the model time axis is enabled by the ThetaML operator Theta that describes time-determined behavior of the ALM Asset and Liabilities.
model ALM %This model imports the stochastic processes 'EUR' and 'S' simulated externally. %The asset value 'A', the claims 'C' and the premium 'Prem' are constants %initial parameter inputs. import EUR "Numeraire" import S "Stock-price index" import A "Asset value" import C "Claims" import Prem "Premium" export Asset "Asset value" export W "Portfolio weights" export B "10y Bond" export S_return "Stock return" export B_1_return "1y Bond return" export B_10_return "10y Bond return" type W float %declare an array for portfolio weights type P float %declare a portfolio array to hold the stock and the bond Asset = A %call the submodel bond_value to compute the current value of a 10 year maturity bond call bond_value export 10 to T export EUR to CUR import B_10 from P B = B_10 %loop 10 times loop 10 S_0 = S/EUR %current stock price B_1_0 = 1/EUR %current 1 year bond value B_10_0 = B_10/EUR %current 10 year bond value W = -Beta(P!, Asset_pre!) %current portfolio weights computed using ThetaML Beta function Theta 1 %the ThetaML command Theta advances time by 1 year %call the submodel bond_value to compute the value of a 10 year maturity bond call bond_value export 10 to T export EUR to CUR import B_10 from P S_return = (S/EUR) / S_0 %compute stock return B_1_return = (1/EUR) / B_1_0 %compute 1 year bond return B_10_return =(B_10/EUR) / B_10_0 %compute 10 year bond return P = S %store stock prices at this time P = B_10 %store 10 year bond price at this time Asset_pre = Asset + Prem/EUR - C/EUR Asset = (W * S / EUR + W*B_10/EUR) + (Asset_pre - (W * S_0 + W*B_10_0))*B_1_return B = B_10 end end model bond_value import T "Maturity time" import CUR "Numeraire" export P fork P = E(Bond!)/CUR Theta T Bond = 1*CUR end end
function state = Theta(dt, state) if nargin == 0 % return comments and dimensions for Theta variables state.S.comment = 'Stock price index'; state.EUR.comment = 'Numeraire'; state.sigma.comment = 'Volatility'; state.r.comment = 'Risk-free rate'; state.r_vola.comment = 'Volatility of interest-rate'; state.r_alpha.comment = 'Mean-reversion speed of interest-rate'; state.r_beta.comment = 'Mean-reversion level of interest-rate'; state.C.coment = 'Claims'; state.Prem.comment = 'Premium'; else index = round(state.time+1); % interest-rate model vola= state.r_vola(1); alpha= state.r_alpha(1); beta = state.r_beta(1); state.r= state.r + vola*sqrt(dt).*randn(size(state.r)); state.r= beta .* alpha*dt + (1-alpha*dt).*state.r; state.EUR = exp(-dt .* state.r) .* state.EUR ; % stock-price index model mu = 0.05; sigma = state.sigma(1); ret_s = exp( (mu-0.5*sigma^2)*dt + sqrt(dt)*sigma*randn(size(state.S))); state.S = state.S .* ret_s; % liability model state.C = max(10+(0.8*randn(size(state.C))).^3,0); state.C = state.C - 0.1 * 10 * (ret_s-1); state.Prem = 11 - 0.3 * randn(size(state.C)).^2; end