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 }
private void btnTest_Click(object sender, EventArgs e) { if (tbxTestFilePath.Text == "" || tbxModelFilePath.Text == "") { MessageBox.Show("Error: You must fill all required inputs!", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); return; } #region Phần chung //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; int iPos = tbxTestFilePath.Text.LastIndexOf('\\'); string strFolderPath = tbxTestFilePath.Text.Remove(iPos+1); #endregion #region Phần riêng #region Dự đoán giá if (rdPricePrediction.Checked)//Dự đoán giá { iPos = tbxTestFilePath.Text.LastIndexOf('_'); string strMutualPath = tbxTestFilePath.Text.Remove(iPos + 1); string strPredictedFile = strMutualPath + "predict.txt"; #region SVR if (rdSVR.Checked)//Mô hình SVR { string[] strArgs = new string[3]; strArgs[0] = tbxTestFilePath.Text; strArgs[1] = tbxModelFilePath.Text; strArgs[2] = strPredictedFile; StreamReader reader = new StreamReader(tbxModelFilePath.Text); string strLine = reader.ReadLine(); if (strLine == "Multiple") //Bag Pattern Search { StreamWriter measure = new StreamWriter(strMutualPath + "SingleModelMeasure.txt"); strLine = reader.ReadLine(); //Số mô hình int iNumModel = Convert.ToInt32(strLine); double[][][] dblActual_ForecastSeries = new double[iNumModel][][]; for (int i = 0; i < iNumModel; i++) { dblActual_ForecastSeries[i] = new double[2][]; dblActual_ForecastSeries[i][0] = null; dblActual_ForecastSeries[i][1] = null; strLine = reader.ReadLine(); //Đường dẫn đến file model strArgs[1] = strLine; dblActual_ForecastSeries[i] = svm_predict.MainProcess(strArgs); MeasureBUS measureBUS = new MeasureBUS(); double dblMSE = measureBUS.MSE(dblActual_ForecastSeries[i][0], dblActual_ForecastSeries[i][1]); double dblNMSE = measureBUS.NMSE(dblActual_ForecastSeries[i][0], dblActual_ForecastSeries[i][1]); double dblDS = measureBUS.DS(dblActual_ForecastSeries[i][0], dblActual_ForecastSeries[i][1]); measure.WriteLine((i + 1).ToString() + " " + dblMSE.ToString() + " " + dblNMSE.ToString() + " " + dblDS.ToString()); } measure.Close(); //Để có kết quả sau cùng, ta sẽ lấy trung bình kết quả dự đoán của tất cả các mô hình lại int iCounter = dblActual_ForecastSeries[0][0].Count(); dblActual_Forecast[0] = new double[iCounter]; dblActual_Forecast[1] = new double[iCounter]; for (int i = 0; i < iCounter; i++) { //Giá thực dblActual_Forecast[0][i] = dblActual_ForecastSeries[0][0][i]; //Giá dự đoán dblActual_Forecast[1][i] = 0; for (int j = 0; j < iNumModel; j++) { dblActual_Forecast[1][i] += dblActual_ForecastSeries[j][1][i]; } dblActual_Forecast[1][i] /= iNumModel; } //Ghi kết quả cuối cùng ra file StreamWriter finalResult = new StreamWriter(strPredictedFile); for (int i = 0; i < iCounter; i++) { finalResult.WriteLine(dblActual_Forecast[0][i].ToString() + " " + dblActual_Forecast[1][i].ToString()); } finalResult.Close(); reader.Close(); } else { reader.Close(); dblActual_Forecast = svm_predict.MainProcess(strArgs); } } #endregion #region ANN else//Mô hình ANN { ANNModelBUS.AnnModelFile = tbxModelFilePath.Text; ANNParameterBUS.LoadParameter(); ANNPredictBUS annPredict = new ANNPredictBUS(); annPredict.LoadDataSet(tbxTestFilePath.Text); dblActual_Forecast = annPredict.MainProcess(); //dblActual_Forecast = annPredict.StepTrainingMethod(); annPredict.WritePredictPrice(strPredictedFile); } #endregion } #endregion #region Dự đoán xu hướng else//Dự đoán xu hướng { if (rdSVR.Checked)//Mô hình SVR { iPos = tbxTestFilePath.Text.LastIndexOf('_'); string strMutualPath = tbxTestFilePath.Text.Remove(iPos + 1); string strPredictedFile = strMutualPath + "predict.txt"; string[] strArgs = new string[3]; strArgs[0] = tbxTestFilePath.Text; strArgs[1] = tbxModelFilePath.Text; strArgs[2] = strPredictedFile; StreamReader reader = new StreamReader(tbxModelFilePath.Text); string strLine = reader.ReadLine(); if (strLine == "Multiple") //Bag Pattern Search { StreamWriter measure = new StreamWriter(strMutualPath + "SingleModelMeasure.txt"); strLine = reader.ReadLine(); //Số mô hình int iNumModel = Convert.ToInt32(strLine); double[][][] dblActual_ForecastSeries = new double[iNumModel][][]; for (int i = 0; i < iNumModel; i++) { dblActual_ForecastSeries[i] = new double[2][]; dblActual_ForecastSeries[i][0] = null; dblActual_ForecastSeries[i][1] = null; strLine = reader.ReadLine(); //Đường dẫn đến file model strArgs[1] = strLine; dblActual_ForecastSeries[i] = svm_predict.MainProcess(strArgs); MeasureBUS measureBUS = new MeasureBUS(); double dblNMSE = measureBUS.NMSE(dblActual_ForecastSeries[i][0], dblActual_ForecastSeries[i][1]); measure.WriteLine((i + 1).ToString() + " " + dblNMSE.ToString()); } measure.Close(); //Để có kết quả sau cùng, ta sẽ lấy trung bình kết quả dự đoán của tất cả các mô hình lại int iCounter = dblActual_ForecastSeries[0][0].Count(); dblActual_Forecast[0] = new double[iCounter]; dblActual_Forecast[1] = new double[iCounter]; for (int i = 0; i < iCounter; i++) { //Giá thực dblActual_Forecast[0][i] = dblActual_ForecastSeries[0][0][i]; //Giá dự đoán dblActual_Forecast[1][i] = 0; for (int j = 0; j < iNumModel; j++) { dblActual_Forecast[1][i] += dblActual_ForecastSeries[j][1][i]; } dblActual_Forecast[1][i] /= iNumModel; } //Ghi kết quả cuối cùng ra file StreamWriter finalResult = new StreamWriter(strPredictedFile); for (int i = 0; i < iCounter; i++) { finalResult.WriteLine(dblActual_Forecast[0][i].ToString() + " " + dblActual_Forecast[1][i].ToString()); } finalResult.Close(); reader.Close(); } else { reader.Close(); dblActual_Forecast = svm_predict.MainProcess(strArgs); } } else//Mô hình ANN { iPos = tbxTestFilePath.Text.LastIndexOf('_'); string strPredictedFile = tbxTestFilePath.Text.Remove(iPos + 1) + "predict.txt"; ANNModelBUS.AnnModelFile = tbxModelFilePath.Text; ANNParameterBUS.LoadParameter(); ANNPredictBUS annPredict = new ANNPredictBUS(); annPredict.LoadDataSet(tbxTestFilePath.Text); dblActual_Forecast = annPredict.MainProcessTrend(); annPredict.WritePredictPrice(strPredictedFile); } } #endregion #endregion #region Phần chung HandleMeasure(strFolderPath+"PerformanceMeasure.txt", dblActual_Forecast[0], dblActual_Forecast[1]); MessageBox.Show("Finish!"); #endregion }
//Giá trị trả về là giá dự đoán public double TrainAndPredict(bool isSVR) { double[][] dblActual_Forecast = null; #region Phần chung //1. Lấy đoạn dữ liệu cần thiết double[] dblData = PickNeededData(); //2. Tiền xử lý PreprocessBUS preprocessBUS = new PreprocessBUS(); if (Preprocess == "ScaleByMinMax") { preprocessBUS.FindMinMax(dblData); dblData = preprocessBUS.PreprocessByMinMax(dblData); } ConverterBUS converter = new ConverterBUS(); int iNumLine = 0; if(ImprovedDirection) { converter.ConvertWImprovedDirection(NumInputNode, dblData, "Training.txt", 100, out iNumLine); } else { converter.Convert(NumInputNode, dblData, "Training.txt", out iNumLine); } //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("Test.txt"); if (Preprocess == "ScaleByMinMax") { writer.WriteLine("ScaleByMinMax " + preprocessBUS.Min.ToString() + " " + preprocessBUS.Max.ToString()); } string strLine = "0 "; for (int i = 0; i < NumInputNode; i++) { strLine = strLine + (i+1).ToString() + ":" + dblData[TrainingSize - NumInputNode + i].ToString() + " "; } writer.WriteLine(strLine); writer.Close(); #endregion #region Phần riêng //3. Huấn luyện và dự đoán #region SVR if (isSVR == true) //SVR { string[] strArgs = new string[8]; strArgs[0] = "-g"; //gama. Trong hàm Gauss kernel: exp(-gamma*|u-v|^2) strArgs[2] = "-c"; strArgs[4] = "-p"; //epsilon strArgs[6] = "Training.txt"; strArgs[7] = "SVRModel.txt"; //Tìm bộ tham số (gama, c, epsilon) svm_modelSelection modelSelection = new svm_modelSelection(); modelSelection.Log = false; string[] strArgsModel = new string[4]; strArgsModel[0] = "-v"; strArgsModel[1] = NumFold; strArgsModel[2] = "Training.txt"; strArgsModel[3] = "SVRModel.txt"; if (ModelSelection == "Grid search") { modelSelection.Run(strArgsModel, "", true, TrainingMeasure, CrossValidationType); strArgs[1] = modelSelection.Y.ToString(); //gama strArgs[3] = modelSelection.X.ToString(); //c strArgs[5] = modelSelection.Z.ToString(); //epsilon //Huấn luyện svm_train.Main(strArgs); //Dự đoán strArgs = new string[3]; strArgs[0] = "Test.txt"; strArgs[1] = "SVRModel.txt"; strArgs[2] = "Prediction.txt"; dblActual_Forecast = svm_predict.MainProcess(strArgs); } else if(ModelSelection == "Pattern search") { const int iNumModel = 10; for (int i = 0; i < iNumModel; i++) { modelSelection = new svm_modelSelection {Log = false}; strArgsModel[3] = "SVRModel" + i + 1 + ".txt"; modelSelection.Run(strArgsModel, "", false, TrainingMeasure, CrossValidationType); strArgs[1] = (Math.Pow(2, modelSelection.Y)).ToString(); //gama strArgs[3] = (Math.Pow(2, modelSelection.X)).ToString(); //c strArgs[5] = (Math.Pow(2, modelSelection.Z)).ToString(); //epsilon strArgs[7] = "SVRModel" + i + 1 + ".txt"; //Huấn luyện svm_train.Main(strArgs); } //Dự đoán double[][][] dblTemp = new double[iNumModel][][]; dblActual_Forecast = new double[2][]; dblActual_Forecast[0] = new double[]{0}; dblActual_Forecast[1] = new double[]{0}; for (int i = 0; i < iNumModel; i++) { strArgs = new string[3]; strArgs[0] = "Test.txt"; strArgs[1] = "SVRModel" + i + 1 + ".txt"; strArgs[2] = "Prediction.txt"; dblTemp[i] = svm_predict.MainProcess(strArgs); dblActual_Forecast[1][0] += dblTemp[i][1][0]; } dblActual_Forecast[1][0] /= iNumModel; } } #endregion #region ANN else //ANN { //Huấn luyện ANNParameterBUS.InputNode = NumInputNode; ANNModelBUS.AnnModelFile = "ANNModel.txt"; ANNTrainBUS annTrain = new ANNTrainBUS(); annTrain.LoadDataSet("Training.txt"); annTrain.Main(); //Dự đoán ANNParameterBUS.LoadParameter(); ANNPredictBUS annPredict = new ANNPredictBUS(); annPredict.LoadDataSet("Test.txt"); dblActual_Forecast = annPredict.MainProcess(); } #endregion #endregion return dblActual_Forecast[1][0]; //Giá dự đoán }