/** * Calculates losses for the given credit portfolio using Monte-Carlo Simulation. Simulates * probability of default only. * * @param portfolio Credit portfolio. * @param horizon Forecast horizon. * @param num Number of Monte-Carlo iterations. * @return Losses array simulated by Monte Carlo method. */ private double[] calculateLosses(Credit[] portfolio, int horizon, int num) { double[] losses = new double[num]; // Count losses using Monte-Carlo method. We generate random probability of default, // if it exceeds certain credit default value we count losses - otherwise count income. for (int i = 0; i < num; i++) for (Credit crd : portfolio) { int remDays = Math.min(crd.getRemainingTerm(), horizon); if (rndGen.nextDouble() >= 1 - crd.getDefaultProbability(remDays)) // (1 + 'r' * min(H, W) / 365) * S. // Where W is a horizon, H is a remaining crediting term, 'r' is an annual credit rate, // S is a remaining credit amount. losses[i] += (1 + crd.getAnnualRate() * Math.min(horizon, crd.getRemainingTerm()) / 365) * crd.getRemainingAmount(); else // - 'r' * min(H,W) / 365 * S // Where W is a horizon, H is a remaining crediting term, 'r' is a annual credit rate, // S is a remaining credit amount. losses[i] -= crd.getAnnualRate() * Math.min(horizon, crd.getRemainingTerm()) / 365 * crd.getRemainingAmount(); } return losses; }