Overall Statistics |
Total Trades 4428 Average Win 0.05% Average Loss -0.01% Compounding Annual Return 0.018% Drawdown 9.300% Expectancy 0.010 Net Profit 0.091% Sharpe Ratio 0.023 Probabilistic Sharpe Ratio 0.430% Loss Rate 79% Win Rate 21% Profit-Loss Ratio 3.74 Alpha 0.007 Beta -0.1 Annual Standard Deviation 0.04 Annual Variance 0.002 Information Ratio -0.494 Tracking Error 0.127 Treynor Ratio -0.009 Total Fees $17169.88 Estimated Strategy Capacity $290000.00 Lowest Capacity Asset TLO TT1EBZ21QWKL |
using Accord.Statistics; using System.Collections.Generic; using System.Linq; using QuantConnect.Algorithm.Framework.Alphas; using QuantConnect.Algorithm.Framework.Portfolio; using QuantConnect.Algorithm.Framework.Execution; using QuantConnect.Brokerages; namespace QuantConnect.Algorithm.CSharp { public class UncorrelatedAssetsDemo : QCAlgorithm { private List<string> _asset = new List<string>{"SHY", "TLT", "IEI", "SHV", "TLH", "EDV", "BIL", "SPTL", "TBT", "TMF", "TMV", "TBF", "VGSH", "VGIT", "VGLT", "SCHO", "SCHR", "SPTS", "GOVT"}; public override void Initialize() { // 1. Required: Five years of backtest history SetStartDate(2014, 1, 1); SetEndDate(2019, 1, 1); // 2. Required: Alpha Streams Models: SetBrokerageModel(BrokerageName.AlphaStreams); // 3. Required: Significant AUM Capacity SetCash(1000000); // 4. Required: Benchmark to SPY SetBenchmark("SPY"); SetPortfolioConstruction(new EqualWeightingPortfolioConstructionModel()); SetExecution(new ImmediateExecutionModel()); // Add Equity ------------------------------------------------ foreach(var ticker in _asset) { AddEquity(ticker, Resolution.Minute); } // Set Scheduled Event Method For Our Model. In this example, we'll rebalance every month. Schedule.On(DateRules.MonthStart(), TimeRules.BeforeMarketClose("SHY", 5), EveryDayBeforeMarketClose); } private void EveryDayBeforeMarketClose() { // Fetch history on our universe var history = History(Securities.Keys, 252*2, Resolution.Daily); if (history.Count() < 0) return; // Extract daily return of close prices for each Symbol from Slice data var returns = new Dictionary<string, List<double>>(); var last = new Dictionary<string, double>(); foreach(var slice in history){ foreach(var symbol in slice.Bars.Keys){ if(!returns.ContainsKey(symbol)){ returns.Add(symbol, new List<double>()); last.Add(symbol, (double)slice.Bars[symbol].Close); } var change = (double) ((double)slice.Bars[symbol].Close - last[symbol])/last[symbol]; last[symbol] = (double)slice.Bars[symbol].Close; returns[symbol].Add(change); } } // Convert returns into 2-d array double[,] ret = new double[returns.Values.ElementAt(0).Count - 1, _asset.Count]; int k = 0; foreach(var kvp in returns) { var symbol = kvp.Key; for(int i=0; i < returns[symbol].Count - 1; i++) { ret[i, k] = returns[symbol][i + 1]; } k++; } // Get correlation matrix var corrMatrix = Measures.Correlation(ret); // Find 5 assets with the least absolute sum correlation var correlations = new Dictionary<string, double>(); for(int i=0; i < corrMatrix.GetLength(0); i++) { var symbol = _asset[i]; if(!correlations.ContainsKey(symbol)){ correlations.Add(symbol, 0); } for (int j=0; j < corrMatrix.GetLength(1); j++) { var value_ = corrMatrix[i, j]; correlations[symbol] += value_ >= 0 ? value_ : -value_; } } var selected = correlations.OrderBy(x => x.Value).Take(5).Select(x => x.Key).ToList(); // Emit insights foreach(var symbol in selected) { var insight = new Insight(symbol, Expiry.EndOfMonth, InsightType.Price, InsightDirection.Up); EmitInsights(insight); } } } }