예제 #1
0
        private void updateFundNAV(DataSet ds, SeriesNetAssetValue navs)
        {
            DataRow[] rows = ds.Tables[0].Select("SYMBOL='" + navs.Code + "'");
            if (rows.Length > 0)
            {
                //基本信息
                navs.DataSource = this.DataSource;
                navs.OriginalTimeSeries.Clear();

                foreach (DataRow row in rows)
                {
                    NetAssetValue nav = new NetAssetValue();
                    nav.TradeDate    = DataManager.ConvertToDate(row[C_ColName_PublishDate]);
                    nav.UnitNAV      = DataManager.ConvertToDouble(row[C_ColName_UnitNAV]);
                    nav.AccumUnitNAV = DataManager.ConvertToDouble(row[C_ColName_AccumUnitNAV]);
                    //复权系数
                    navs.OriginalTimeSeries.Add(nav);
                }

                //交易日校验,复权并计算涨跌幅
                navs.Adjust();
            }
            else
            {
                MessageManager.GetInstance().AddMessage(MessageType.Warning, Message.C_Msg_MF4, navs.Code);
            }
        }
예제 #2
0
        public override void Calculate()
        {
            //====================
            //计算涨跌幅: 时间序列全部降序排列
            //====================
            if (base.AdjustedTimeSeries == null || base.AdjustedTimeSeries.Count == 0)
            {
                return;
            }

            double   nav0 = 1, nav1 = 1;
            DateTime dt0 = DateTime.Today, dt1 = DateTime.Today;

            for (int i = 0; i < this.AdjustedTimeSeries.Count; i++)
            {
                NetAssetValue item = (NetAssetValue)this.AdjustedTimeSeries[i];
                if ((i + 1) < this.AdjustedTimeSeries.Count)
                {
                    item.UpAndDown.KLineDay1 = item.AccumUnitNAV / ((NetAssetValue)this.AdjustedTimeSeries[i + 1]).AccumUnitNAV - 1;
                }
                if ((i + 2) < this.AdjustedTimeSeries.Count)
                {
                    item.UpAndDown.KLineDay2 = item.AccumUnitNAV / ((NetAssetValue)this.AdjustedTimeSeries[i + 2]).AccumUnitNAV - 1;
                }
                if ((i + 3) < this.AdjustedTimeSeries.Count)
                {
                    item.UpAndDown.KLineDay3 = item.AccumUnitNAV / ((NetAssetValue)this.AdjustedTimeSeries[i + 3]).AccumUnitNAV - 1;
                }
                if ((i + 4) < this.AdjustedTimeSeries.Count)
                {
                    item.UpAndDown.KLineDay4 = item.AccumUnitNAV / ((NetAssetValue)this.AdjustedTimeSeries[i + 4]).AccumUnitNAV - 1;
                }
                if ((i + 5) < this.AdjustedTimeSeries.Count)
                {
                    item.UpAndDown.KLineDay5 = item.AccumUnitNAV / ((NetAssetValue)this.AdjustedTimeSeries[i + 5]).AccumUnitNAV - 1;
                }
                if ((i + 10) < this.AdjustedTimeSeries.Count)
                {
                    item.UpAndDown.KLineDay10 = item.AccumUnitNAV / ((NetAssetValue)this.AdjustedTimeSeries[i + 10]).AccumUnitNAV - 1;
                }
                if ((i + 20) < this.AdjustedTimeSeries.Count)
                {
                    item.UpAndDown.KLineDay20 = item.AccumUnitNAV / ((NetAssetValue)this.AdjustedTimeSeries[i + 20]).AccumUnitNAV - 1;
                }

                //期末值
                if (i == 0)
                {
                    nav1 = item.AccumUnitNAV;
                    dt1  = item.TradeDate;
                }
                //期初值
                if (item.TradeDate >= base.TimeSeriesStart)
                {
                    nav0 = item.AccumUnitNAV;
                    dt0  = item.TradeDate;
                }
            }

            //持有期收益率
            base.HoldingPeriodInfo   = nav0.ToString("N4") + "[" + dt0.ToString("yyyy-MM-dd") + "]-" + nav1.ToString("N4") + "[" + dt1.ToString("yyyy-MM-dd") + "]";
            base.HoldingPeriodReturn = nav1 / nav0 - 1;
        }
