private void GetStockList() { TradeDays myTradeDays = new TradeDays(20130601, 20160626); int[] changeDate = new int[7] { 20130628, 20131213, 20140613, 20141212, 20150612, 20151211, 20160608 }; w.start(); foreach (int date in changeDate) { int today = date; int tomorrow = TradeDays.GetNextTradeDay(date); string todayStr = DateTime.ParseExact(today.ToString(), "yyyyMMdd", null).ToString("yyyy-MM-dd"); string tomorrowStr = DateTime.ParseExact(tomorrow.ToString(), "yyyyMMdd", null).ToString("yyyy-MM-dd"); List <string> todayList = new List <string>(); List <string> tomorrowList = new List <string>(); List <string> stockIn = new List <string>(); List <string> stockOut = new List <string>(); WindData wd = w.wset("sectorconstituent", "date=" + todayStr + ";windcode=" + indexName); object[] stockList = wd.data as object[]; int num = stockList.Length / 3; for (int i = 0; i < num; i++) { todayList.Add(Convert.ToString(stockList[i * 3 + 1])); } wd = w.wset("sectorconstituent", "date=" + tomorrowStr + ";windcode=" + indexName); stockList = wd.data as object[]; num = stockList.Length / 3; for (int i = 0; i < num; i++) { tomorrowList.Add(Convert.ToString(stockList[i * 3 + 1])); } foreach (string code in tomorrowList) { if (todayList.Contains(code) == false) { stockIn.Add(code); } } foreach (string code in todayList) { if (tomorrowList.Contains(code) == false) { stockOut.Add(code); } } stockModifyList myList = new stockModifyList(today, stockIn, stockOut); changeList.Add(today, myList); } }
private void computePosition(int startDate, int endDate) { foreach (var item in changeList) { if (item.Key < startDate || item.Key > endDate) { continue; } SortedDictionary <string, List <stockChangeFormat> > stockChangeList = new SortedDictionary <string, List <stockChangeFormat> >(); SortedDictionary <string, SortedDictionary <int, stockDataFormat[]> > stockDataList = new SortedDictionary <string, SortedDictionary <int, stockDataFormat[]> >(); int date = item.Key; stockModifyList list = item.Value; List <stockPosition> stockList = new List <stockPosition>(); int firstDate = Math.Max(TradeDays.GetNTradeDaysBefore(date, 15), startDate); int lastDate = Math.Min(TradeDays.GetNTradeDaysLater(date, 15), endDate); TradeDays myDays = new TradeDays(firstDate, lastDate); foreach (string stockIn in list.stockIn) { stockPosition stock = new stockPosition(); stock.code = stockIn; stock.position = 1; stockList.Add(stock); } foreach (string stockOut in list.stockOut) { stockPosition stock = new stockPosition(); stock.code = stockOut; stock.position = -1; stockList.Add(stock); } foreach (stockPosition stock in stockList) { GetStockBonus bonus = new GetStockBonus(stock.code, firstDate, lastDate); GetStockData data = new GetStockData(stock.code, firstDate, lastDate); stockDataList.Add(stock.code, data.stockData); stockChangeList.Add(stock.code, bonus.stockChangeList); } //先确定权重 Dictionary <string, double> weight = new Dictionary <string, double>(); foreach (int today in myDays.myTradeDays) { List <stockPosition> stockListToday = new List <stockPosition>(); foreach (stockPosition stock in stockList) { List <stockChangeFormat> myChange = stockChangeList[stock.code]; double position = stock.position; double cash = stock.cash; for (int i = 0; i < myChange.Count; i++) { if (myChange[i].date <= today && myChange[i].date > firstDate) { cash += position * myChange[i].bonus; position *= myChange[i].divisor; } } stockListToday.Add(new stockPosition(stock.code, today, position, cash)); } positionList.Add(today, stockListToday); //计算净值曲线 double[] todayNetValue = new double[14402];//一天分成14402秒 //先计算权重 if (today == firstDate) { double stockInNum = 0; double stockOutNum = 0; Dictionary <string, double> stockOpen = new Dictionary <string, double>(); foreach (stockPosition myStock in stockListToday) { if (stockDataList.ContainsKey(myStock.code) && stockDataList[myStock.code].ContainsKey(today)) { double[] data = dataModify(stockDataList[myStock.code][today]); stockOpen.Add(myStock.code, data[0]); } else { stockOpen.Add(myStock.code, 0); } } foreach (stockPosition myStock in stockListToday) { if (myStock.position > 0 && stockOpen[myStock.code] > 0) { stockInNum += 1; } if (myStock.position < 0 && stockOpen[myStock.code] > 0) { stockOutNum += 1; } } foreach (stockPosition myStock in stockListToday) { if (myStock.position > 0 && stockOpen[myStock.code] > 0) { weight.Add(myStock.code, 1.0 / stockInNum / stockOpen[myStock.code]); } if (myStock.position < 0 && stockOpen[myStock.code] > 0) { weight.Add(myStock.code, 1.0 / stockOutNum / stockOpen[myStock.code]); } } } foreach (stockPosition myStock in stockListToday) { if (weight.ContainsKey(myStock.code) == false) { continue; } stockDataFormat[] myStockData = (stockDataList.ContainsKey(myStock.code) && stockDataList[myStock.code].ContainsKey(today))? stockDataList[myStock.code][today]:new stockDataFormat[14402]; double[] data = dataModify(myStockData); for (int i = 0; i < 14402; i++) { todayNetValue[i] += (myStock.position * data[i] + myStock.cash) * weight[myStock.code]; } } netValue.Add(today, todayNetValue); } } }