protected virtual void CheckBondGroupAverageMaturity(CheckParameter para) { int order = C_Order_BondMaturity;; string title = C_Title_BondMaturity; string description; double warningthreshhold = Convert.ToDouble(para.WarningValue); double failedthreshhold = Convert.ToDouble(para.FailedValue); double warningyears = warningthreshhold / 365; double failedyears = failedthreshhold / 365; MonitorItem mi; ASecurityGroup g = this.SecurityPortfolio.BondHoldings; if (g.SecurityList == null || g.SecurityList.Count == 0) { return; } mi = new MonitorItem(); mi.code = ""; mi.name = "债券组合"; mi.title = title; mi.order = order; mi.securityid = g.SecurityList.Count; mi.status = Status.Pass; double remainingdays = ((BondGroup)g).GetAverageMaturity(); double remainingyears = remainingdays / 365; mi.value = remainingdays.ToString() + "天"; description = C_Desc_BondGroupAverageMaturity.Replace("<1>", mi.name).Replace("<OP>", getOperatorName(para.Operator)); if (this.compareValue(para.Operator, remainingdays, failedthreshhold)) { //检查fail放在前 // 确保当failthreshhold=warningthreshhold时,显示fail mi.threshhold = failedthreshhold.ToString("N0") + "天"; mi.status = Status.Fail; mi.description = description.Replace("<2>", remainingdays.ToString("F2") + "天(" + remainingyears.ToString("N2") + "年)").Replace("<3>", failedthreshhold + "天(" + failedyears.ToString("N2") + "年)"); } else if (this.compareValue(para.Operator, remainingdays, warningthreshhold)) { mi.threshhold = warningthreshhold.ToString("N0") + "天"; mi.status = Status.Warning; mi.description = description.Replace("<2>", remainingdays.ToString("F2") + "天(" + remainingyears.ToString("N2") + "年)").Replace("<3>", warningthreshhold + "天(" + warningyears.ToString("N2") + "年)"); } else { mi.threshhold = warningthreshhold.ToString("N0") + "天"; mi.status = Status.Pass; mi.description = ""; } this.Report.Add(mi); }
/// <summary> /// 检查债券估值偏离 /// </summary> protected virtual void CheckBondValueDeviation(CheckParameter para) { try { int order = C_Order_BondValueDeviation;; string title = C_Title_BondValueDeviation; string description; double warningthreshhold = Convert.ToDouble(para.WarningValue); double failedthreshhold = Convert.ToDouble(para.FailedValue); MonitorItem mi; int id = 0; ASecurityGroup g = this.SecurityPortfolio.BondHoldings; if (g.SecurityList == null || g.SecurityList.Count == 0) { return; } if (((Bond)g.SecurityList[0]).HistoryBondIntrinsicValue.OriginalTimeSeries.Count == 0) { g.LoadData(DataInfoType.HistoryBondValue); } foreach (ASecurity s in g.SecurityList) { mi = new MonitorItem(); mi.code = s.Code; mi.name = s.Name; mi.title = title; mi.order = order; mi.securityid = id++; mi.status = Status.Pass; double basevalue = s.Position.MarketValue / s.Position.Quantity; double estimatevalue = 0; if (((Bond)s).HistoryBondIntrinsicValue.AdjustedTimeSeries != null) { estimatevalue = ((HistoryItemBondValue)((Bond)s).HistoryBondIntrinsicValue.AdjustedTimeSeries[0]).ClearPrice; } double deviation = Math.Abs(estimatevalue / basevalue - 1); mi.value = deviation.ToString("P2"); description = C_Desc_BondValueDeviation.Replace("<1>", s.Name + "(" + s.Code + ")").Replace("<OP>", getOperatorName(para.Operator)); description = description.Replace("<4>", basevalue.ToString("N3")).Replace("<5>", estimatevalue.ToString("N4")); switch (s.Type) { case SecurityType.Bond: if (this.compareValue(para.Operator, deviation, failedthreshhold)) { //检查fail放在前 // 确保当failthreshhold=warningthreshhold时,显示fail mi.threshhold = failedthreshhold.ToString("P2"); mi.status = Status.Fail; mi.description = description.Replace("<2>", deviation.ToString("P2")).Replace("<3>", failedthreshhold.ToString("P2")); } else if (this.compareValue(para.Operator, deviation, warningthreshhold)) { mi.threshhold = warningthreshhold.ToString("P2"); mi.status = Status.Warning; mi.description = description.Replace("<2>", deviation.ToString("P2")).Replace("<3>", warningthreshhold.ToString("P2")); } else { mi.threshhold = warningthreshhold.ToString("P2"); mi.status = Status.Pass; mi.description = ""; } break; default: //对于非债券类型,无需作错误提示,会在其他步骤中检验 break; } this.Report.Add(mi); } } catch (Exception ex) { throw ex; } }
/// <summary> /// 检查付息日 /// </summary> protected virtual void CheckBondPayment(CheckParameter para) { int order = C_Order_BondIntPayment;; string title = C_Title_BondIntPayment; string description; double warningthreshhold = Convert.ToDouble(para.WarningValue); double failedthreshhold = Convert.ToDouble(para.FailedValue); MonitorItem mi; int id = 0; ASecurityGroup g = this.SecurityPortfolio.BondHoldings; if (g.SecurityList == null || g.SecurityList.Count == 0) { return; } foreach (ASecurity s in g.SecurityList) { mi = new MonitorItem(); mi.code = s.Code; mi.name = s.Name; mi.title = title; mi.order = order; mi.securityid = id++; mi.status = Status.Pass; DateTime intPayment = ((Bond)s).IntNextPaymentDate; double remainingdays = (intPayment - DateTime.Today).Days; mi.value = remainingdays.ToString() + "天"; description = C_Desc_BondIntPayment.Replace("<1>", s.Name + "(" + s.Code + ")").Replace("<OP>", getOperatorName(para.Operator)); switch (s.Type) { case SecurityType.Bond: if (this.compareValue(para.Operator, remainingdays, failedthreshhold)) { //检查fail放在前 // 确保当failthreshhold=warningthreshhold时,显示fail mi.threshhold = failedthreshhold.ToString("N0") + "天"; mi.status = Status.Fail; mi.description = description.Replace("<2>", intPayment.ToString("yyyy-MM-dd")).Replace("<3>", failedthreshhold + "天"); } else if (this.compareValue(para.Operator, remainingdays, warningthreshhold)) { mi.threshhold = warningthreshhold.ToString("N0") + "天"; mi.status = Status.Warning; mi.description = description.Replace("<2>", intPayment.ToString("yyyy-MM-dd")).Replace("<3>", warningthreshhold + "天"); } else { mi.threshhold = warningthreshhold.ToString("N0") + "天"; mi.status = Status.Pass; mi.description = ""; } break; default: //对于非债券类型,无需作错误提示,会在其他步骤中检验 break; } this.Report.Add(mi); } }
/// <summary> /// 检查债券评级 /// </summary> protected virtual void CheckBondRating(CheckParameter para) { string title = C_Title_BondRating; string description; int order = C_Order_SecurityType; string failthreshhold = para.FailedValue.ToString(); string warningthreshhold = para.WarningValue.ToString(); int failRating = Bond.ConvertCreditRating(failthreshhold); int warnRating = Bond.ConvertCreditRating(warningthreshhold); MonitorItem mi; int id = 0; ASecurityGroup g = this.SecurityPortfolio.BondHoldings; if (g.SecurityList == null || g.SecurityList.Count == 0) { return; } foreach (ASecurity s in g.SecurityList) { mi = new MonitorItem(); mi.code = s.Code; mi.name = s.Name; mi.title = title; mi.order = order; mi.securityid = id++; mi.status = Status.Pass; mi.value = ((Bond)s).CreditRate; switch (((Bond)s).SubType) { case BondType.Treasury: case BondType.Central: case BondType.SpecialFinancial: mi.value = "AAA"; break; default: break; } description = C_Desc_BondRating.Replace("<1>", s.Name + "(" + s.Code + ")").Replace("<OP>", getOperatorName(para.Operator)); switch (s.Type) { case SecurityType.Bond: int currRating = Bond.ConvertCreditRating(mi.value); if (this.compareValue(para.Operator, currRating, failRating)) { //检查fail放在前 // 确保当failthreshhold=warningthreshhold时,显示fail mi.threshhold = failthreshhold; mi.status = Status.Fail; mi.description = description.Replace("<2>", mi.value).Replace("<3>", failthreshhold); Debug.WriteLine(mi.description); } else if (this.compareValue(para.Operator, currRating, warnRating)) { mi.threshhold = warningthreshhold; mi.status = Status.Warning; mi.description = description.Replace("<2>", mi.value).Replace("<3>", warningthreshhold); } else { mi.threshhold = warningthreshhold; mi.status = Status.Pass; mi.description = ""; } break; default: //对于非债券类型,无需作错误提示,会在其他步骤中检验 break; } this.Report.Add(mi); } }
/// <summary> /// 检查同一公司发行的债券持仓占比 /// </summary> protected virtual void CheckBondGroupPositionPct(CheckParameter para) { int order = C_Order_BondGroupPositionPct;; string title = C_Title_BondGroupPositionPct; string description; double warningthreshhold = Convert.ToDouble(para.WarningValue); double failedthreshhold = Convert.ToDouble(para.FailedValue); MonitorItem mi; ASecurityGroup g = this.SecurityPortfolio.BondHoldings; if (g.SecurityList == null || g.SecurityList.Count == 0) { return; } List <BondGroup.CompanyView> companylist = ((BondGroup)g).GetCompanyPositions(); int id = 0; foreach (BondGroup.CompanyView cv in companylist) { //当前公司仅有一个债券被持有,不做检验 if (cv.CompanyNumber == 1) { id++; continue; } mi = new MonitorItem(); mi.order = order; mi.title = title; mi.securityid = id++; mi.status = Status.Pass; mi.value = cv.TotalPosition.MarketValuePct.ToString("P2"); mi.name = cv.CompanyName; mi.code = ""; string allcodes = ""; foreach (PositionInfo p in cv.RelatedPositionList) { allcodes += p.Name + "(" + p.Code + "),"; } allcodes = allcodes.Substring(0, allcodes.Length - 1); description = C_Desc_BondGroupPositionPct.Replace("<1>", mi.name).Replace("<2>", allcodes).Replace("<OP>", getOperatorName(para.Operator)); if (this.compareValue(para.Operator, cv.TotalPosition.MarketValuePct, failedthreshhold)) { //检查fail放在前 // 确保当failthreshhold=warningthreshhold时,显示fail mi.threshhold = failedthreshhold.ToString("P2"); mi.status = Status.Fail; mi.description = description.Replace("<3>", cv.TotalPosition.MarketValuePct.ToString("P2")).Replace("<4>", failedthreshhold.ToString("P2")); } else if (this.compareValue(para.Operator, cv.TotalPosition.MarketValuePct, warningthreshhold)) { mi.threshhold = warningthreshhold.ToString("P2"); mi.status = Status.Warning; mi.description = description.Replace("<3>", cv.TotalPosition.MarketValuePct.ToString("P2")).Replace("<4>", warningthreshhold.ToString("P2")); } else { mi.threshhold = warningthreshhold.ToString("P2"); mi.status = Status.Pass; mi.description = ""; } this.Report.Add(mi); } }
/// <summary> /// 检查现金存款占比 /// </summary> protected virtual void CheckCashPct(CheckParameter para) { string title = C_Title_CashPct; string description = "";; int order = C_Order_CashPct; double warningthreshhold = Convert.ToDouble(para.WarningValue); double failedthreshhold = Convert.ToDouble(para.FailedValue); MonitorItem mi; int id = 0; ASecurityGroup g = this.SecurityPortfolio.CashHoldings; if (g.SecurityList == null || g.SecurityList.Count == 0) { return; } foreach (ASecurity s in g.SecurityList) { //仅检查活期存款 if (s.Code != Deposit.C_Code_CurrentDeposit) { continue; } mi = new MonitorItem(); mi.code = s.Code; mi.name = s.Name; mi.title = title; mi.order = order; mi.securityid = id++; mi.status = Status.Pass; mi.value = s.Position.MarketValuePct.ToString("P2"); description = C_Desc_CashPct.Replace("<OP>", getOperatorName(para.Operator)); if (this.compareValue(para.Operator, s.Position.MarketValuePct, failedthreshhold)) { //检查fail放在前 // 确保当failthreshhold=warningthreshhold时,显示fail mi.threshhold = failedthreshhold.ToString("P2"); mi.status = Status.Fail; mi.description = description.Replace("<1>", mi.value).Replace("<2>", mi.threshhold); } else if (this.compareValue(para.Operator, s.Position.MarketValuePct, warningthreshhold)) { mi.threshhold = warningthreshhold.ToString("P2"); mi.status = Status.Warning; mi.description = description.Replace("<1>", mi.value).Replace("<2>", mi.threshhold); } else { mi.threshhold = warningthreshhold.ToString("P2"); mi.status = Status.Pass; mi.description = ""; } this.Report.Add(mi); } }
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); }