private void BuildTrajectory(ConventionDate today, ConventionDate maturity) { double dt = GetDt(); double spotValue; bool afterMaturity = false; ConventionDate currentDate = today.GetNextDate(); ConventionDate previousDate = today; while (!afterMaturity) { if (currentDate.Equals(maturity)) { afterMaturity = true; } spotValue = spots[previousDate] * Math.Exp((drift - Math.Pow(vol, 2) / 2) * dt + vol * Math.Sqrt(dt) * Normal.Sample(random, 0.0, 1.0)); spots.Add(currentDate, spotValue); previousDate = currentDate; currentDate = currentDate.GetNextDate(); } }
public double GetPrice(Action action) { double perf; double perfFactor = 1; double price = 0; int year = 1; ConventionDate previousDate = new ConventionDate(); ConventionDate currentDate = GetNextCouponDate(previousDate); int nbDays = previousDate.NumberDays(currentDate); double factor = (double)nbDays / (double)previousDate.GetDaysPerYear(); price += factor * faceValue * annualRate / Math.Pow((1 + marketRate), factor); while (!currentDate.Equals(maturity)) { if (action != null) { perf = action.GetPerf(currentDate, previousDate); if (perf > 0.2) { perfFactor = 1; } else if (perf > 0.1) { perfFactor = 0.7; } else { perfFactor = 0.5; } } price += perfFactor * faceValue * annualRate / Math.Pow(1 + marketRate, factor + (year / frequency)) / (double)frequency; year += 1; previousDate = currentDate; currentDate = GetNextCouponDate(currentDate); } /*for (int year = 1; year < frequency * YearsTillMaturity(); year++) * { * if (action != null) * { * perf = action.GetPerf(year); * } * price += perf * faceValue * annualRate / Math.Pow((1 + marketRate), factor + (year / frequency)) / (double)frequency; * }*/ if (action != null) { perf = action.GetPerf(previousDate, maturity); if (perf > 0.2) { perfFactor = 1; } else if (perf > 0.1) { perfFactor = 0.7; } else { perfFactor = 0.5; } } price += perfFactor * faceValue * (1 + annualRate) / Math.Pow((1 + marketRate), factor + YearsTillMaturity()); return(price); }