public PositionFormulas GetPositionData(int?portfolioId, string userId, string symbol) { List <Trade> allTradesBySymbol = _repo.GetTradesBySymbol(portfolioId, userId, symbol); if (allTradesBySymbol.Count == 0) { return(null); } // add the trades to the positon object. PositionFormulas position = new PositionFormulas(symbol); foreach (Trade trade in allTradesBySymbol) { position.AddTransaction(trade); } // get symbol prices from DB List <SecurityPrices> marketPrices = _repo.GetSecurityPrices(symbol); // make the below a private method - build price table // build DataFrame from Database Prices # DataFrame marketPricesFrame = CreatePriceTable(marketPrices); // # position.CalculateDailyPerformance(marketPricesFrame); return(position); }
public IActionResult PositionBreakdown(int?portfolioId, string positionSymbol) { if (portfolioId == null || positionSymbol == null) { return(NotFound()); } PositionFormulas position = _service.GetPositionData(portfolioId, _userId, positionSymbol); if (position == null) { return(NotFound()); } string portfolioName = _repo.GetPortfolioName(portfolioId); TradeableSecurities securityDetail = _repo.GetSecurityDetails(positionSymbol); PositionDataVM positionVM = new PositionDataVM { PortfolioId = portfolioId, PortfolioName = portfolioName, PositionObject = position, PositionSymbolData = securityDetail }; return(View(positionVM)); }
public void TestDailyShortPositionPerformance() { PositionFormulas position = new PositionFormulas(testSymbol); Trade tradeA = CreateTransaction(-500, testSymbol, 12.5m, new DateTime(2020, 5, 4)); Trade tradeB = CreateTransaction(-600, testSymbol, 15m, new DateTime(2020, 5, 4)); position.AddTransaction(tradeA); position.AddTransaction(tradeB); DataFrame priceTable = CreatePriceTable(); position.CalculateDailyPerformance(priceTable); decimal[] performances = new decimal[] { -2.931m, -10.145m, -17.358m, -24.571m, -31.784m, -38.997m, -46.210m }; PrimitiveDataFrameColumn <decimal> performance = new PrimitiveDataFrameColumn <decimal>("pct_change", performances); Assert.Equal(performance, position.GetDailyPerformance().Columns["pct_change"]); }
public void TestDailyValuation() { // Two purchases on different days PositionFormulas position = new PositionFormulas(testSymbol); Trade tradeA = CreateTransaction(500, testSymbol, 12.5m, new DateTime(2020, 5, 4)); Trade tradeB = CreateTransaction(600, testSymbol, 15m, new DateTime(2020, 5, 8)); position.AddTransaction(tradeA); position.AddTransaction(tradeB); DataFrame priceTable = CreatePriceTable(); position.CalculateDailyValuation(priceTable); decimal[] dailyValues = new decimal[] { 7135m, 7635m, 8135m, 8635m, 20097m, 21197m, 22297m }; PrimitiveDataFrameColumn <decimal> dailyVals = new PrimitiveDataFrameColumn <decimal>($"{testSymbol}_MarketValue", dailyValues); Assert.Equal(dailyVals, position.GetDailyValuation().Columns[$"{testSymbol}_MarketValue"]); }
public PortfolioData GetPortfolioData(string portfolioName, List <Trade> allTrades) { List <string> distinctTickers = allTrades.Select(t => t.Ticker).Distinct().ToList(); PortfolioData userPortfolio = new PortfolioData(portfolioName); foreach (string ticker in distinctTickers) { PositionFormulas position = new PositionFormulas(ticker); foreach (Trade trade in allTrades) { if (trade.Ticker == ticker) { position.AddTransaction(trade); } } List <SecurityPrices> marketPrices = _repo.GetSecurityPrices(ticker); DataFrame marketPricesFrame = CreatePriceTable(marketPrices); position.CalculateDailyValuation(marketPricesFrame); userPortfolio.AddPositon(position); } return(userPortfolio); }