public static List <Day> Backtest(Database db, Mixture mixture, string symbol, DateTime startDate, DateTime endDate, double initialEquity, double marginFactor, double tradeCost) { var preloadStart = startDate.AddYears(-1); var allBars = new DataSeries <Bar>(symbol, db.QueryAll <DbBar>(x => x.Symbol == symbol, "Timestamp") .Select(DataPreprocessing.DbBarToBar)); var bars = DataPreprocessing.TrimToWindow(allBars, DataPreprocessing.GetWindow(preloadStart, endDate, allBars)); var data = DataPreprocessing.LoadTrainingSet(db, symbol, preloadStart, endDate, Signals.Null); var predictor = new MixturePredictor(mixture, data); Debug.Assert(bars.Length == data.Input.ColumnCount); var backtestStartIndex = bars.ToList().FindIndex(x => x.Timestamp >= startDate); // preload for (int t = 0; t < backtestStartIndex; t++) { predictor.Predict(t); } int totalPredictions = 0; int correctPredictions = 0; // backtest var account = new VAccount(initialEquity, marginFactor, tradeCost); for (int t = backtestStartIndex + 1; t < bars.Length; t++) { var prediction = predictor.Predict(t - 1); Debug.Assert(prediction != 0); var wasCorrect = ActOnSignal(bars[t - 1], bars[t], prediction, account, symbol); totalPredictions++; if (wasCorrect) { correctPredictions++; } } double correctPct = (double)correctPredictions / totalPredictions; return(null); }
//[Test] public void LocalEvolveTest() { var mongoDb = TestHelpers.GetCleanDatabase(); var db = new Database(mongoDb); var protoRun = new ProtoRun(db, "LocalEvolveTest", 4, Initialization.MakeProtoChromosome(), 10, 6, 4, 4, 0.05); var trainingStart = "11/11/2001"; var validationEnd = "05/12/2003"; var dataSets = MakeTrainingAndValidationSets(db, trainingStart, validationEnd); var run = Functions.Evolve(protoRun, new LocalParallelTrainer(), dataSets.Item1, dataSets.Item2); Trace.WriteLine("Generation fitnesses: " + run.Generations.Select(x => x.Evaluated.Fitness).Join(", ")); var bestMixtures = run.Generations.SelectMany(g => g.Mixtures).OrderByDescending(m => m.Evaluated.Fitness).Take(10).ToList(); var testingSet = MakeTrainingSet(db, validationEnd, "12/12/2003"); Lists.Repeat(bestMixtures.Count, i => { var predictor = new MixturePredictor(bestMixtures[i], testingSet); var testedFitness = Functions.ComputeFitness(predictor, testingSet, 20); Trace.WriteLine(string.Format("Tested fitness for best mixture #{0}: {1}", i, testedFitness)); }); }
static MixtureEval EvaluateMixture(Mixture m, DataSet data) { using (var mixturePredictor = new MixturePredictor(m, data)) return(new MixtureEval(m, ComputeFitness(mixturePredictor, data))); }