Overall Statistics |
Total Trades 18 Average Win 0.26% Average Loss -0.22% Compounding Annual Return 5.564% Drawdown 1.600% Expectancy 0.249 Net Profit 5.564% Sharpe Ratio 1.547 Loss Rate 43% Win Rate 57% Profit-Loss Ratio 1.19 Alpha -0.009 Beta 0.232 Annual Standard Deviation 0.029 Annual Variance 0.001 Information Ratio -2.372 Tracking Error 0.079 Treynor Ratio 0.191 Total Fees $18.00 |
using System.Net; namespace QuantConnect { public class ScheduledUniverseAlgorithm : QCAlgorithm { private int _lookbackPeriod = 3; private Dictionary<Symbol, IEnumerable<TradeBar>> _history; private Dictionary<DateTime, IEnumerable<Symbol>> _symbols; public override void Initialize() { SetStartDate(2013, 1, 1); //Set Start Date SetEndDate(2014, 1, 1); //Set End Date SetCash(100000); //Set Strategy Cash AddEquity("SPY", Resolution.Daily); _history = new Dictionary<Symbol, IEnumerable<TradeBar>>(); _symbols = new Dictionary<DateTime, IEnumerable<Symbol>>(); Schedule.On(DateRules.EveryDay(Securities["SPY"].Symbol), TimeRules.At(9, 20), UniverseUpdate); } public void OnData(TradeBars data) { foreach (var item in data) { if (!Portfolio[item.Key].Invested) { Log("Buy 100 shares of " + item.Key); Order(item.Key, 100); } } } public void UniverseUpdate() { const string liveUrl = @"https://www.dropbox.com/s/2az14r5xbx4w5j6/daily-stock-picker-live.csv?dl=1"; const string backtestUrl = @"https://www.dropbox.com/s/rmiiktz0ntpff3a/daily-stock-picker-backtest.csv?dl=1"; using (var client = new WebClient()) { // handle live mode file format if (LiveMode) { // fetch the file from dropbox var file = client.DownloadString(liveUrl); // if we have a file for today, break apart by commas and return symbols _symbols.Add(DateTime.Today, file.ToCsv() .Select(x => QuantConnect.Symbol.Create(x, SecurityType.Equity, Market.USA))); } else { if (_symbols.Count == 0) { // fetch the file from dropbox var file = client.DownloadString(backtestUrl); // split the file into lines and add to our cache foreach (var line in file.Split(new[] { '\n', '\r' }, StringSplitOptions.RemoveEmptyEntries)) { var csv = line.ToCsv(); var date = DateTime.ParseExact(csv[0], "yyyyMMdd", null); _symbols.Add(date, csv.Skip(1) .Select(x => QuantConnect.Symbol.Create(x, SecurityType.Equity, Market.USA))); } } } } IEnumerable<Symbol> fetchedSymbols; if (!_symbols.TryGetValue(Time.Date, out fetchedSymbols)) return; // Current securities var currentSecurities = Securities.Keys; // Add securities to the universe var addedSecurities = fetchedSymbols.Except(currentSecurities); foreach (var addedSecurity in addedSecurities) { AddEquity(addedSecurity, Resolution.Daily); } // Remove securities from the universe // It will liquidate positions // They will be part of the IAlgorithm.Securities, but not part of subscribed securities var removedSecurities = currentSecurities.Except(fetchedSymbols); foreach (var removedSecurity in removedSecurities) { RemoveSecurity(removedSecurity); } // Get History and save it to cache foreach (var symbol in fetchedSymbols) { if (!_history.ContainsKey(symbol)) { _history.Add(symbol, History(symbol, TimeSpan.FromDays(_lookbackPeriod), Resolution.Daily)); } else { _history[symbol] = History(symbol, TimeSpan.FromDays(_lookbackPeriod), Resolution.Daily); } } Log("Universe updated at " + Time); } } }