Overall Statistics |
Total Trades 360 Average Win 3.10% Average Loss -1.21% Annual Return 260.961% Drawdown 10.400% Expectancy 0.941 Net Profit 4324.802% Sharpe Ratio 1.248 Loss Rate 46% Win Rate 54% Profit-Loss Ratio 2.56 Alpha 0.167 Beta 0.001 Annual Standard Deviation 0.134 Annual Variance 0.018 Information Ratio 0.508 Tracking Error 0.217 Treynor Ratio 145.667 |
using System; using System.Collections; using System.Collections.Generic; using QuantConnect.Securities; using QuantConnect.Models; namespace QuantConnect { /// <summary> /// vvvvvv UPDATE TO YOUR CORE ALGORITHM CLASS NAME HERE: vvvv "QCUMartingalePositionSizing" ==> "MyAlgorithm" /// </summary> public partial class CustomDataSourceAlgorithm : QCAlgorithm { public void CustomSetHoldings(string symbol, decimal percentage, bool liquidateExistingHoldings = false) { decimal cash = Portfolio.Cash; decimal currentHoldingQuantity = Portfolio[symbol].Quantity; //Range check values: if (percentage > 1) percentage = 1; if (percentage < -1) percentage = -1; //If they triggered a liquidate if (liquidateExistingHoldings) { foreach (string holdingSymbol in Portfolio.Keys) { if (holdingSymbol != symbol) { //Go through all existing holdings, market order the inverse quantity Order(holdingSymbol, -Portfolio[holdingSymbol].Quantity); } } } //Now rebalance the symbol requested: decimal targetHoldingQuantity = Math.Floor((percentage * Portfolio.TotalPortfolioValue) / Securities[symbol].Price); decimal netHoldingQuantity = targetHoldingQuantity - currentHoldingQuantity; if (Math.Abs(netHoldingQuantity) > 0) { Order(symbol, (int)netHoldingQuantity); } return; } } }
using System; using System.Collections; using System.Collections.Generic; using QuantConnect.Securities; using QuantConnect.Models; namespace QuantConnect { /// <summary> /// Custom Data Type: USD/INR data from Quandl /// http://www.quandl.com/BNP/USDINR-Currency-Exchange-Rate-USD-vs-INR /// </summary> public class DollarRupee : BaseData { public decimal Open = 0; public decimal High = 0; public decimal Low = 0; public decimal Close = 0; public DollarRupee() { this.Symbol = "USDINR"; } public override string GetSource(SubscriptionDataConfig config, DateTime date, DataFeedEndpoint datafeed) { return "https://www.dropbox.com/s/w71phighrsh8uu0/USDINR.csv?dl=1"; } public override BaseData Reader(SubscriptionDataConfig config, string line, DateTime date, DataFeedEndpoint datafeed) { //New USDINR object DollarRupee currency = new DollarRupee(); try { string[] data = line.Split(','); //Dates must be in the format YYYY-MM-DD. If your data source does not have this format, you must use //DateTime.ParseExact() and explicit declare the format your data source has. currency.Time = DateTime.Parse(data[0]); currency.Close = Convert.ToDecimal(data[1]); currency.Symbol = "USDINR"; currency.Value = currency.Close; } catch { } return currency; } } }
using System; using System.Collections; using System.Collections.Generic; using QuantConnect.Securities; using QuantConnect.Models; using System.Linq; using MathNet.Numerics.Statistics; namespace QuantConnect { /// <summary> /// 3.0 CUSTOM DATA SOURCE: USE YOUR OWN MARKET DATA (OPTIONS, FOREX, FUTURES, DERIVATIVES etc). /// /// The new QuantConnect Lean Backtesting Engine is incredibly flexible and allows you to define your own data source. /// /// This includes any data source which has a TIME and VALUE. These are the *only* requirements. To demonstrate this we're loading /// in "Nifty" data. This by itself isn't special, the cool part is next: /// /// We load the "Nifty" data as a tradable security we're calling "NIFTY". /// /// </summary> public partial class CustomDataSourceAlgorithm : QCAlgorithm { //Create variables for analyzing Nifty CorrelationPair today = new CorrelationPair(); List<CorrelationPair> prices = new List<CorrelationPair>(); int minimumCorrelationHistory = 11; public override void Initialize() { SetStartDate(1998, 1, 1); SetEndDate(2014, 7, 25); //Set the cash for the strategy: SetCash(100000); //Define the symbol and "type" of our generic data: AddData<DollarRupee>("USDINR"); AddData<Nifty>("NIFTY"); } public void OnData(DollarRupee data) { today = new CorrelationPair(data.Time); today.Add("USDINR", data.Close); } public void OnData(Nifty data) { try { today.Add("NIFTY", data.Close); if (today.Date == data.Time) { prices.Add(today); if(prices.Count > minimumCorrelationHistory) { prices.RemoveAt(0); } } if (prices.Count < 2) { return; } string maxAsset = ""; double maxGain = -9999; foreach(string i in today.Prices.Keys) { double last = (from pair in prices select pair.Prices[i]).Last(); double first = (from pair in prices select pair.Prices[i]).First(); double gain = (last - first) / first; if (gain > maxGain) { maxAsset = i; maxGain = gain; } } //Strategy if (maxAsset != "") { CustomSetHoldings(maxAsset, 1, true); } } catch(Exception err) { Debug( "Error: " + err.Message ); } } //Plot Nifty public override void OnEndOfDay() { if (today.Prices.ContainsKey("NIFTY")) { if(today.Prices["NIFTY"] != 0 && today.Date.DayOfWeek == DayOfWeek.Wednesday) { Plot("NIFTY", today.Prices["NIFTY"]); } if(today.Prices["USDINR"] != 0 && today.Date.DayOfWeek == DayOfWeek.Wednesday) { Plot("USDINR", today.Prices["USDINR"]); } } } } }
using System; using System.Collections; using System.Collections.Generic; using QuantConnect.Securities; using QuantConnect.Models; namespace QuantConnect { /// <summary> /// Custom Data Type: CNX Nifty data from NSE /// http://www.nseindia.com/ /// </summary> public class Nifty : BaseData { public decimal Open = 0; public decimal High = 0; public decimal Low = 0; public decimal Close = 0; public Nifty() { this.Symbol = "NIFTY"; } public override string GetSource(SubscriptionDataConfig config, DateTime date, DataFeedEndpoint datafeed) { return "https://www.dropbox.com/s/9dzb6spi38rweit/CNXNIFTY.csv?dl=1"; } public override BaseData Reader(SubscriptionDataConfig config, string line, DateTime date, DataFeedEndpoint datafeed) { //New Nifty object Nifty index = new Nifty(); try { //Example File Format: //Date, Open High Low Close Volume Turnover //2011-09-13 7792.9 7799.9 7722.65 7748.7 116534670 6107.78 string[] data = line.Split(','); //Dates must be in the format YYYY-MM-DD. If your data source does not have this format, you must use //DateTime.ParseExact() and explicit declare the format your data source has. index.Time = DateTime.Parse(data[0]); index.Open = Convert.ToDecimal(data[1]); index.High = Convert.ToDecimal(data[2]); index.Low = Convert.ToDecimal(data[3]); index.Close = Convert.ToDecimal(data[4]); index.Symbol = "NIFTY"; //We need to de index.Value = index.Close; } catch { } return index; } } }
using System; using System.Collections; using System.Collections.Generic; using QuantConnect.Securities; using QuantConnect.Models; using System.Linq; using MathNet.Numerics.Statistics; namespace QuantConnect { /// <summary> /// Make a list of common dates to hold price data /// </summary> public class CorrelationPair { public DateTime Date = new DateTime(); public Dictionary<string, double> Prices = new Dictionary<string, double>(); public CorrelationPair() { Prices = new Dictionary<string, double>(); Date = new DateTime(); } public void Add(string symbol, decimal price) { Prices.Add(symbol, Convert.ToDouble(price)); } public CorrelationPair(DateTime date) { Date = date.Date; Prices = new Dictionary<string, double>(); } } }