public void SetUp() { DF = new double[] { 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.998499434385086, 0.997001130859396, 0.991867414193933, 0.986760118251288, 0.981679134127974, 0.97761011690404, 0.973557963582377, 0.96952259438059, 0.965503955160068, 0.961501988309603 }; DF[11] = Math.Exp((Math.Log(DF[10]) + Math.Log(DF[12])) / 2); DF[13] = Math.Exp(Math.Log(DF[12]) * 2 / 3 + Math.Log(DF[15]) / 3); DF[13] = Math.Exp(Math.Log(DF[12]) / 3 + Math.Log(DF[15]) * 2 / 3); DF[16] = Math.Exp(Math.Log(DF[15]) * 4 / 5 + Math.Log(DF[20]) / 5); DF[17] = Math.Exp(Math.Log(DF[15]) * 3 / 5 + Math.Log(DF[20]) * 2 / 5); DF[18] = Math.Exp(Math.Log(DF[15]) * 2 / 5 + Math.Log(DF[20]) * 3 / 5); DF[19] = Math.Exp(Math.Log(DF[15]) / 5 + Math.Log(DF[20]) * 4 / 5); p1 = (1 - DF[1]) / DF[1]; p2 = (1 - DF[2]) / (DF[1] + DF[2]); p3 = (1 - DF[3]) / (DF[1] + DF[2] + DF[3]); p4 = (1 - DF[4]) / (DF[1] + DF[2] + DF[3] + DF[4]); p5 = (1 - DF[5]) / (DF[1] + DF[2] + DF[3] + DF[4] + DF[5]); p6 = (1 - DF[6]) / (DF[1] + DF[2] + DF[3] + DF[4] + DF[5] + DF[6]); p7 = (1 - DF[7]) / (DF[1] + DF[2] + DF[3] + DF[4] + DF[5] + DF[6] + DF[7]); p8 = (1 - DF[8]) / (DF[1] + DF[2] + DF[3] + DF[4] + DF[5] + DF[6] + DF[7] + DF[8]); p9 = (1 - DF[9]) / (DF[1] + DF[2] + DF[3] + DF[4] + DF[5] + DF[6] + DF[7] + DF[8] + DF[9]); p10 = (1 - DF[10]) / (DF[1] + DF[2] + DF[3] + DF[4] + DF[5] + DF[6] + DF[7] + DF[8] + DF[9] + DF[10]); p12 = (1 - DF[12]) / (DF[1] + DF[2] + DF[3] + DF[4] + DF[5] + DF[6] + DF[7] + DF[8] + DF[9] + DF[10] + DF[11] + DF[12]); p15 = (1 - DF[15]) / (DF[1] + DF[2] + DF[3] + DF[4] + DF[5] + DF[6] + DF[7] + DF[8] + DF[9] + DF[10] + DF[11] + DF[12] + DF[13] + DF[14] + DF[15]); p20 = (1 - DF[20]) / (DF[1] + DF[2] + DF[3] + DF[4] + DF[5] + DF[6] + DF[7] + DF[8] + DF[9] + DF[10] + DF[11] + DF[12] + DF[13] + DF[14] + DF[15] + DF[16] + DF[17] + DF[18] + DF[19] + DF[20]); //ODF = new OptimalDiscountFactors(0.188, 0.215, 0.255, 0.318, 0.375, 0.445, 0.51, 0.57, 0.625, 0.677, 0.773, 0.873, 0.958); double creditrisk = 0.0035; ODF = new OptimalDiscountFactors(100 * (p1 + creditrisk), 100 * (p2 + creditrisk), 100 * (p3 + creditrisk), 100 * (p4 + creditrisk), 100 * (p5 + creditrisk), 100 * (p6 + creditrisk), 100 * (p7 + creditrisk), 100 * (p8 + creditrisk), 100 * (p9 + creditrisk), 100 * (p10 + creditrisk), 100 * (p12 + creditrisk), 100 * (p15 + creditrisk), 100 * (p20 + creditrisk)); MB = new MinimizeBanana(2.0, 3.0); }
static void Main(string[] args) { /* // Fi par 2019-12-31 * int[] swapdur = new int[] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 12, 15, 20, 30 }; * double[] par_debug = new double[] { 0.1, 0.188, 0.215, 0.255, 0.318, 0.375, 0.445, 0.51, 0.57, 0.625, 0.677, 0.773, 0.873, 0.958, 1.0 }; // Fi December * * OptimalDiscountFactors ODF = new OptimalDiscountFactors(0.188, 0.215, 0.255, 0.318, 0.375, 0.445, 0.51, 0.57, 0.625, 0.677, 0.773, 0.873, 0.958); * * // Fi rate 2019-12-31 * double [] FiFFFS = new double[] { 0, 0, 0, 0, 0, 0.000250125, 0.000952065, 0.001606129, 0.002212058, 0.002769566, 0.003298784, 0.004104149, 0.005022016, * 0.006039549, 0.007121224, 0.008254043, 0.009411152, 0.010607462, 0.011836308, 0.013092432, 0.014371629, 0.015670499, 0.016852732, 0.017933365, * 0.018924953, 0.019838068, 0.020681669, 0.021463404, 0.022189836, 0.022866634, 0.023498716, 0.024090373, 0.024645361, 0.025166988, 0.025658174, * 0.026121507, 0.026559292, 0.026973585, 0.027366227, 0.027738872, 0.02809301, 0.028429987, 0.028751019, 0.029057213, 0.029349575, 0.02962902, * 0.029896386, 0.03015244, 0.030397885, 0.030633367, 0.03085948, 0.031076772, 0.03128575, 0.031486883, 0.031680603, 0.031867313, 0.032047387, * 0.032221172, 0.032388993, 0.03255115, 0.032707927, 0.032859586, 0.033006374, 0.033148522, 0.033286246, 0.03341975, 0.033549226, 0.033674851, * 0.033796797, 0.033915221, 0.034030275, 0.034142101, 0.034250831, 0.034356594, 0.034459509, 0.034559689, 0.034657242, 0.03475227, 0.03484487, * 0.034935133, 0.035023148, 0.035108996, 0.035192758, 0.035274508, 0.035354317, 0.035432255, 0.035508385, 0.035582771, 0.035655472, 0.035726544, * 0.035796041, 0.035864015, 0.035930516, 0.035995591, 0.036059285, 0.036121642, 0.036182704, 0.03624251, 0.036301099, 0.036358508, 0.036414771 }; * * * Console.WriteLine("dur\tDF\tfi"); * for (int d = 1; d < 21; d++) * Console.WriteLine("{0}\t{1}\t{2}", d, ODF.discountFactor(d), ODF.fiRate(d)); * * Console.WriteLine("dur\tfi"); * for (int d = 1; d < 101; d++) * Console.WriteLine("{0}\t{1}", d, ODF.fiRate(d)); */ // test DF double p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p12, p15, p20; double[] DF = new double[] { 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.998499434385086, 0.997001130859396, 0.991867414193933, 0.986760118251288, 0.981679134127974, 0.97761011690404, 0.973557963582377, 0.96952259438059, 0.965503955160068, 0.961501988309603 }; DF[11] = Math.Exp((Math.Log(DF[10]) + Math.Log(DF[12])) / 2); DF[13] = Math.Exp(Math.Log(DF[12]) * 2 / 3 + Math.Log(DF[15]) / 3); DF[13] = Math.Exp(Math.Log(DF[12]) / 3 + Math.Log(DF[15]) * 2 / 3); DF[16] = Math.Exp(Math.Log(DF[15]) * 4 / 5 + Math.Log(DF[20]) / 5); DF[17] = Math.Exp(Math.Log(DF[15]) * 3 / 5 + Math.Log(DF[20]) * 2 / 5); DF[18] = Math.Exp(Math.Log(DF[15]) * 2 / 5 + Math.Log(DF[20]) * 3 / 5); DF[19] = Math.Exp(Math.Log(DF[15]) / 5 + Math.Log(DF[20]) * 4 / 5); p1 = (1 - DF[1]) / DF[1]; p2 = (1 - DF[2]) / (DF[1] + DF[2]); p3 = (1 - DF[3]) / (DF[1] + DF[2] + DF[3]); p4 = (1 - DF[4]) / (DF[1] + DF[2] + DF[3] + DF[4]); p5 = (1 - DF[5]) / (DF[1] + DF[2] + DF[3] + DF[4] + DF[5]); p6 = (1 - DF[6]) / (DF[1] + DF[2] + DF[3] + DF[4] + DF[5] + DF[6]); p7 = (1 - DF[7]) / (DF[1] + DF[2] + DF[3] + DF[4] + DF[5] + DF[6] + DF[7]); p8 = (1 - DF[8]) / (DF[1] + DF[2] + DF[3] + DF[4] + DF[5] + DF[6] + DF[7] + DF[8]); p9 = (1 - DF[9]) / (DF[1] + DF[2] + DF[3] + DF[4] + DF[5] + DF[6] + DF[7] + DF[8] + DF[9]); p10 = (1 - DF[10]) / (DF[1] + DF[2] + DF[3] + DF[4] + DF[5] + DF[6] + DF[7] + DF[8] + DF[9] + DF[10]); p12 = (1 - DF[12]) / (DF[1] + DF[2] + DF[3] + DF[4] + DF[5] + DF[6] + DF[7] + DF[8] + DF[9] + DF[10] + DF[11] + DF[12]); p15 = (1 - DF[15]) / (DF[1] + DF[2] + DF[3] + DF[4] + DF[5] + DF[6] + DF[7] + DF[8] + DF[9] + DF[10] + DF[11] + DF[12] + DF[13] + DF[14] + DF[15]); p20 = (1 - DF[20]) / (DF[1] + DF[2] + DF[3] + DF[4] + DF[5] + DF[6] + DF[7] + DF[8] + DF[9] + DF[10] + DF[11] + DF[12] + DF[13] + DF[14] + DF[15] + DF[16] + DF[17] + DF[18] + DF[19] + DF[20]); double creditrisk = 0.0035; OptimalDiscountFactors ODF = new OptimalDiscountFactors(100 * (p1 + creditrisk), 100 * (p2 + creditrisk), 100 * (p3 + creditrisk), 100 * (p4 + creditrisk), 100 * (p5 + creditrisk), 100 * (p6 + creditrisk), 100 * (p7 + creditrisk), 100 * (p8 + creditrisk), 100 * (p9 + creditrisk), 100 * (p10 + creditrisk), 100 * (p12 + creditrisk), 100 * (p15 + creditrisk), 100 * (p20 + creditrisk)); var dfs = ODF.fit(ODF.initGuess); Console.WriteLine("dur\tDF\tDF'"); for (int d = 1; d < 20; d++) { Console.WriteLine("{0}\t{1}\t{2}", d, DF[d + 1], dfs[d]); } }