Exemplo n.º 1
0
        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);
        }
Exemplo n.º 2
0
        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);
        }