Beispiel #1
0
        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);
        }
Beispiel #2
0
        /// <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;
            }
        }
Beispiel #3
0
        /// <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);
            }
        }
Beispiel #4
0
        /// <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);
            }
        }
Beispiel #5
0
        /// <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);
            }
        }
Beispiel #6
0
        /// <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);
            }
        }
Beispiel #7
0
        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);
        }