Beispiel #1
0
        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!");
        }
Beispiel #2
0
        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
        }
Beispiel #3
0
        private int[] GetPastTrend(DateTime choseDate)
        {
            int[] pastTrend = null;

            double[] dblClosePrices = new double[_stockSARecordDTO.Entries.Count];
            double[] dblVolumes = new double[_stockSARecordDTO.Entries.Count];

            int dateIndex = -1;
            int i = 0;

            // tìm ngày
            foreach (EntryDTO entryDTO in _stockSARecordDTO.Entries)
            {
                dblClosePrices[i] = entryDTO.ClosePrice;
                dblVolumes[i] = entryDTO.Volume;
                if (isEqualDate(entryDTO.Date, choseDate) == true && i >= ConverterBUS.LOW_PERIOD)
                {
                    dateIndex = i;
                }
                i++;
            }

            if (dateIndex == -1)
            {
                string dateFrom = ((EntryDTO)_stockSARecordDTO.Entries[ConverterBUS.LOW_PERIOD]).Date.ToString();
                string dateTo = ((EntryDTO)_stockSARecordDTO.Entries[_stockSARecordDTO.Entries.Count - 1]).Date.ToString();
                MessageBox.Show("please chose date between: " + dateFrom + " and " + dateTo);
            }
            else
            {
                //int numDaysPeriod = numDate;
                int currIndex = dateIndex;
                // Tạo tham số đầu vào
                ConverterBUS converter = new ConverterBUS();
                pastTrend = ConverterBUS.GetPastTrend(dblClosePrices, dblVolumes, currIndex);
            }
            return pastTrend;
        }
