示例#1
0
 private void FilterUserCriteriaForComposition(PortfolioComposition portfolioComposition,
                                               decimal?portfolioCompositionLimit)
 {
     if (portfolioCompositionLimit != 0 && portfolioCompositionLimit != null)
     {
         portfolioComposition.IndividualStockWeightages = portfolioComposition.IndividualStockWeightages.Where(x => x.CurrentValueRatio <= portfolioCompositionLimit);
     }
 }
        public async Task <PortfolioComposition> GetPortfolioComposition(ulong userId)
        {
            var portfolioComposition = new PortfolioComposition();
            var individualWeightages = new List <IndividualStockWeightage>();

            var holdings = await _stockHoldingService.GetAllHoldingsForUserWithStockDetails(userId);

            var tickers            = holdings.Select(x => x.Stock.Ticker);
            var lastQuoteForStocks = await _marketDataService.GetLastStockQuote(tickers);

            var tickerLastQuoteMap = lastQuoteForStocks.ToDictionary(x => x.Symbol);

            foreach (var holding in holdings)
            {
                if (tickerLastQuoteMap.ContainsKey(holding.Stock.Ticker))
                {
                    var individualWeightage = new IndividualStockWeightage();
                    individualWeightage.Ticker   = holding.Stock.Ticker;
                    individualWeightage.Country  = holding.Stock.Country;
                    individualWeightage.Sector   = holding.Stock.Sector;
                    individualWeightage.Industry = holding.Stock.Industry;

                    foreach (var holdingDetail in holding.HoldingDetails)
                    {
                        individualWeightage.TotalCurrentValue  += tickerLastQuoteMap[individualWeightage.Ticker].Price * holdingDetail.Quantity;
                        individualWeightage.TotalPurchasePrice += holdingDetail.Price * holdingDetail.Quantity;
                    }

                    FindAmountsByCountry(individualWeightage, portfolioComposition);
                    FindAmountsByIndustry(individualWeightage, portfolioComposition);
                    FindAmountsBySector(individualWeightage, portfolioComposition);

                    portfolioComposition.TotalCost            += individualWeightage.TotalPurchasePrice;
                    portfolioComposition.TotalInvestmentValue += individualWeightage.TotalCurrentValue;

                    individualWeightages.Add(individualWeightage);
                }
            }

            foreach (var individualWeightage in individualWeightages)
            {
                individualWeightage.PurchasePriceRatio = Math.Round(((individualWeightage.TotalPurchasePrice / portfolioComposition.TotalCost) * 100), 2);
                individualWeightage.CurrentValueRatio  = Math.Round((individualWeightage.TotalCurrentValue / portfolioComposition.TotalInvestmentValue) * 100, 2);
            }

            Task.WaitAll(Task.Run(() => { FindRatiosByCountry(portfolioComposition); }),
                         Task.Run(() => { FindRatiosByIndustry(portfolioComposition); }),
                         Task.Run(() => { FindRatiosBySector(portfolioComposition); }));

            portfolioComposition.IndividualStockWeightages = individualWeightages;

            return(portfolioComposition);
        }
        private void FindRatiosByIndustry(PortfolioComposition portfolioComposition)
        {
            foreach (var entry in portfolioComposition.InvestmentAmountByIndustry)
            {
                portfolioComposition.InvestmentRatioByIndustry[entry.Key] = Math.Round((entry.Value / portfolioComposition.TotalCost) * 100, 2);
            }

            foreach (var entry in portfolioComposition.CurrentValueAmountByIndustry)
            {
                portfolioComposition.CurrentValueRatioByIndustry[entry.Key] = Math.Round((entry.Value / portfolioComposition.TotalInvestmentValue) * 100, 2);
            }
        }
示例#4
0
        private void MapCompositionAndRecommendation(CompositionAndRecommendation compositionAndRecommendation,
                                                     PortfolioComposition portfolioComposition,
                                                     IEnumerable <ScraperAnalysis> scraperAnalyses)
        {
            var analysesMap = MapAnalyses(scraperAnalyses);

            compositionAndRecommendation.TotalCost            = portfolioComposition.TotalCost;
            compositionAndRecommendation.TotalInvestmentValue = portfolioComposition.TotalInvestmentValue;
            var compositionAndRecommendationMap = new Dictionary <string, Tuple <IndividualStockWeightage, ScraperAnalysis> >();

            foreach (var stockWeightage in portfolioComposition.IndividualStockWeightages)
            {
                if (!compositionAndRecommendationMap.ContainsKey(stockWeightage.Ticker) && analysesMap.ContainsKey(stockWeightage.Ticker))
                {
                    var portfolioAndRecommendation = new Tuple <IndividualStockWeightage, ScraperAnalysis>(stockWeightage, analysesMap[stockWeightage.Ticker]);
                    compositionAndRecommendationMap[stockWeightage.Ticker] = portfolioAndRecommendation;
                }
            }
            compositionAndRecommendation.Analyses = compositionAndRecommendationMap;
        }
        private void FindAmountsByIndustry(IndividualStockWeightage individualWeightage, PortfolioComposition portfolioComposition)
        {
            if (!string.IsNullOrEmpty(individualWeightage.Industry))
            {
                if (!portfolioComposition.InvestmentAmountByIndustry.ContainsKey(individualWeightage.Industry))
                {
                    portfolioComposition.InvestmentAmountByIndustry[individualWeightage.Industry] = individualWeightage.TotalPurchasePrice;
                }
                else
                {
                    portfolioComposition.InvestmentAmountByIndustry[individualWeightage.Industry] += individualWeightage.TotalPurchasePrice;
                }

                if (!portfolioComposition.CurrentValueAmountByIndustry.ContainsKey(individualWeightage.Industry))
                {
                    portfolioComposition.CurrentValueAmountByIndustry[individualWeightage.Industry] = individualWeightage.TotalCurrentValue;
                }
                else
                {
                    portfolioComposition.CurrentValueAmountByIndustry[individualWeightage.Industry] += individualWeightage.TotalCurrentValue;
                }
            }
        }