public async Task <ManagerResult <EquityGroup> > Save(EquityGroup equityGroup) { ManagerResult <EquityGroup> mgrResult = new ManagerResult <EquityGroup>(); try { if (equityGroup.Id == Guid.Empty) { using NpgsqlConnection db = new NpgsqlConnection(connString); { await db.InsertAsync(equityGroup); } } else { using NpgsqlConnection db = new NpgsqlConnection(connString); { await db.UpdateAsync(equityGroup); } } mgrResult.Entity = equityGroup; } catch (Exception ex) { mgrResult.Exception = ex; } return(mgrResult); }
public static async Task<string[]> GetEquityGroupAsync(EquityGroup group) { if (group == EquityGroup.SP500) { HttpClient hc = new HttpClient(); HttpResponseMessage hrm = await hc.GetAsync("https://en.wikipedia.org/wiki/List_of_S%26P_500_companies"); string content = await hrm.Content.ReadAsStringAsync(); int loc1 = 0; int loc2 = 0; List<string> Splitter = new List<string>(); loc1 = content.IndexOf("<table class="); loc1 = content.IndexOf("<tbody>", loc1 + 1); loc2 = content.IndexOf("</tbody>", loc1 + 1); string tablecontent = content.Substring(loc1, loc2 - loc1 - 1); //Split into rows Splitter.Clear(); Splitter.Add("<tr>"); string[] rows = tablecontent.Split(Splitter.ToArray(), StringSplitOptions.None); Splitter.Clear(); //Extract the symbol from each row List<string> StockSymbols = new List<string>(); int t = 0; for (t = 2; t < rows.Length; t++) { Splitter.Add("<td>"); string[] cols = rows[t].Split(Splitter.ToArray(), StringSplitOptions.None); loc1 = cols[1].IndexOf(">"); loc2 = cols[1].IndexOf("<", loc1 + 1); string symbol = cols[1].Substring(loc1 + 1, loc2 - loc1 - 1); StockSymbols.Add(symbol); } return StockSymbols.ToArray(); } else { throw new Exception("Method for collecting stock grouping '" + group.ToString() + "' does not exist."); } }
public async Task <ManagerResult <bool> > RemoveEquity(EquityGroup sysmbolGroup, Guid equitylId) { ManagerResult <bool> mgrResult = new ManagerResult <bool>(); try { var equityGroupItem = new EquityGroupItem(); equityGroupItem.GroupId = sysmbolGroup.Id; equityGroupItem.EquityId = equitylId; using NpgsqlConnection db = new NpgsqlConnection(connString); { mgrResult.Entity = await db.DeleteAsync(equityGroupItem); } } catch (Exception ex) { mgrResult.Exception = ex; } return(mgrResult); }
public async Task <ManagerResult <EquityGroupItem> > AddEquity(EquityGroup equityGroup, Guid equityId) { ManagerResult <EquityGroupItem> mgrResult = new ManagerResult <EquityGroupItem>(); EquityGroupItem equityGroupItem = new EquityGroupItem(); try { equityGroupItem.GroupId = equityGroup.Id; equityGroupItem.EquityId = equityId; using (NpgsqlConnection db = new NpgsqlConnection(connString)) { await db.InsertAsync(equityGroupItem); } mgrResult.Entity = equityGroupItem; } catch (Exception ex) { mgrResult.Exception = ex; } return(mgrResult); }
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); }