Beispiel #4
0
        private void Preprocess(bool isBatchMode)
        {
            string strInputFile = null;
            double dblTrainingSetRatio = 0;

            if (isBatchMode)
            {
                strInputFile = tbxBatchInputFile.Text;
                dblTrainingSetRatio = Convert.ToDouble(tbxTrainingRatio.Text);
            }
            else
            {
                strInputFile = tbxCsvFilePath.Text;
                dblTrainingSetRatio = Convert.ToDouble(tbxTrainingRatio.Text);
            }
            //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(strInputFile);

            _stockRecordDTO = stockRecordDTO;

            double[] dblClosePrices = new double[stockRecordDTO.Entries.Count];
            double[] dblVolumes = new double[stockRecordDTO.Entries.Count];
            int i = 0;
            foreach (EntryDTO entryDTO in stockRecordDTO.Entries)
            {
                dblClosePrices[i] = entryDTO.ClosePrice;
                dblVolumes[i] = entryDTO.Volume;
                i++;
            }

            //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 = strInputFile.LastIndexOf('\\');
            string strFolderPath = strInputFile.Remove(iPos + 1);
            string strTotalFile = strFolderPath + stockRecordDTO.ID;
            int numDaysPredicted = Int32.Parse(cmbNumDaysPredicted.Text);
            int iNumLine = 0;

            ConverterBUS.Convert(dblClosePrices, dblVolumes, numDaysPredicted, 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";
            string strDTTrainFile = strFolderPath + stockRecordDTO.ID + "_" + numDaysPredicted + "_train.data.txt";
            string strDTTestFile = strFolderPath + stockRecordDTO.ID + "_" + numDaysPredicted + "_test.data.txt";

            StreamReader reader = new StreamReader(strTotalFile + ".txt");
            StreamReader dtReader = new StreamReader(strTotalFile + ".data");
            StreamWriter trainWriter = new StreamWriter(strTrainFile);
            StreamWriter testWriter = new StreamWriter(strTestFile);
            StreamWriter dtTrainWriter = new StreamWriter(strDTTrainFile);
            StreamWriter dtTestWriter = new StreamWriter(strDTTestFile);

            string SubTrainFile = null;
            string SubTestFile = null;
            string dtannSubTrainFile = null;
            string dtannSubTestFile = null;

            StreamWriter SubTrainWriter = null;
            StreamWriter SubTestWriter = null;
            StreamWriter dtannSubTrainWriter = null;
            StreamWriter dtannSubTestWriter = null;
            if (rdDTANN.Checked == true)
            {
                SubTrainFile = strFolderPath + stockRecordDTO.ID + "_" + numDaysPredicted + "_train_subtrain.txt";
                SubTestFile = strFolderPath + stockRecordDTO.ID + "_" + numDaysPredicted + "_train_subtest.txt";

                dtannSubTrainFile = strFolderPath + stockRecordDTO.ID + "_" + numDaysPredicted + "_train_subtrain.data.txt";
                dtannSubTestFile = strFolderPath + stockRecordDTO.ID + "_" + numDaysPredicted + "_train_subtest.data.txt";

                SubTrainWriter = new StreamWriter(SubTrainFile);
                SubTestWriter = new StreamWriter(SubTestFile);
                dtannSubTrainWriter = new StreamWriter(dtannSubTrainFile);
                dtannSubTestWriter = new StreamWriter(dtannSubTestFile);
            }

            //int iBound = numDaysPredicted > iNumInputNode ? 2 * numDaysPredicted : numDaysPredicted + iNumInputNode;
            //int iNumLine = dblSource.Length - iBound + 1;
            int iDivideLine = (int)(dblTrainingSetRatio * iNumLine / 100);
            int iSudDevideLine = (int)(90 * iDivideLine / 100);
            for (i = 0; i < iDivideLine; i++)
            {
                string strLine = reader.ReadLine();
                trainWriter.WriteLine(strLine);
                if (rdDTANN.Checked == true)
                {
                    if (i < iSudDevideLine)// Phân bổ cho tập train con
                    {
                        SubTrainWriter.WriteLine(strLine);
                    }
                    else// Phân bổ cho tập test con
                    {
                        SubTestWriter.WriteLine(strLine);
                    }
                }

                strLine = dtReader.ReadLine();
                dtTrainWriter.WriteLine(strLine);
                if (rdDTANN.Checked == true)
                {
                    if (i < iSudDevideLine)// Phân bổ cho tập train con
                    {
                        dtannSubTrainWriter.WriteLine(strLine);
                    }
                    else// Phân bổ cho tập test con
                    {
                        dtannSubTestWriter.WriteLine(strLine);
                    }
                }
            }
            for (; i < iNumLine; i++)
            {
                string strLine = reader.ReadLine();
                testWriter.WriteLine(strLine);
                strLine = dtReader.ReadLine();
                dtTestWriter.WriteLine(strLine);
            }

            testWriter.Close();
            trainWriter.Close();
            dtTestWriter.Close();
            dtTrainWriter.Close();
            reader.Close();
            dtReader.Close();

            if (rdDTANN.Checked == true)
            {
                SubTrainWriter.Close();
                SubTestWriter.Close();
                dtannSubTrainWriter.Close();
                dtannSubTestWriter.Close();
            }
        }
Beispiel #5
0
        private double[] MakeInputPramater(DateTime choseDate, int numDate)
        {
            double[] pramaters = null;

            double[] dblClosePrices = new double[_stockSARecordDTO.Entries.Count];
            double[] dblVolumes = new double[_stockSARecordDTO.Entries.Count];
            int dateIndex = -1;
            int i = 0;

            // tìm ngày
            foreach (EntryDTO entryDTO in _stockSARecordDTO.Entries)
            {
                dblClosePrices[i] = entryDTO.ClosePrice;
                dblVolumes[i] = entryDTO.Volume;
                if (isEqualDate(entryDTO.Date, choseDate) == true && i >= ConverterBUS.LOW_PERIOD)
                {
                    dateIndex = i;
                }
                i++;
            }

            if (dateIndex == -1)
            {

                string dateFrom = ((EntryDTO)_stockSARecordDTO.Entries[ConverterBUS.LOW_PERIOD]).Date.ToString();
                string dateTo = ((EntryDTO)_stockSARecordDTO.Entries[_stockSARecordDTO.Entries.Count - 1]).Date.ToString();
                DialogResult dlResult = MessageBox.Show("please chose date between: " + dateFrom + " and " + dateTo, "It's important Notification", MessageBoxButtons.OK);
                if (dlResult == DialogResult.OK)
                {
                    return pramaters;
                }
            }

            // xác định chỉ mục quá khứ dựa vào chu kỳ
            int numDaysPeriod = numDate;
            int pastIndex = dateIndex - numDaysPeriod;

            // Tạo tham số đầu vào
            ConverterBUS converter = new ConverterBUS();
            pramaters = ConverterBUS.MakeInputPramater(dblClosePrices, dblVolumes, numDaysPeriod, pastIndex);

            return pramaters;
        }
        //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
        }