1   /**
2    * Investor, the open-source investment library
3    *
4    * (C) Copyright 2008, by individual contributors as indicated by the @author tag.
5    *
6    * This library is free software; you can redistribute it and/or modify it
7    * under the terms of the GNU Lesser General Public License as
8    * published by the Free Software Foundation; either version 2.1 of
9    * the License, or (at your option) any later version.
10   *
11   * This software is distributed in the hope that it will be useful,
12   * but WITHOUT ANY WARRANTY; without even the implied warranty of
13   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14   * Lesser General Public License for more details.
15   *
16   * You should have received a copy of the GNU Lesser General Public
17   * License along with this software; if not, write to the Free
18   * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
19   * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
20   */
21  package com.nickokiss.investor.fin.env;
22  
23  import java.math.BigDecimal;
24  
25  import com.nickokiss.investor.calc.MathCalc;
26  
27  /**
28   * 
29   * @author Tomasz Koscinski <tomasz.koscinski@nickokiss.com>
30   */
31  public class ContinuousCompoundingStrategy implements CompoundingStrategy {
32  
33    private MathCalc mathCalc = new MathCalc();
34    
35    /**
36     * <pre>
37     * f[i,j] = (sj*j - si*i) / (j - i)
38     * si - spot rate at time i (spotRate1)
39     * sj - spot rate at time j (spotRate2)
40     * i - time i
41     * j - time j
42     * </pre>
43     */
44    public BigDecimal getForwardRate(BigDecimal startTime, BigDecimal endTime, InterestRateStrategy interestRateStrategy) {
45      BigDecimal endTimeSpotRate = interestRateStrategy.getSpotRate(endTime);
46      BigDecimal startTimeSpotRate = interestRateStrategy.getSpotRate(startTime);
47      BigDecimal sjj = endTimeSpotRate.multiply(endTime);
48      BigDecimal sii = startTimeSpotRate.multiply(startTime);
49      return mathCalc.div(sjj.subtract(sii), endTime.subtract(startTime));
50    }
51    
52    /**
53     * d[i,j] = e^(-1 * f[i,j] * (j-i))
54     */
55    public BigDecimal getDiscountFactor(BigDecimal startTime, BigDecimal endTime, InterestRateStrategy interestRateStrategy) {
56      BigDecimal timeDiff = endTime.subtract(startTime);
57      if (timeDiff.compareTo(mathCalc.ZERO) == 0) {
58        return mathCalc.ONE;
59      }
60      BigDecimal forwardRate = getForwardRate(startTime, endTime, interestRateStrategy);
61      return mathCalc.exp(forwardRate.multiply(timeDiff).negate());
62    }
63  
64    public BigDecimal getDurationMultiplicand(BigDecimal time, BigDecimal spotRate) {
65      return mathCalc.exp(spotRate.multiply(time).negate());
66    }
67    
68  
69  
70  }