public static void Main(string[] args) { var simulatedData = new SimulatedDataProvider(); DateTime from = new DateTime(2018, 09, 04); Share share1 = new Share("vod.l", "vod.l"); Share share2 = new Share("ftse", "ftse"); string nameBasket = "Basket"; double strikeBasket = 9; Share[] sharesBasket = { share1, share2 }; Double[] weights = { 0.3, 0.7 }; DateTime maturityBasket = new DateTime(2019, 09, 04); BasketOption optionBasket = new BasketOption(nameBasket, sharesBasket, weights, maturityBasket, strikeBasket); PortfolioBasket portfolioBasket = new PortfolioBasket(); int totalDays = DayCount.CountBusinessDays(from, maturityBasket); double[] volatility = new double[2]; volatility[0] = 0.4; volatility[1] = 0.4; double[,] correlationMatrix = new double[2, 2]; correlationMatrix[0, 0] = 1; correlationMatrix[1, 1] = 0.1; correlationMatrix[0, 1] = 1; correlationMatrix[1, 0] = 0.1; double valeur = portfolioBasket.PortfolioValue(optionBasket, sharesBasket, totalDays, volatility, correlationMatrix, from); Console.WriteLine("Valeur Gain normalisée = " + valeur); }
public Balancement(IDataFeedProvider dataFeedProvider, IOption option, DateTime dateTmpDebut, int plageEstimation, int periodeRebalancement) { var dateDebut = new DateTime(dateTmpDebut.Year, dateTmpDebut.Month, dateTmpDebut.Day); var priceList = dataFeedProvider.GetDataFeed(option, dateDebut); payoff = payOffaMaturite(option, priceList); pricer = new Pricer(); hedge = new List <decimal>(); priceOption = new List <double>(); dates = new List <DateTime>(); Dictionary <string, double> compo = new Dictionary <string, double> { }; volatilite = Estimateur.Volatilite(priceList, plageEstimation, dateDebut.AddDays(plageEstimation), option, dataFeedProvider); matrixCorrelation = Estimateur.getCorrMatrix(priceList, plageEstimation, dateDebut.AddDays(plageEstimation)); Estimateur.dispMatrix(matrixCorrelation); PricingResults priceDelta = PriceResults(option, priceList[0].PriceList, dateDebut, dataFeedProvider); int i = 0; foreach (string id in option.UnderlyingShareIds) { compo[id] = priceDelta.Deltas[i]; i += 1; } DateTime oldBalancement = dateDebut; portfolio = new Portfolio(Convert.ToDecimal(priceDelta.Price), compo, priceList[0].PriceList); priceOption.Add(priceDelta.Price); hedge.Add(portfolio.portfolioValue); dates.Add(priceList[0].Date); foreach (DataFeed priceAsset_t in priceList.Skip(1)) { if (DayCount.CountBusinessDays(oldBalancement, priceAsset_t.Date) >= periodeRebalancement || priceAsset_t == priceList.Last()) { priceDelta = PriceResults(option, priceAsset_t.PriceList, dateDebut, dataFeedProvider); priceOption.Add(priceDelta.Price); portfolio.UpdatePortfolioValue(priceAsset_t, dataFeedProvider.NumberOfDaysPerYear, oldBalancement); i = 0; foreach (string id in option.UnderlyingShareIds) { compo[id] = priceDelta.Deltas[i]; i += 1; } hedge.Add(portfolio.portfolioValue); dates.Add(priceAsset_t.Date); portfolio.UpdateLiquidity(priceAsset_t); portfolio.UpdateCompo(compo); oldBalancement = priceAsset_t.Date; } } }
public static void Main(string[] args) { int strike = 9; double volatility = 0.4; DateTime maturity = new DateTime(2019, 09, 04); DateTime beginDate = new DateTime(2018, 09, 04); int totalDays = DayCount.CountBusinessDays(beginDate, maturity); Share[] share = { new Share("Sfr", "1254798") }; if (share.Length == 1) { VanillaCall callOption = new VanillaCall("Vanille", share[0], maturity, strike); /* Simulated data feeds : */ SimulatedDataFeedProvider simulator = new SimulatedDataFeedProvider(); List <DataFeed> dataFeeds = simulator.GetDataFeed(callOption, beginDate); int numberOfDaysPerYear = simulator.NumberOfDaysPerYear; /* Portfolio initialisation : */ Portfolio portfolio = new Portfolio(); portfolio.PortfolioComposition = new Dictionary <String, double>(); Pricer pricer = new Pricer(); double spot = (double)dataFeeds[0].PriceList[share[0].Id]; PricingResults pricingResults = pricer.PriceCall(callOption, beginDate, totalDays, spot, volatility); double callPrice = pricingResults.Price; portfolio.FirstPortfolioValue = callPrice; portfolio.CurrentPortfolioValue = callPrice; portfolio.CurrentDate = beginDate; double previousDelta = pricingResults.Deltas[0]; portfolio.PortfolioComposition.Add(share[0].Id, previousDelta); double payoff = 0; double[] optionValue = new Double[totalDays]; double[] portfolioValue = new Double[totalDays]; optionValue[0] = callPrice; portfolioValue[0] = portfolio.CurrentPortfolioValue; int indexArrays = 1; /* Skip the first day : because it's already initialized*/ foreach (DataFeed data in dataFeeds.Skip(1)) { if (data != dataFeeds.Last()) { portfolio.updateValue(spot, data, pricer, callOption, volatility, numberOfDaysPerYear); spot = updateSpot(data, share[0]); double pricing = getPricingResult(data, callOption, pricer, volatility, numberOfDaysPerYear); /* Fill arrays of optionValue and portfolioValue */ optionValue[indexArrays] = pricing; portfolioValue[indexArrays] = portfolio.CurrentPortfolioValue; Console.WriteLine("Valeur option = " + optionValue[indexArrays]); Console.WriteLine("Valeur portefeuille = " + portfolioValue[indexArrays]); } /* For the last day : */ else { portfolio.CurrentDate = data.Date; payoff = callOption.GetPayoff(data.PriceList); } indexArrays++; } /* Partie traçage de courbes */ using (System.IO.StreamWriter file = new System.IO.StreamWriter(@"C:\Users\ensimag\Desktop\WriteLines.txt")) { for (int index = 0; index < totalDays; index++) { // If the line doesn't contain the word 'Second', write the line to the file. file.WriteLine(optionValue[index]); file.WriteLine(portfolioValue[index]); } } //double valuePortfolio = (portfolio.currentPortfolioValue - payoff) / portfolio.firstPortfolioValue; //Console.WriteLine("Valeur = " + valuePortfolio); Portfolio portefolioTest = new Portfolio(); double finalportfolioValue = portfolio.updatePortfolio(pricer, callOption, dataFeeds, numberOfDaysPerYear, share[0], totalDays, volatility, beginDate); Console.WriteLine("Valeur = " + finalportfolioValue); } }
public void UpdatePortfolioValue(DataFeed priceAsset_t, int nbJourParAn, DateTime oldBalancement) { this.portfolioValue = 0; foreach (string id in priceAsset.Keys) { this.portfolioValue += Convert.ToDecimal(composition[id]) * priceAsset_t.PriceList[id]; } this.portfolioValue += this.liquidity * Convert.ToDecimal(RiskFreeRateProvider.GetRiskFreeRateAccruedValue(DayCount.ConvertToDouble( DayCount.CountBusinessDays(oldBalancement, priceAsset_t.Date) + 1, nbJourParAn))); }