예제 #3
0
        public MutualFund GetWholeFund()
        {
            if (base.SecurityHoldings == null || base.SecurityHoldings.Count == 0)
            {
                return(null);
            }

            WholeFund      = new MutualFund("");
            WholeFund.Name = "基金组中包含的所有基金组成的整体";
            WholeFund.SetDatePeriod(base.TimeSeriesStart, base.TimeSeriesEnd);

            #region 构造整体基金的累计净值序列
            //==========================
            //计算公式:
            //  NAVw = Sum(NAVi * SHAREi)/Sum(SHAREi)
            //==========================
            try
            {
                WholeFund.TradingNAV.TradingDates       = ((MutualFund)base.SecurityHoldings[0]).TradingNAV.TradingDates;
                WholeFund.TradingNAV.InsideSampleLength = ((MutualFund)base.SecurityHoldings[0]).TradingNAV.InsideSampleLength;
                WholeFund.TradingNAV.AdjustedTimeSeries = new List <ATimeItem>();
                WholeFund.FundReport.AdjustedTimeSeries = new List <ATimeItem>();

                //计算净值
                for (int i = 0; i < WholeFund.TradingNAV.TradingDates.Count; i++)
                {
                    NetAssetValue NAVw = new NetAssetValue();
                    NAVw.TradeDate = WholeFund.TradingNAV.TradingDates[i];
                    NAVw.IsTrading = true;

                    MutualFundReport RPTw = new MutualFundReport();
                    RPTw.TradeDate  = NAVw.TradeDate;
                    RPTw.ReportDate = new DateTime(1900, 1, 1);
                    RPTw.IsTrading  = true;

                    //SecurityHoldings[0]的时间序列可能不够长,不能在此处使用
                    //NAVw.IsOutsideSamplePeriod = ((MutualFund)base.SecurityHoldings[0]).TradingNAV.AdjustedTimeSeries[i].IsOutsideSamplePeriod;

                    foreach (MutualFund f in base.SecurityHoldings)
                    {
                        if (f.TradingNAV.AdjustedTimeSeries == null || f.FundReport.AdjustedTimeSeries == null ||
                            i >= f.TradingNAV.AdjustedTimeSeries.Count || i >= f.FundReport.AdjustedTimeSeries.Count)
                        {
                            continue;
                        }

                        NAVw.IsOutsideSamplePeriod = f.TradingNAV.AdjustedTimeSeries[i].IsOutsideSamplePeriod;
                        RPTw.IsOutsideSamplePeriod = NAVw.IsOutsideSamplePeriod;

                        //成立不足30天的去除
                        if (f.ListedDate.AddDays(30) > WholeFund.TradingNAV.TradingDates[i])
                        {
                            continue;
                        }

                        //计算净值 和 资产配置
                        NetAssetValue    NAVi = (NetAssetValue)f.TradingNAV.AdjustedTimeSeries[i];
                        MutualFundReport RPTi = (MutualFundReport)f.FundReport.AdjustedTimeSeries[i];
                        NAVw.UnitNAV    += NAVi.UnitNAV * RPTi.TotalShare;
                        RPTw.TotalShare += RPTi.TotalShare;

                        if (RPTw.ReportDate < RPTi.ReportDate)
                        {
                            RPTw.ReportDate = RPTi.ReportDate;
                        }

                        RPTw.TotalEquityAsset     += RPTi.TotalEquityAsset;
                        RPTw.TotalBondAsset       += RPTi.TotalBondAsset;
                        RPTw.TotalNetAsset        += RPTi.TotalNetAsset;
                        RPTw.PureBondAsset        += RPTi.PureBondAsset;
                        RPTw.ConvertableBondAsset += RPTi.ConvertableBondAsset;
                    }

                    NAVw.UnitNAV      = NAVw.UnitNAV / RPTw.TotalShare;
                    NAVw.AccumUnitNAV = NAVw.UnitNAV;
                    WholeFund.TradingNAV.AdjustedTimeSeries.Add(NAVw);
                    WholeFund.FundReport.AdjustedTimeSeries.Add(RPTw);
                }

                //计算净值收益率
                WholeFund.TradingNAV.Calculate();
                WholeFund.FundReport.Calculate();
            }
            catch (Exception ex)
            {
                throw new Exception(Message.C_Msg_MF11, ex);
            }
            #endregion

            return(WholeFund);
        }