예제 #1
0
        /// <summary>
        /// 根据指定的日期,获取当日的成分股列表
        /// </summary>
        /// <param name="date"></param>
        /// <returns></returns>
        static public List <stockFormat> getConstituentStock(int date)
        {
            List <stockFormat> list = new List <stockFormat>();

            foreach (var item in stockList)
            {
                stockFormat stock = item.Value;
                for (int i = 0; i < stock.existsDate.Count(); i = i + 2)
                {
                    if (date >= stock.existsDate[i] && date <= stock.existsDate[i + 1])
                    {
                        list.Add(stock);
                    }
                }
            }
            return(list);
        }
예제 #2
0
        /// <summary>
        /// 根据程序运行日期,获取截止至昨日的指数成分股的列表
        /// </summary>
        /// <returns>指数成分股列表</returns>
        private Dictionary <string, stockFormat> getExitsStocks()
        {
            Dictionary <string, stockFormat> list = new Dictionary <string, stockFormat>();
            int yesterday = TradeDays.GetPreviousTradeDay(Convert.ToInt32(DateTime.Now.ToString("yyyyMMdd")));

            foreach (int day in myTradeDays.myTradeDays)
            {
                string todayStr = DateTime.ParseExact(day.ToString(), "yyyyMMdd", null).ToString("yyyy-MM-dd");

                if (day <= yesterday)
                {
                    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++)
                    {
                        stockFormat myStock = new stockFormat();
                        myStock.code = Convert.ToString(stockList[i * 3 + 1]);
                        myStock.name = (string)stockList[i * 3 + 2];
                        if (list.ContainsKey(myStock.code) == false)
                        {
                            myStock.existsDate = new List <int>();
                            myStock.existsDate.Add(day);
                            myStock.existsDate.Add(day);
                            list.Add(myStock.code, myStock);
                        }
                        else
                        {
                            int enterDate = list[myStock.code].existsDate[list[myStock.code].existsDate.Count() - 2];
                            int quitDate  = list[myStock.code].existsDate[list[myStock.code].existsDate.Count() - 1];
                            if (day > TradeDays.GetNextTradeDay(quitDate))
                            {
                                list[myStock.code].existsDate.Add(day);
                                list[myStock.code].existsDate.Add(day);
                            }
                            else
                            {
                                list[myStock.code].existsDate[list[myStock.code].existsDate.Count() - 1] = day;
                            }
                        }
                    }
                }
            }
            //若计算时间不包括历史时间,必须读取昨日的数据作为基准
            if (list.Count == 0)
            {
                string   yesterdayStr = DateTime.ParseExact(yesterday.ToString(), "yyyyMMdd", null).ToString("yyyy-MM-dd"); List <stockFormat> myList = new List <stockFormat>();
                WindData wd        = w.wset("sectorconstituent", "date=" + yesterdayStr + ";windcode=" + indexName);
                object[] stockList = wd.data as object[];
                int      num       = stockList.Length / 3;
                for (int i = 0; i < num; i++)
                {
                    stockFormat myStock = new stockFormat();
                    myStock.code       = Convert.ToString(stockList[i * 3 + 1]).Substring(0, 6);
                    myStock.name       = (string)stockList[i * 3 + 2];
                    myStock.existsDate = new List <int>();
                    myStock.existsDate.Add(yesterday);
                    myStock.existsDate.Add(yesterday);
                }
            }
            //从stockModify.csv中读取指数成分股变动股票和日期
            DataTable dt = CsvApplication.OpenCSV("stockModify.csv");
            SortedDictionary <int, List <stockModify> > stockModifyList = new SortedDictionary <int, List <stockModify> >();

            for (int i = 0; i < dt.Rows.Count; i++)
            {
                stockModify stock = new stockModify();
                stock.code      = dt.Rows[i][0].ToString();
                stock.name      = dt.Rows[i][1].ToString();
                stock.date      = Convert.ToInt32(dt.Rows[i][2].ToString());
                stock.direction = dt.Rows[i][3].ToString();
                if (stockModifyList.ContainsKey(stock.date))
                {
                    stockModifyList[stock.date].Add(stock);
                }
                else
                {
                    List <stockModify> stockList0 = new List <stockModify>();
                    stockList0.Add(stock);
                    stockModifyList.Add(stock.date, stockList0);
                }
            }
            //根据文档对我的数据进行处理,如果变动时间大于昨日时间,需要对我的股票列表进行修正
            int maxDate = yesterday;

            foreach (var stockList in stockModifyList)
            {
                if (stockList.Value[0].date > yesterday)
                {
                    foreach (var stock in stockList.Value)
                    {
                        if (stock.direction == "out")
                        {
                            if (list.ContainsKey(stock.code) == true)
                            {
                                list[stock.code].existsDate[list[stock.code].existsDate.Count() - 1] = stock.date;
                            }
                        }
                        if (stock.direction == "in")
                        {
                            if (stockList.Value[0].date > maxDate)
                            {
                                maxDate = stockList.Value[0].date;
                            }
                            if (list.ContainsKey(stock.code) == true)
                            {
                                list[stock.code].existsDate.Add(stock.date);
                                list[stock.code].existsDate.Add(stock.date);
                            }
                            else
                            {
                                stockFormat myStock = new stockFormat();
                                myStock.name       = stock.name;
                                myStock.code       = stock.code;
                                myStock.existsDate = new List <int>();
                                myStock.existsDate.Add(stock.date);
                                myStock.existsDate.Add(stock.date);
                            }
                        }
                    }
                }
            }

            //按照回测日期给股票列表进行修正
            foreach (var stock in list)
            {
                if (stock.Value.existsDate[stock.Value.existsDate.Count() - 1] == yesterday || stock.Value.existsDate[stock.Value.existsDate.Count() - 1] == maxDate)
                {
                    stock.Value.existsDate[stock.Value.existsDate.Count() - 1] = endDate;
                }
            }
            return(list);
        }