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