//************************************************************************************** public static WekaLinearRegression CreateNew(int iParamtersID, List <ClassifierParameter> iParameters, Candlestick.Period iPeriod, int iProfitTime, List <int> iTrainingPoints, bool iEliminateColinearAttributes, bool iMinimal) { // Create WekaInfo and retrive ID var info = new WekaInfo(null, typeof(WekaJ48), iParamtersID, iPeriod, iProfitTime); WekaInfo.InsertToDB(info); if (info.ID is null) { throw new Exception("Could not deduct ID"); } // Create LinearRegressionInfo var lrInfo = new WekaLinearRegressionInfo((int)info.ID, iEliminateColinearAttributes, iMinimal); WekaLinearRegressionInfo.UpdateDB(lrInfo); // Save training points if (iTrainingPoints != null) { SaveTrainingPoints(iTrainingPoints, "Data/TrainingPoints/Classifier_" + info.ID.ToString() + ".dat"); } // Create classifier return(new WekaLinearRegression(info, iParameters, lrInfo)); }
//************************************************************************************** /// <summary> /// Inserts prediction profits info to DB /// </summary> public static void UpdateDB(WekaLinearRegressionInfo iInfo) { var sql = "IF EXISTS(SELECT * FROM LinearRegressionInfo WHERE Id = @ID) " + "Update LinearRegressionInfo SET " + "CoefOfDetermination = @CoefOfDetermination, ProfitStdDev = @ProfitStdDev " + " Where ID = @ID " + "ELSE" + " INSERT INTO LinearRegressionInfo (Id, EliminateColinearAttributes, Minimal, CoefOfDetermination, ProfitStdDev) VALUES(@ID, @EliminateColinearAttributes, @Minimal, @CoefOfDetermination, @ProfitStdDev)"; using (var connection = new SqlConnection(Program.SQLConnectionName)) { connection.Open(); { var cmd = new SqlCommand(sql, connection); cmd.Parameters.AddWithValue("@Id", iInfo.ID); cmd.Parameters.AddWithValue("@EliminateColinearAttributes", iInfo.EliminateColinearAttributes); cmd.Parameters.AddWithValue("@Minimal", iInfo.Minimal); cmd.Parameters.AddWithValue("@CoefOfDetermination", (object)iInfo.CoefOfDetermination ?? DBNull.Value); cmd.Parameters.AddWithValue("@ProfitStdDev", (object)iInfo.ProfitStdDev ?? DBNull.Value); var dataAdapter = new SqlDataAdapter { InsertCommand = cmd }; dataAdapter.InsertCommand.ExecuteNonQuery(); dataAdapter.InsertCommand.Dispose(); } } }
//************************************************************************************** public override void RebuildClassifier() { OutputMessage("Rebuilding classifier"); // Remove model DeleteModel(ID); // Remove training data DeleteTrainingPoints(ID); // Update info LRInfo.OnClassifierRebuild(); WekaLinearRegressionInfo.UpdateDB(LRInfo); }
//************************************************************************************** /// <summary> /// Build cllasifier model and save it to a file. /// </summary> public override void Build(CandlestickCollection iCandlestick) { List <int> trainingPoints = null; // Build model if (!File.Exists(ModelFilename)) { OutputMessage("Building model"); trainingPoints = LoadTrainingPoints(iCandlestick, ID, ProfitTime); Model = new weka.classifiers.functions.LinearRegression(); Model.setEliminateColinearAttributes(LRInfo.EliminateColinearAttributes); Model.setMinimal(LRInfo.Minimal); Model.buildClassifier(CreateInstances(iCandlestick, trainingPoints, Attributes, Parameters, Period, ProfitTime)); weka.core.SerializationHelper.write(ModelFilename, Model); coefficients = Model.coefficients(); } // Calculate coeficient of determination and profits std dev if (LRInfo.CoefOfDetermination == null || LRInfo.ProfitStdDev == null) { WaitTillModelReady(); OutputMessage("Calculating coeficient of determination and profits std dev"); if (trainingPoints is null) { trainingPoints = LoadTrainingPoints(iCandlestick, ID, ProfitTime); } var par = CalculateParameters(Parameters, iCandlestick, trainingPoints, Period); var futureProfits = FullToTraining(new List <float>(CalculateFutureProfits(iCandlestick[kTrainingPeriod], ProfitTime)), trainingPoints).ToArray(); var pred = new List <float>(); for (int j = 0; j < par.Count; j++) { var fp = PredictDFP(par[j]); var targetPriceChange = (float)Math.Exp(fp); pred.Add(targetPriceChange - 1.0f); } LRInfo.CoefOfDetermination = (float)Math.Pow(Statistics.CalculateCorrelation(futureProfits, pred.ToArray()), 2.0f); LRInfo.ProfitStdDev = Statistics.StandardDeviation(futureProfits, pred.ToArray()); WekaLinearRegressionInfo.UpdateDB(LRInfo); } }
//************************************************************************************** public override void RemoveClassifier() { if (!Exist(ID)) { return; } Console.WriteLine("Removing classifier: " + ID); // Remove model DeleteModel(ID); // Remove training data DeleteTrainingPoints(ID); WekaInfo.RemoveFromDB(ID); WekaLinearRegressionInfo.RemoveFromDB(ID); // Remove target classifier from static list classifiers.Remove(ID); }
//************************************************************************************** /// <summary> /// Loads prediction profits from DB. /// </summary> public static List <WekaLinearRegressionInfo> LoadFromDB() { var results = new List <WekaLinearRegressionInfo>(); var sql = "Select * from LinearRegressionInfo"; using (var connection = new SqlConnection(Program.SQLConnectionName)) { connection.Open(); var command = new SqlCommand(sql, connection); using (var reader = command.ExecuteReader()) while (reader.Read()) { var info = new WekaLinearRegressionInfo(reader.GetInt32(reader.GetOrdinal("Id")), reader.GetBoolean(reader.GetOrdinal("EliminateColinearAttributes")), reader.GetBoolean(reader.GetOrdinal("Minimal"))); if (!reader.IsDBNull(reader.GetOrdinal("CoefOfDetermination"))) { info.CoefOfDetermination = (float)reader.GetDouble(reader.GetOrdinal("CoefOfDetermination")); } if (!reader.IsDBNull(reader.GetOrdinal("ProfitStdDev"))) { info.ProfitStdDev = (float)reader.GetDouble(reader.GetOrdinal("ProfitStdDev")); } if (!reader.IsDBNull(reader.GetOrdinal("ProfitStdDev"))) { info.ProfitStdDev = (float)reader.GetDouble(reader.GetOrdinal("ProfitStdDev")); } results.Add(info); } } return(results); }
//************************************************************************************** public WekaLinearRegression(WekaInfo iInfo, List <ClassifierParameter> iParameters, WekaLinearRegressionInfo iLRInfo) : base(iInfo, iParameters) { LRInfo = iLRInfo ?? throw new ArgumentNullException("iLRInfo"); }