Overall Statistics |
Total Trades 216 Average Win 0% Average Loss 0% Compounding Annual Return 1135.673% Drawdown 1.700% Expectancy 0 Net Profit 0% Sharpe Ratio 11.225 Loss Rate 0% Win Rate 0% Profit-Loss Ratio 0 Alpha 1.742 Beta -1.361 Annual Standard Deviation 0.078 Annual Variance 0.006 Information Ratio 1.718 Tracking Error 0.135 Treynor Ratio -0.64 Total Fees $216.00 |
namespace QuantConnect { public class Step2 : QCAlgorithm { //static String[] symbols = {"SPY", "XLF", "GDX", "EEM", "USO", "EWZ", "UVXY", "JNUG", "GDXJ", "IWM", "XOP", "QQQ", "EFA", "XLE", "NUGT", "IEMG", "DUST", "XIV", "FXI", "TZA", "VWO", "XLK", "AMLP", "HYG", "XLI", "XLU", "TLT", "RSX", "UGAZ", "UCO", "GLD", "TVIX", "UNG", "SLV", "UWT", "XRT", "XBI", "DGAZ", "SDS", "VEA", "JNK", "LQD", "XLV", "XLP", "JDST", "EZU", "IAU", "KRE", "BAC", "GE", "X", "F", "AMD", "CHK", "ITUB", "NOK", "INO", "ABEV", "VALE", "AKS", "PBR", "RAD", "WFT", "SIRI", "CSCO", "CHS", "PFE", "MU", "ECA", "INTC", "NVDA", "CLF", "RF", "VRX", "AAPL", "LOW", "AUY", "STNG", "SRC", "SWN", "KMI", "FB", "BBD", "CMCSA", "GLYC", "FCAU", "C", "AVP", "VZ", "T", "TWTR", "FGL", "FCX", "OAS", "MSFT", "TEVA", "SNAP", "WLL", "HUN"}; static String[] symbols = {"QQQ", "GDX", "EEM", "USO"}; int size = (int) (1 * 7.5 * 60 * 60); float threshold = 0.001f; int timeStart = 0; int timeEnd = 60; int consolidate = 15; int scount = symbols.Count(); int i=0; int j=0; string sym1 = null; List<TradeBar> hist1 = null; string sym2 = null; List<TradeBar> hist2 = null; public override void Initialize() { Debug("---> Initialize - Start"); DateTime startTime = new DateTime(2017, 5, 22, 10, 0, 0); DateTime endTime = new DateTime(2017, 5, 22, 10, 0, 10); SetStartDate(startTime); SetEndDate(endTime); SetCash(250000); foreach (string sym in symbols) { AddEquity(sym, Resolution.Second); } Debug("---> Initialize - End"); } public override void OnData(Slice data) { //Debug("->0 " + i + ":" + scount); if (i==scount) { return; } if (sym1 == null) { sym1 = symbols[i]; hist1 = History(sym1, size).ToList(); } if (j == i) { j++; } if (j == scount) { j = 0; i++; sym1 = null; hist1.Clear(); hist1 = null; GC.Collect(); GC.WaitForPendingFinalizers(); return; } //Debug("->1"); if (sym2 == null) { sym2 = symbols[j]; hist2 = History(sym2, size).ToList(); } //Debug("->2"); //Debug(sym1 + ":" + sym2 + ":" + hist1.Count() + " - " + hist2.Count()); for (int d=timeStart; d<timeEnd; d++) { for (int c=1; c<consolidate; ++c) { float correlation = calc(hist1, hist2, d, c); if (correlation > threshold || correlation < -threshold) { string s = sym1 + ":" + sym2 + ":" + d + ":" + c + "\t" + correlation; Debug(s); MarketOrder(sym2, 100, false); } } } hist2.Clear(); hist2 = null; //Debug("->3"); j++; sym2 = null; } public override void OnEndOfAlgorithm() { Debug("OnEndOfAlgorithm"); } private float calc(List<TradeBar> hist1, List<TradeBar> hist2, int delay, int cns) { //Debug("->4"); int len1 = hist1.Count(); int len2 = hist2.Count(); int len = (len1 < len2) ? len1 : len2; len -= cns; List<float> list1 = new List<float>(); List<float> list2 = new List<float>(); for (int i=0; i<len; i+=cns) { float f1 = f(hist1, i, i+cns); list1.Add(f1); float f2 = f(hist2, i, i+cns); list2.Add(f2); } //Debug("->5"); //Debug(String.Join("; ", list1)); int cnt1 = list2.Count(); List<float> list2delayed = new List<float>(); for (int i=delay; i<cnt1; ++i) { float l2f = list2[i]; list2delayed.Add(l2f); } //Debug("->6 " + String.Join("; ", list2delayed)); list2.Clear(); list2 = null; float correlation = Correlation(list1, list2delayed); list1.Clear(); list1 = null; list2delayed.Clear(); list2delayed = null; return correlation; } private float f(List<TradeBar> bars, int s, int e) { TradeBar bar1 = bars[s]; TradeBar bar11 = bars[e-1]; float open = (float) bar11.Open; float high = 0; float low = 100000000f; float close = (float) bar1.Close; for (int i=s; i<e; ++i) { TradeBar bar = bars[i]; float l = (float) bar.Low; float h = (float) bar.High; if (l < low) { low = l; } if (h > high) { high = h; } } float half = (high + low) / 2; float f = 0; if (close > open) { if (close > half) { f = 2; } else { f = 1; } } else { if (close > half) { f = -1; } else { f = -2; } } return f; } private float Correlation(List<float> xs, List<float> ys) { // sums of x, y, x squared etc. float sx = 0; float sy = 0; float sxx = 0; float syy = 0; float sxy = 0; int n1 = xs.Count(); int n2 = ys.Count(); int n = (n1 < n2) ? n1 : n2; for (int i=0; i<n; ++i) { float x = xs[i]; float y = ys[i]; sx += x; sy += y; sxx += x * x; syy += y * y; sxy += x * y; } // covariation float cov = sxy / n - sx * sy / n / n; // standard error of x double sigmaX = Math.Sqrt(sxx / n - sx * sx / n / n); // standard error of y double sigmaY = Math.Sqrt(syy / n - sy * sy / n / n); // correlation is just a normalized covariation return (float) (cov / sigmaX / sigmaY); } } }