예제 #1
1
  /**
   * 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;
  }