private IList <StockInvestIncomeSummaryModel> CalculateTotalInvestIncome(IList <StockInvestIncomeSummaryModel> queryResult) { var result = new List <StockInvestIncomeSummaryModel>(); result.AddRange(queryResult); var totalSummaryModel = new StockInvestIncomeSummaryModel(); totalSummaryModel.Type = 1; totalSummaryModel.StockFullCode = " 合计: "; totalSummaryModel.StockName = string.Empty; totalSummaryModel.AccumulatedProfit = queryResult.Sum(x => x.AccumulatedProfit); totalSummaryModel.AnnualProfit = queryResult.Sum(x => x.AnnualProfit); totalSummaryModel.BandActualProfit = queryResult.Sum(x => x.BandActualProfit); totalSummaryModel.BandFoatingProfit = queryResult.Sum(x => x.BandFoatingProfit); totalSummaryModel.BandHoldingVolume = 0; totalSummaryModel.BandPositionValue = queryResult.Sum(x => x.BandPositionValue); totalSummaryModel.BandTotalProfit = queryResult.Sum(x => x.BandTotalProfit); totalSummaryModel.CurrentPositionValue = queryResult.Sum(x => x.CurrentPositionValue); totalSummaryModel.CurrentHoldingVolume = 0; totalSummaryModel.CurrentPrice = 0; totalSummaryModel.CurrentProfit = queryResult.Sum(x => x.CurrentProfit); totalSummaryModel.DayActualProfit = queryResult.Sum(x => x.DayActualProfit); totalSummaryModel.DayFoatingProfit = queryResult.Sum(x => x.DayFoatingProfit); totalSummaryModel.DayHoldingVolume = 0; totalSummaryModel.DayPositionValue = queryResult.Sum(x => x.DayPositionValue); totalSummaryModel.DayTotalProfit = queryResult.Sum(x => x.DayTotalProfit); totalSummaryModel.InitHoldingVolume = 0; totalSummaryModel.InitPositionValue = queryResult.Sum(x => x.InitPositionValue); totalSummaryModel.InitProfit = queryResult.Sum(x => x.InitProfit); totalSummaryModel.InitPrice = 0; totalSummaryModel.TargetActualProfit = queryResult.Sum(x => x.TargetActualProfit); totalSummaryModel.TargetFoatingProfit = queryResult.Sum(x => x.TargetFoatingProfit); totalSummaryModel.TargetHoldingVolume = 0; totalSummaryModel.TargetPositionValue = queryResult.Sum(x => x.TargetPositionValue); totalSummaryModel.TargetTotalProfit = queryResult.Sum(x => x.TargetTotalProfit); result.Add(totalSummaryModel); return(result); }
private IList <StockInvestIncomeSummaryModel> CalculateStockIncomeSummary(DateTime startDate, DateTime endDate) { var result = new List <StockInvestIncomeSummaryModel>(); var allRecords = _dailyRecordService.GetDailyRecords(tradeDateFrom: _initDate, tradeDateTo: endDate); if (!allRecords.Any()) { return(result); } var stockFullCodes = allRecords.Select(x => x.StockCode).Distinct().ToArray(); var baseDate = (new DateTime(endDate.Year, 1, 1)).AddDays(-1); var queryDates = new List <DateTime> { baseDate, startDate, endDate }; var stockClosePrices = _TKLineService.GetStockClosePrices(queryDates, stockFullCodes); var baseDateClosePrices = stockClosePrices.Where(x => x.TradeDate == baseDate).ToList(); var initDateClosePrices = stockClosePrices.Where(x => x.TradeDate == startDate).ToList(); var currentDateClosePrices = stockClosePrices.Where(x => x.TradeDate == endDate).ToList(); //股票分组记录 var recordsByStockCode = allRecords.GroupBy(x => x.StockCode); foreach (var stockGroup in recordsByStockCode) { var stockFullCode = stockGroup.Key; var stockName = stockGroup.First().StockName; var recordsByTradeType = stockGroup.GroupBy(x => x.TradeType); //基准日股票收盘价 decimal baseClosePrice = (baseDateClosePrices.LastOrDefault(x => x.StockCode.Trim() == stockGroup.Key) ?? new TKLineToday()).Close; //期初股票收盘价格 decimal initClosePrice = (initDateClosePrices.LastOrDefault(x => x.StockCode.Trim() == stockGroup.Key) ?? new TKLineToday()).Close; //期末股票收盘价格 decimal currentClosePrice = (currentDateClosePrices.LastOrDefault(x => x.StockCode.Trim() == stockGroup.Key) ?? new TKLineToday()).Close; #region 基准日处理 //截至基准日的交易记录 var baseRecords = stockGroup.Where(x => x.TradeDate <= baseDate); //发生金额 decimal baseActualAmount = baseRecords.Sum(x => x.ActualAmount); //股票的持股数 decimal baseHoldingVolume = baseRecords.Sum(x => x.DealVolume); //持仓市值 decimal basePositionValue = Math.Abs(baseHoldingVolume) * baseClosePrice; //累计收益额 decimal baseAccumulatedProfit = baseActualAmount + baseHoldingVolume * baseClosePrice; #endregion 基准日处理 #region 期初处理 //截至期初的交易记录 var initRecords = stockGroup.Where(x => x.TradeDate <= startDate); //发生金额 decimal initActualAmount = initRecords.Sum(x => x.ActualAmount); //股票的持股数 decimal initHoldingVolume = initRecords.Sum(x => x.DealVolume); //持仓市值 decimal initPositionValue = Math.Abs(initHoldingVolume) * initClosePrice; //累计收益额 decimal initAccumulatedProfit = initActualAmount + initHoldingVolume * initClosePrice; //目标累计收益额 var initTargetRecords = initRecords.Where(x => x.TradeType == (int)EnumLibrary.TradeType.Target); decimal initTargetAccumulatedProfit = initTargetRecords.Sum(x => x.ActualAmount) + Math.Abs(initTargetRecords.Sum(x => x.DealVolume)) * initClosePrice; //波段累计收益额 var initBandRecords = initRecords.Where(x => x.TradeType == (int)EnumLibrary.TradeType.Target); decimal initBandAccumulatedProfit = initBandRecords.Sum(x => x.ActualAmount) + Math.Abs(initBandRecords.Sum(x => x.DealVolume)) * initClosePrice; //日内累计收益额 var initDayRecords = initRecords.Where(x => x.TradeType == (int)EnumLibrary.TradeType.Target); decimal initDayAccumulatedProfit = initDayRecords.Sum(x => x.ActualAmount) + Math.Abs(initDayRecords.Sum(x => x.DealVolume)) * initClosePrice; #endregion 期初处理 #region 期末处理 //截至期末的交易记录 var currentRecords = stockGroup; //股票持股数 decimal currentHoldingVolume = currentRecords.Sum(x => x.DealVolume); //发生金额 decimal currentActualAmount = currentRecords.Sum(x => x.ActualAmount); //持仓市值 decimal currentPositionValue = Math.Abs(currentHoldingVolume) * currentClosePrice; //累计收益额 decimal currentAccumulatedProfit = currentActualAmount + currentHoldingVolume * currentClosePrice; //本期收益 decimal currentProfit = currentAccumulatedProfit - initAccumulatedProfit; #region 目标统计 //目标交易记录 var targetRecords = stockGroup.Where(x => x.TradeType == (int)EnumLibrary.TradeType.Target); //目标股票持股数 decimal targetHoldingVolume = targetRecords.Sum(x => x.DealVolume); //目标发生金额 decimal targetActualAmount = targetRecords.Sum(x => x.ActualAmount); //目标持仓市值 decimal targetPositionValue = Math.Abs(targetHoldingVolume) * currentClosePrice; //目标累计收益额 decimal targetAccumulatedProfit = targetActualAmount + targetHoldingVolume * currentClosePrice; //目标本期收益 decimal targetTotalProfit = targetAccumulatedProfit - initTargetAccumulatedProfit; //目标浮动收益 decimal targetFloatingProfit = targetHoldingVolume * (currentClosePrice - initClosePrice); #endregion 目标统计 #region 波段统计 //波段交易记录 var bandRecords = stockGroup.Where(x => x.TradeType == (int)EnumLibrary.TradeType.Band); //波段股票持股数 decimal bandHoldingVolume = bandRecords.Sum(x => x.DealVolume); //波段发生金额 decimal bandActualAmount = bandRecords.Sum(x => x.ActualAmount); //波段持仓市值 decimal bandPositionValue = Math.Abs(bandHoldingVolume) * currentClosePrice; //波段累计收益额 decimal bandAccumulatedProfit = bandActualAmount + bandHoldingVolume * currentClosePrice; //波段本期收益 decimal bandTotalProfit = bandAccumulatedProfit - initBandAccumulatedProfit; //波段浮动收益 decimal bandFloatingProfit = bandHoldingVolume * (currentClosePrice - initClosePrice); #endregion 波段统计 #region 日内统计 //日内交易记录 var dayRecords = stockGroup.Where(x => x.TradeType == (int)EnumLibrary.TradeType.Day); //日内股票持股数 decimal dayHoldingVolume = dayRecords.Sum(x => x.DealVolume); //日内发生金额 decimal dayActualAmount = dayRecords.Sum(x => x.ActualAmount); //日内持仓市值 decimal dayPositionValue = Math.Abs(dayHoldingVolume) * currentClosePrice; //日内累计收益额 decimal dayAccumulatedProfit = dayActualAmount + dayHoldingVolume * currentClosePrice; //日内本期收益 decimal dayTotalProfit = dayAccumulatedProfit - initDayAccumulatedProfit; //日内浮动收益 decimal dayFloatingProfit = dayHoldingVolume * (currentClosePrice - initClosePrice); #endregion 日内统计 #endregion 期末处理 var stockSummaryModel = new StockInvestIncomeSummaryModel() { Type = 0, StockFullCode = stockFullCode, StockName = stockName, AccumulatedProfit = currentAccumulatedProfit, AnnualProfit = currentAccumulatedProfit - baseAccumulatedProfit, BandActualProfit = bandActualAmount, BandFoatingProfit = bandFloatingProfit, BandHoldingVolume = bandHoldingVolume, BandPositionValue = bandPositionValue, BandTotalProfit = bandTotalProfit, CurrentPositionValue = currentPositionValue, CurrentHoldingVolume = currentHoldingVolume, CurrentPrice = currentClosePrice, CurrentProfit = currentProfit, DayActualProfit = dayActualAmount, DayFoatingProfit = dayFloatingProfit, DayHoldingVolume = dayHoldingVolume, DayPositionValue = dayPositionValue, DayTotalProfit = dayTotalProfit, InitHoldingVolume = initHoldingVolume, InitPositionValue = initPositionValue, InitProfit = initAccumulatedProfit, InitPrice = initClosePrice, TargetActualProfit = targetActualAmount, TargetFoatingProfit = targetFloatingProfit, TargetHoldingVolume = targetHoldingVolume, TargetPositionValue = targetPositionValue, TargetTotalProfit = targetTotalProfit, }; result.Add(stockSummaryModel); } return(result); }