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); } }
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; }
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); }