private void btnOK_Click(object sender, EventArgs e) { if (tbxCsvFilePath.Text == "" || cmbPreprocess.SelectedIndex < 0 || tbxNumInputNode.Text == "" || tbxTrainingRatio.Text == "") { MessageBox.Show("Error: You must fill all required inputs!", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); return; } //1. Đọc dữ liệu từ file .csv vào mảng và tiền xử lý StockRecordBUS stockRecordBUS = new StockRecordBUS(); StockRecordDTO stockRecordDTO = stockRecordBUS.LoadData(tbxCsvFilePath.Text); double[] dblSource = new double[stockRecordDTO.Entries.Count]; int i = 0; foreach (EntryDTO entryDTO in stockRecordDTO.Entries) { dblSource[i] = entryDTO.ClosePrice; i++; } PreprocessBUS preprocessBUS = new PreprocessBUS(); #region Phần riêng if (rdPricePrediction.Checked)//Dự đoán giá { if (rdSVR.Checked)//Mô hình SVR { if (cmbPreprocess.SelectedItem.ToString() == "ScaleByMinMax") { preprocessBUS.FindMinMax(dblSource); dblSource = preprocessBUS.PreprocessByMinMax(dblSource); } } else//Mô hình ANN { if (cmbPreprocess.SelectedItem.ToString() == "ScaleByMinMax") { preprocessBUS.FindMinMax(dblSource); dblSource = preprocessBUS.PreprocessByMinMax(dblSource); } } } else//Dự đoán xu hướng { if (rdSVR.Checked)//Mô hình SVR { if (cmbPreprocess.SelectedItem.ToString() == "Return[-1,1]") { dblSource = preprocessBUS.Scale_SVR_Return(stockRecordDTO.Entries.Count, dblSource, 1, 1); } } else//Mô hình ANN { if (cmbPreprocess.SelectedItem.ToString() == "Return[-1,1]") { dblSource = preprocessBUS.Scale_SVR_Return(stockRecordDTO.Entries.Count, dblSource, 1, 1); } } } #endregion //2. Chuyển sang định dạng của LibSVM (dựa vào số node đầu vào) ConverterBUS converter = new ConverterBUS(); int iPos = tbxCsvFilePath.Text.LastIndexOf('\\'); string strFolderPath = tbxCsvFilePath.Text.Remove(iPos+1); string strTotalFile = strFolderPath + stockRecordDTO.ID + ".txt"; int iNumInputNode = Convert.ToInt32(tbxNumInputNode.Text); int numDaysPredicted = 1; int iNumLine = 0; if (cmbPreprocess.SelectedItem.ToString() == "Return[-1,1]") { if (int.TryParse(tbxNumDaysPredicted.Text,out numDaysPredicted)) { converter.ConvertForTrend(int.Parse(tbxNumDaysPredicted.Text), iNumInputNode, dblSource, strTotalFile, out iNumLine, 2, false); } else { MessageBox.Show("Please enter a number"); return; } } else { if(ckbImproveDirection.Checked) { double dblTrainPercent = Convert.ToDouble(tbxTrainingRatio.Text); converter.ConvertWImprovedDirection(iNumInputNode, dblSource, strTotalFile, dblTrainPercent, out iNumLine); } else { converter.Convert(iNumInputNode, dblSource, strTotalFile, out iNumLine); } } //3. Từ file chứa toàn bộ dữ liệu ta phân phối vào 2 file train và test (dựa vào tỉ lệ bộ train) string strTrainFile = strFolderPath + stockRecordDTO.ID + "_" + numDaysPredicted + "_train.txt"; string strTestFile = strFolderPath + stockRecordDTO.ID + "_" + numDaysPredicted + "_test.txt"; StreamReader reader = new StreamReader(strTotalFile); StreamWriter trainWriter = new StreamWriter(strTrainFile); StreamWriter testWriter = new StreamWriter(strTestFile); //Ghi phương thức xử lý vào dòng đầu tiên của file test //Mục đích là để ta có thể chuyển về dữ liệu nguyên thủy testWriter.WriteLine(cmbPreprocess.SelectedItem.ToString() + " " + preprocessBUS.Min.ToString() + " " + preprocessBUS.Max.ToString()); double dblTrainingSetRatio = Convert.ToDouble(tbxTrainingRatio.Text); //int iBound = numDaysPredicted > iNumInputNode ? 2 * numDaysPredicted : numDaysPredicted + iNumInputNode; //int iNumLine = dblSource.Length - iBound + 1; int iDivideLine = (int)(dblTrainingSetRatio * iNumLine/100); for (i = 0; i < iDivideLine; i++) { string strLine = reader.ReadLine(); trainWriter.WriteLine(strLine); } for (; i < iNumLine; i++) { string strLine = reader.ReadLine(); testWriter.WriteLine(strLine); } testWriter.Close(); trainWriter.Close(); reader.Close(); MessageBox.Show("Finish!"); }
private void btnPredict_Click(object sender, EventArgs e) { //Ma trận với dòng thứ 1 chứa các giá trị thực và dòng thứ 2 chứa các giá trị dự đoán. double[][] dblActual_Forecast = new double[2][]; dblActual_Forecast[0] = null; dblActual_Forecast[1] = null; #region Price #region Ghi File Test //Dùng tạm số node input = 5, sau này bổ sung hàm đọc file số node input int numInputNode = 5; //Tìm ngày cần dự đoán DateTime inputDay = dtpInputDay.Value; DateTime Today = ((EntryDTO)_stockRecordDTO.Entries[_stockRecordDTO.Entries.Count - 1]).Date; int i; for (i = 0; i < _stockRecordDTO.Entries.Count - numInputNode; i++) { EntryDTO curEntry = (EntryDTO)_stockRecordDTO.Entries[i + numInputNode]; if (inputDay.Subtract(curEntry.Date).Days <= 0 && inputDay.Subtract(Today).Days <= 0) { break; } } //Ghi bộ input đầu vào cho ngày dự đoán double[] dblSource = new double[numInputNode + 1]; if (i < _stockRecordDTO.Entries.Count - numInputNode) { //1. Đọc dữ liệu vào mảng double[] dblTemp = new double[_stockRecordDTO.Entries.Count]; for (int j = 0; j < _stockRecordDTO.Entries.Count; j++) { EntryDTO curEntry = (EntryDTO)_stockRecordDTO.Entries[j]; dblTemp[j] = curEntry.ClosePrice; } for (int j = 0; j < numInputNode; j++) { EntryDTO curEntry = (EntryDTO)_stockRecordDTO.Entries[i + j]; dblSource[j] = curEntry.ClosePrice; } PreprocessBUS preprocessBUS = new PreprocessBUS(); preprocessBUS.FindMinMax(dblTemp); dblSource = preprocessBUS.PreprocessByMinMax(dblSource); //2. Tạo file test. File test này chỉ có 2 dòng: //+Dòng 1: Chứa thông tin tiền xử lý //+Dòng 2: Giống như 1 dòng của file training, nhưng giá trị đích không biết (để bằng 0) StreamWriter writer = new StreamWriter(@"TestPrice.txt"); writer.WriteLine("ScaleByMinMax " + preprocessBUS.Min.ToString() + " " + preprocessBUS.Max.ToString()); string strLine = "0 "; for (int j = 0; j < numInputNode; j++) { strLine += (j + 1).ToString() + ":" + dblSource[j].ToString() + " "; } writer.WriteLine(strLine); writer.Close(); } else { MessageBox.Show("Error: Invalid input!"); } #endregion #region Dự đoán ANN ANNModelBUS.AnnModelFile = @"AppModel\ANNPrice\" + cmbStockID.SelectedItem.ToString() + "_1_model.txt"; ANNParameterBUS.LoadParameter(); ANNPredictBUS annPredict = new ANNPredictBUS(); annPredict.LoadDataSet(@"TestPrice.txt"); dblActual_Forecast = annPredict.MainProcess(); pricePredict = dblActual_Forecast[1][0]; tbxANNPrice.Text = Math.Round(dblActual_Forecast[1][0], 2).ToString(); #endregion string[] strArgs = new string[3]; strArgs[0] = @"TestPrice.txt"; strArgs[1] = @"AppModel\SVRPrice\" + cmbStockID.SelectedItem.ToString() + "_1_model.txt"; strArgs[2] = "price_predicted.txt"; dblActual_Forecast = svm_predict.MainProcess(strArgs); tbxSVMPrice.Text = Math.Round(dblActual_Forecast[1][0], 2).ToString(); #endregion #region Trend //Dùng tạm số node input = 5, sau này bổ sung hàm đọc file số node input numInputNode = 5; //Tìm ngày cần dự đoán inputDay = dtpInputDay.Value; Today = ((EntryDTO)_stockRecordDTO.Entries[_stockRecordDTO.Entries.Count - 1]).Date; for (i = 0; i < _stockRecordDTO.Entries.Count; i++) { EntryDTO curEntry = (EntryDTO)_stockRecordDTO.Entries[i]; if (inputDay.Subtract(curEntry.Date).Days <= 0 && inputDay.Subtract(Today).Days <= 0) { break; } } int numDaysPredicted = 1; if (!int.TryParse(tbxNumDayTrendPredict.Text, out numDaysPredicted)) { MessageBox.Show("Please enter a number"); return; } //Ghi bộ input đầu vào cho ngày dự đoán dblSource = new double[numInputNode * numDaysPredicted + numDaysPredicted + 1]; if (i < _stockRecordDTO.Entries.Count && i > numInputNode * numDaysPredicted) { for (int k = 0; k < dblSource.Length; k++) { dblSource[k] = 0; } //1. Đọc dữ liệu vào mảng for (int j = 0; j < numInputNode * numDaysPredicted; j++) { EntryDTO curEntry = (EntryDTO)_stockRecordDTO.Entries[i - j]; dblSource[j] = curEntry.ClosePrice; } for (int k = 0; k < dblSource.Length; k++) { if (dblSource[k] == 0) { dblSource[k] = dblSource[0]; } } PreprocessBUS preprocessBUS = new PreprocessBUS(); dblSource = preprocessBUS.Scale_SVR_Return(dblSource.Length, dblSource, 1, 1); //2. Chuyển sang định dạng của LibSVM (dựa vào số node đầu vào) ConverterBUS converter = new ConverterBUS(); int iNumLine = 0; converter.ConvertForTrend(numDaysPredicted, numInputNode, dblSource, "TestTrend.txt", out iNumLine, 2, true); #region Dự đoán ANN if (numDaysPredicted >= 1 && numDaysPredicted < 5) { ANNModelBUS.AnnModelFile = @"AppModel\ANNTrend\" + cmbStockID.SelectedItem.ToString() + "_1_model.txt"; strArgs[1] = @"AppModel\SVRTrend\" + cmbStockID.SelectedItem.ToString() + "_1_model.txt"; } else if (numDaysPredicted >= 5 && numDaysPredicted < 10) { ANNModelBUS.AnnModelFile = @"AppModel\ANNTrend\" + cmbStockID.SelectedItem.ToString() + "_5_model.txt"; strArgs[1] = @"AppModel\SVRTrend\" + cmbStockID.SelectedItem.ToString() + "_5_model.txt"; } else if (numDaysPredicted >= 10 && numDaysPredicted < 30) { ANNModelBUS.AnnModelFile = @"AppModel\ANNTrend\" + cmbStockID.SelectedItem.ToString() + "_10_model.txt"; strArgs[1] = @"AppModel\SVRTrend\" + cmbStockID.SelectedItem.ToString() + "_10_model.txt"; } else { ANNModelBUS.AnnModelFile = @"AppModel\ANNTrend\" + cmbStockID.SelectedItem.ToString() + "_30_model.txt"; strArgs[1] = @"AppModel\SVRTrend\" + cmbStockID.SelectedItem.ToString() + "_30_model.txt"; } ANNParameterBUS.LoadParameter(); ANNPredictBUS annPredictTrend = new ANNPredictBUS(); annPredictTrend.LoadDataSet(@"TestTrend.txt"); dblActual_Forecast = annPredictTrend.MainProcessTrend(); trendPredict = dblActual_Forecast[1][0]; tbxANNTrend.Text = dblActual_Forecast[1][0] > 0 ? "Tăng" : "Giảm"; strArgs[0] = @"TestTrend.txt"; strArgs[2] = "trend_predicted.txt"; dblActual_Forecast = svm_predict.MainProcess(strArgs); tbxSVMTrend.Text = dblActual_Forecast[1][0] > 0 ? "Tăng" : "Giảm"; #endregion } else { MessageBox.Show("Error: Invalid input!"); } #endregion }