void Supervise() { ThreadSync = SyncContext.Current; Console.Write("Supervisor is loading dataset..."); var db = Database.GetProductionDatabase(MongoHostInfo.FromAppSettings()); var trainingSet = DataPreprocessing.LoadTrainingAndValidationSets(db, MasterRequest.Symbol, MasterRequest.StartDate, MasterRequest.EndDate, MasterRequest.ValidationPct, VersaceMain.GetSignalFunc(MasterRequest.SignalType)).Item1; Console.WriteLine("done"); Console.Write("Supervisor is starting {0} slaves..", SlaveCount); Slaves = Lists.Repeat(SlaveCount, _ => { Slave slave = new Slave(CloneDataSet(trainingSet)); slave.Task = Task.Factory.StartNew(slave.Run).ContinueWith(t => { Slaves.RemoveAll(x => x.Task == t); if (t.IsFaulted) { Console.WriteLine("Slave faulted: " + t.Exception); } }); return(slave); }); Console.WriteLine("done"); Waiter.Wait(() => !Slaves.Any()); }
public Slave(MasterRequest masterReq) { Database = Database.GetProductionDatabase(ConfigurationManager.AppSettings["MongoHost"]); var dataSets = DataPreprocessing.MakeTrainingAndValidationSets(masterReq.Symbol, masterReq.StartDate, masterReq.EndDate, masterReq.ValidationPct, DataPreprocessing.GetSignalFunc(masterReq.SignalType)); TrainingSet = dataSets.Item1; }
public static void DownloadData(string predictedSymbol, DateTime start, DateTime end) { var dir = @"d:\users\wintonpc\git\Quqe\Share\VersaceData"; if (!Directory.Exists(dir)) { Directory.CreateDirectory(dir); } foreach (var ticker in DataPreprocessing.GetTickers(predictedSymbol)) { Console.Write("Fetching {0} ...", ticker); using (var c = new WebClient()) { var fn = Path.Combine(dir, ticker + ".txt"); if (ticker.StartsWith("^DJ")) // historical downloads of dow jones indices are not allowed { GetDowJonesData(c, ticker, fn, start, end); } else { var address = string.Format("http://ichart.finance.yahoo.com/table.csv?s={0}&a={1}&b={2}&c={3}&d={4}&e={5}&f={6}&g=d&ignore=.csv", ticker, start.Month - 1, start.Day, start.Year, end.Month - 1, end.Day, end.Year); c.DownloadFile(address, fn); } var fixedLines = File.ReadAllLines(fn).Skip(1).Reverse().Select(line => { var toks = line.Split(','); var timestamp = DateTime.ParseExact(toks[0], "yyyy-MM-dd", null, DateTimeStyles.AdjustToUniversal); var open = double.Parse(toks[1]); var high = double.Parse(toks[2]); var low = double.Parse(toks[3]); var close = double.Parse(toks[4]); var volume = long.Parse(toks[5]); return(string.Format("{0:yyyyMMdd};{1};{2};{3};{4};{5}", timestamp, open, high, low, close, volume)); }); File.WriteAllLines(fn, fixedLines); } Console.WriteLine("done"); } }
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); }