Beispiel #1
0
 /// <summary>
 /// 用BPNN预测股票
 /// </summary>
 public void BPNNForecastStock(DateTime date)
 {
     try
     {
         var net      = JsonHelper.DeserializeJsonToObject <BPNN>(File.ReadAllText(DataHelper.GetConfig("networkPath")));
         var todayStr = date.ToString("yyyy-MM-dd");
         proc.deleteStockForeCast(todayStr);
         StockPointCompute spc            = new StockPointCompute();
         DataTable         stockIndexCode = proc.getStockIndexCode(todayStr);
         foreach (DataRow dr in stockIndexCode.Rows)
         {
             string        stockCode = dr[0].ToString();
             DataTable     res       = proc.getStockMatchedIndex(todayStr, stockCode);
             List <double> features  = new List <double>();
             foreach (DataRow row in res.Rows)
             {
                 features.Add(Convert.ToDouble(row[1]));
             }
             double result = net.forecast(ref net, features.ToArray())[0];
             proc.insertStockForeCast(stockCode, todayStr, result);
         }
     }
     catch (Exception ex)
     {
         LogHelper.WriteLog("预测股票失败", ex);
     }
 }
Beispiel #2
0
        /// <summary>
        /// 计算股票指标
        /// </summary>
        /// <param name="startDate">开始时间</param>
        /// <param name="endDate">结束时间ps:日期跨度要满足指标分析算法需求</param>
        /// <param name="stockCode">股票代码</param>
        /// <returns></returns>
        private List <StockMatchedIndex> GetStockIndex(string startDate, string endDate, string stockCode)
        {
            List <StockMatchedIndex> result = new List <StockMatchedIndex>();
            DataTable dt = proc.getStockHistoryData(startDate, endDate, stockCode);
            List <StockHistoryData> data = Utility.XHelper.FillListByDataTable <StockHistoryData>(dt);

            #region 检测数据
            if (data == null || data.Count == 0 || data.Count < 45 || Convert.ToDateTime(data[0].StockHistoryDate) != Convert.ToDateTime(endDate))
            {
                return(result);
            }
            int suspended = 0;
            foreach (var item in data)
            {
                // 成交量为零,停牌超过10个交易日
                if (item.SVolume == 0)
                {
                    suspended++;
                    if (suspended > 5)
                    {
                        result.Add(new StockMatchedIndex()
                        {
                            Date = Convert.ToDateTime(endDate), StockCode = stockCode, StockIndexID = SpacialShape.Suspended, StockMatchedIndexID = Guid.NewGuid()
                        });
                        return(result);
                    }
                }
                // 涨跌超过10%,事件
                else if (Math.Abs((item.SClose - item.SOpen) / item.SOpen) > 0.11M)
                {
                    result.Add(new StockMatchedIndex()
                    {
                        Date = Convert.ToDateTime(endDate), StockCode = stockCode, StockIndexID = SpacialShape.Event, StockMatchedIndexID = Guid.NewGuid()
                    });
                    return(result);
                }
            }
            #endregion
            data = data.Where(w => w.SVolume > 0).ToList();
            if (data.Count < 45)
            {
                return(result);
            }
            #region 计算指标
            try
            {
                StockPointCompute spc = new StockPointCompute();
                result.AddRange(getStockMatchedIndex(endDate, stockCode, spc.Index_KDJ(data)));
                result.AddRange(getStockMatchedIndex(endDate, stockCode, spc.Index_LineEqual(data)));
                result.AddRange(getStockMatchedIndex(endDate, stockCode, spc.Index_LineK(data)));
                result.AddRange(getStockMatchedIndex(endDate, stockCode, spc.Index_PSY(data)));
                result.AddRange(getStockMatchedIndex(endDate, stockCode, spc.Index_VR(data)));
                result.AddRange(getStockMatchedIndex(endDate, stockCode, spc.Index_W_R(data)));
            }
            catch (Exception ex)
            {
                LogHelper.WriteLog(string.Format("计算指标失败 startDate:{0},endDate:{1},stockCode:{2}", startDate, endDate, stockCode), ex);
            }
            #endregion
            return(result.Where(w => w.StockIndexID % 100 != 0).ToList());
        }
