public int CompareTo(object obj) { EquityAttibution eax = (EquityAttibution)obj; EquityAttibution eay = this; if (eax.PortfolioWeight > eay.PortfolioWeight) { return(1); } else if (eax.PortfolioWeight == eay.PortfolioWeight) { if (eax.BenchmarkWeight >= eay.BenchmarkWeight) { return(1); } else { return(-1); } } else { return(-1); } }
public List <EquityAttibution> Attribute() { if (this.Benchmark == null || this.Benchmark.Components == null || this.Benchmark.Components.Count == 0) { MessageManager.GetInstance().AddMessage(MessageType.Information, "未设置比较基准", ""); return(null); } ASecurityGroup benchmarkcomponents = this.Benchmark.GetLatestComponents(); if (benchmarkcomponents.SecurityList == null || benchmarkcomponents.SecurityList.Count == 0 || benchmarkcomponents.SecurityList[0].Type != SecurityType.Equity) { throw new Exception("比较基准设置错误,仅股票型可用"); } List <EquityGroup> bmindustrylist = ((EquityGroup)benchmarkcomponents).IndustryList; EquityGroup portfolio = (EquityGroup)this.PortfGroup.GetLatestPortfolio().EquityHoldings; List <EquityGroup> pindustrylist = portfolio.IndustryList; //基准总回报: // 1) benchmarkcomponents.Position.AccumulatedYieldIndex - 1; //指数成份的区间加权平均收益率,这个不准确,因为一个月内成分权重会随着涨跌变化 // 2) this.Benchmark.Position.CurrentYield; //指数的区间收益率,这个准确 double totalbmreturn = this.Benchmark.Position.CurrentYield; this.EquityAttributions.Clear(); foreach (EquityGroup bmindustry in bmindustrylist) { EquityGroup pindustry = pindustrylist.Find(delegate(EquityGroup eg) { return(eg.Name == bmindustry.Name); }); if (pindustry == null) { pindustry = new EquityGroup(); pindustry.Name = bmindustry.Name; } //•行业配置回报 = (组合权重 - 基准权重) * (基准回报 - 基准总回报),反应投资组合的行业配置效应; //•行业内选股回报 = 基准权重 * (组合回报 - 基准回报),反应投资组合行业内的选股效应; //•交叉回报 = (组合权重 - 基准权重) * (组合回报 - 基准回报),反应行业配置和行业内选股的联合效应; //•增加值 = 组合权重 * 组合回报 - 基准权重 * 基准回报,反应主动性管理给投资组合带来的超额收益效应; EquityAttibution ea = new EquityAttibution(); ea.IndustryName = bmindustry.Name; ea.MarketValue = pindustry.Position.MarketValue; ea.PortfolioWeight = pindustry.Position.MarketValuePct; ea.BenchmarkWeight = bmindustry.Position.MarketValuePct; ea.PortfolioReturn = pindustry.Position.AccumulatedYieldIndex - 1; ea.BenchmarkReturn = bmindustry.Position.AccumulatedYieldIndex - 1; ea.IndustryAttribution = (ea.PortfolioWeight - ea.BenchmarkWeight) * (ea.BenchmarkReturn - totalbmreturn); ea.SecurityAttribution = ea.BenchmarkWeight * (ea.PortfolioReturn - ea.BenchmarkReturn); ea.CrossAttribution = (ea.PortfolioWeight - ea.BenchmarkWeight) * (ea.PortfolioReturn - ea.BenchmarkReturn); ea.ValueAdded = ea.PortfolioWeight * ea.PortfolioReturn - ea.BenchmarkWeight * ea.BenchmarkReturn; this.EquityAttributions.Add(ea); } //按市值排序 this.EquityAttributions.Sort(); //整个股票组合 EquityAttibution equityattr = new EquityAttibution(); equityattr.IndustryName = "股票组合"; equityattr.MarketValue = portfolio.Position.MarketValue; equityattr.PortfolioWeight = portfolio.Position.MarketValuePct; equityattr.PortfolioReturn = portfolio.Position.AccumulatedYieldIndex - 1; equityattr.BenchmarkReturn = totalbmreturn; equityattr.ValueAdded = equityattr.PortfolioReturn - equityattr.BenchmarkReturn; this.EquityAttributions.Add(equityattr); return(this.EquityAttributions); }