예제 #1
0
        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);
        }
예제 #2
0
        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;
                }
            }
        }
예제 #3
0
        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);
            }
        }
예제 #4
0
 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)));
 }