Beispiel #3
0
        /// <summary>
        ///
        /// </summary>
        /// <param name="date"></param>
        /// <param name="takeN"></param>
        /// <param name="closeWeight"></param>
        /// <param name="upperShadowWeight"></param>
        /// <param name="lowerShadowWeight"></param>
        /// <param name="entityWeight"></param>
        /// <param name="topN"></param>
        /// <returns></returns>
        public List <String> getSimilarPlate(DateTime date, int takeN, double closeWeight, double upperShadowWeight, double lowerShadowWeight, double entityWeight, int topN)
        {
            WangYiStockApi    wysa = new WangYiStockApi();
            StockPointCompute spc  = new StockPointCompute();
            var ssPlate            = wysa.getDataFromWangYi("000001.ss", date.AddYears(-5), date).Where(w => w.SVolume > 0).OrderBy(o => o.StockHistoryDate);
            var szPlate            = wysa.getDataFromWangYi("399001.sz", date.AddYears(-5), date).Where(w => w.SVolume > 0).OrderBy(o => o.StockHistoryDate);

            if (Convert.ToDateTime(ssPlate.ToList()[ssPlate.Count() - 1].StockHistoryDate) != date)
            {
                return(null);
            }
            Dictionary <string, decimal> meanClose = new Dictionary <string, decimal>();
            Dictionary <string, decimal> meanOpen  = new Dictionary <string, decimal>();
            Dictionary <string, decimal> meanHigh  = new Dictionary <string, decimal>();
            Dictionary <string, decimal> meanLow   = new Dictionary <string, decimal>();

            foreach (var i in ssPlate)
            {
                foreach (var j in szPlate)
                {
                    if (i.StockHistoryDate == j.StockHistoryDate)
                    {
                        meanClose.Add(i.StockHistoryDate, i.SClose + j.SClose);
                        meanOpen.Add(i.StockHistoryDate, i.SOpen + j.SOpen);
                        meanHigh.Add(i.StockHistoryDate, i.SHigh + j.SHigh);
                        meanLow.Add(i.StockHistoryDate, i.SLow + j.SLow);
                        break;
                    }
                }
            }
            var           meanCloseRise = spc.GetIncrease(meanClose.Values.ToList());
            List <double> upperShadow   = new List <double>();
            List <double> lowerShadow   = new List <double>();
            List <double> entity        = new List <double>();

            for (int i = 1; i < meanClose.Count; i++)
            {
                var low   = meanLow.Values.ToList()[i];
                var high  = meanHigh.Values.ToList()[i];
                var open  = meanOpen.Values.ToList()[i];
                var close = meanClose.Values.ToList()[i];
                upperShadow.Add((double)(high - (open > close ? open : close)) / (double)(high - low));
                entity.Add((double)Math.Abs(close - open) / (double)(high - low));
                lowerShadow.Add((double)((open < close ? open : close) - low) / (double)(high - low));
            }
            var closeRise        = meanCloseRise.Skip(meanCloseRise.Count - takeN).ToList();
            var upperSw          = upperShadow.Skip(upperShadow.Count - takeN).ToList();
            var lowerSw          = lowerShadow.Skip(lowerShadow.Count - takeN).ToList();
            var ey               = entity.Skip(entity.Count - takeN).ToList();
            var closeRiseArray   = spc.spiltArray(meanCloseRise, takeN);
            var upperShadowArray = spc.spiltArray(upperShadow, takeN);
            var lowerShadowArray = spc.spiltArray(lowerShadow, takeN);
            var entityArray      = spc.spiltArray(entity, takeN);
            Dictionary <string, double> resultDic = new Dictionary <string, double>();

            for (int i = 1; i < meanClose.Count - 6; i++)
            {
                double distanceClose   = DataHelper.ListDistance(closeRise, closeRiseArray[i]);
                double distanceUpperSw = DataHelper.ListDistance(upperSw, upperShadowArray[i]);
                double distanceLowerSw = DataHelper.ListDistance(lowerSw, lowerShadowArray[i]);
                double distanceEntity  = DataHelper.ListDistance(ey, entityArray[i]);
                resultDic.Add(meanClose.Keys.ToList()[i], distanceClose * closeWeight + distanceEntity * entityWeight + distanceLowerSw * lowerShadowWeight + distanceUpperSw * upperShadowWeight);
            }
            return(resultDic.OrderBy(o => o.Value).Take(topN).Select(s => s.Key).ToList());
        }