Overall Statistics |
Total Orders 199 Average Win 5.76% Average Loss -2.85% Compounding Annual Return 6.997% Drawdown 42.100% Expectancy 0.314 Start Equity 100000 End Equity 186801.39 Net Profit 86.801% Sharpe Ratio 0.245 Sortino Ratio 0.173 Probabilistic Sharpe Ratio 0.560% Loss Rate 57% Win Rate 43% Profit-Loss Ratio 2.03 Alpha 0.033 Beta 0.232 Annual Standard Deviation 0.208 Annual Variance 0.043 Information Ratio -0.115 Tracking Error 0.235 Treynor Ratio 0.219 Total Fees $3256.30 Estimated Strategy Capacity $360000000.00 Lowest Capacity Asset NVDA RHM8UTD8DT2D Portfolio Turnover 4.35% |
#region imports using System; using System.Collections; using System.Collections.Generic; using System.Linq; using System.Globalization; using System.Drawing; using QuantConnect; using QuantConnect.Algorithm.Selection; using QuantConnect.Algorithm.Framework; using QuantConnect.Algorithm.Framework.Selection; using QuantConnect.Algorithm.Framework.Alphas; using QuantConnect.Algorithm.Framework.Portfolio; using QuantConnect.Algorithm.Framework.Execution; using QuantConnect.Algorithm.Framework.Risk; using QuantConnect.Parameters; using QuantConnect.Benchmarks; using QuantConnect.Brokerages; using QuantConnect.Util; using QuantConnect.Interfaces; using QuantConnect.Algorithm; using QuantConnect.Indicators; using QuantConnect.Data; using QuantConnect.Data.Consolidators; using QuantConnect.Data.Custom; using QuantConnect.DataSource; using QuantConnect.Data.Fundamental; using QuantConnect.Data.Market; using QuantConnect.Data.UniverseSelection; using QuantConnect.Notifications; using QuantConnect.Orders; using QuantConnect.Orders.Fees; using QuantConnect.Orders.Fills; using QuantConnect.Orders.Slippage; using QuantConnect.Scheduling; using QuantConnect.Securities; using QuantConnect.Securities.Equity; using QuantConnect.Securities.Future; using QuantConnect.Securities.Option; using QuantConnect.Securities.Positions; using QuantConnect.Securities.Forex; using QuantConnect.Securities.Crypto; using QuantConnect.Securities.Interfaces; using QuantConnect.Storage; using QCAlgorithmFramework = QuantConnect.Algorithm.QCAlgorithm; using QCAlgorithmFrameworkBridge = QuantConnect.Algorithm.QCAlgorithm; #endregion namespace QuantConnect.Algorithm.CSharp { public class CMFAlphaModel : AlphaModel { int period = 21; Dictionary<Symbol, ChaikinMoneyFlow> _dict = new Dictionary<Symbol, ChaikinMoneyFlow>(); public override void OnSecuritiesChanged(QCAlgorithm algorithm, SecurityChanges changes) { foreach (var security in changes.AddedSecurities) { var symbol = security.Symbol; _dict.Add(symbol, algorithm.CMF(symbol, period, Resolution.Daily)); } } public override IEnumerable<Insight> Update(QCAlgorithm algorithm, Slice data) { var timeSpanPeriod = TimeSpan.FromDays(3); // if already triggered Insight within time span period and it presents in the portfolio var alreadyTriggered = algorithm.Insights .Any(c => algorithm.Portfolio.Any(x => x.Key == c.Symbol) && algorithm.UtcTime > c.GeneratedTimeUtc && algorithm.UtcTime < c.GeneratedTimeUtc.Add(timeSpanPeriod)); if (alreadyTriggered) { return Enumerable.Empty<Insight>(); } var stocksForBuying = _dict .Where(c => c.Value.IsReady) .Where(c => c.Value.Current.Value >= 0.2m) .Select(c => Insight.Price(c.Key, timeSpanPeriod, InsightDirection.Up)) .ToList(); var stocksForSelling = _dict .Where(c => c.Value.IsReady) .Where(c => c.Value.Current.Value <= -0.2m) .Select(c => Insight.Price(c.Key, timeSpanPeriod, InsightDirection.Down)) .ToList(); var signals = new List<Insight>(); signals.AddRange(stocksForBuying); signals.AddRange(stocksForSelling); if (signals.Count == 0) { return Enumerable.Empty<Insight>(); } return Insight.Group(signals.ToArray()); } } }
#region imports using System; using System.Collections; using System.Collections.Generic; using System.Linq; using System.Globalization; using System.Drawing; using QuantConnect; using QuantConnect.Algorithm.Framework; using QuantConnect.Algorithm.Framework.Selection; using QuantConnect.Algorithm.Framework.Alphas; using QuantConnect.Algorithm.Framework.Portfolio; using QuantConnect.Algorithm.Framework.Execution; using QuantConnect.Algorithm.Framework.Risk; using QuantConnect.Algorithm.Selection; using QuantConnect.Parameters; using QuantConnect.Benchmarks; using QuantConnect.Brokerages; using QuantConnect.Util; using QuantConnect.Interfaces; using QuantConnect.Algorithm; using QuantConnect.Indicators; using QuantConnect.Data; using QuantConnect.Data.Consolidators; using QuantConnect.Data.Custom; using QuantConnect.DataSource; using QuantConnect.Data.Fundamental; using QuantConnect.Data.Market; using QuantConnect.Data.UniverseSelection; using QuantConnect.Notifications; using QuantConnect.Orders; using QuantConnect.Orders.Fees; using QuantConnect.Orders.Fills; using QuantConnect.Orders.Slippage; using QuantConnect.Scheduling; using QuantConnect.Securities; using QuantConnect.Securities.Equity; using QuantConnect.Securities.Future; using QuantConnect.Securities.Option; using QuantConnect.Securities.Forex; using QuantConnect.Securities.Crypto; using QuantConnect.Securities.Interfaces; using QuantConnect.Storage; using QCAlgorithmFramework = QuantConnect.Algorithm.QCAlgorithm; using QCAlgorithmFrameworkBridge = QuantConnect.Algorithm.QCAlgorithm; #endregion namespace QuantConnect.Algorithm.CSharp { public class RetrospectiveApricotElephant : QCAlgorithm { public override void Initialize() { SetStartDate(2015, 1, 1); SetCash(100000); this.UniverseSettings.Resolution = Resolution.Hour; AddUniverseSelection(new StockUniverseSelectionModel()); AddAlpha(new CMFAlphaModel()); SetPortfolioConstruction(new EqualWeightingPortfolioConstructionModel()); SetExecution(new ImmediateExecutionModel()); // SetExecution(new ScheduledExecutionModel(TimeSpan.FromHours(15))); // at 3PM } } }
#region imports using System; using System.Collections; using System.Collections.Generic; using System.Linq; using System.Globalization; using System.Drawing; using QuantConnect; using QuantConnect.Algorithm.Framework; using QuantConnect.Algorithm.Framework.Selection; using QuantConnect.Algorithm.Framework.Alphas; using QuantConnect.Algorithm.Framework.Portfolio; using QuantConnect.Algorithm.Framework.Execution; using QuantConnect.Algorithm.Framework.Risk; using QuantConnect.Algorithm.Selection; using QuantConnect.Parameters; using QuantConnect.Benchmarks; using QuantConnect.Brokerages; using QuantConnect.Util; using QuantConnect.Interfaces; using QuantConnect.Algorithm; using QuantConnect.Indicators; using QuantConnect.Data; using QuantConnect.Data.Consolidators; using QuantConnect.Data.Custom; using QuantConnect.DataSource; using QuantConnect.Data.Fundamental; using QuantConnect.Data.Market; using QuantConnect.Data.UniverseSelection; using QuantConnect.Notifications; using QuantConnect.Orders; using QuantConnect.Orders.Fees; using QuantConnect.Orders.Fills; using QuantConnect.Orders.Slippage; using QuantConnect.Scheduling; using QuantConnect.Securities; using QuantConnect.Securities.Equity; using QuantConnect.Securities.Future; using QuantConnect.Securities.Option; using QuantConnect.Securities.Forex; using QuantConnect.Securities.Crypto; using QuantConnect.Securities.Interfaces; using QuantConnect.Storage; using QCAlgorithmFramework = QuantConnect.Algorithm.QCAlgorithm; using QCAlgorithmFrameworkBridge = QuantConnect.Algorithm.QCAlgorithm; #endregion namespace QuantConnect.Algorithm.CSharp { public class ScheduledExecutionModel : ExecutionModel { private readonly TimeSpan _triggerTime; public ScheduledExecutionModel(TimeSpan triggerTime) { _triggerTime = triggerTime; } public override void Execute(QCAlgorithm algorithm, IPortfolioTarget[] targets) { foreach (var target in targets.OrderTargetsByMarginImpact(algorithm)) { var security = algorithm.Securities[target.Symbol]; // calculate remaining quantity to be ordered var quantity = OrderSizing.GetUnorderedQuantity(algorithm, target, security); if (quantity != 0) { if (security.BuyingPowerModel.AboveMinimumOrderMarginPortfolioPercentage(security, quantity, algorithm.Portfolio, algorithm.Settings.MinimumOrderMarginPortfolioPercentage)) { algorithm.Schedule.On(algorithm.DateRules.Today, algorithm.TimeRules.At(_triggerTime), () => algorithm.MarketOrder(security, quantity)); } else if (!PortfolioTarget.MinimumOrderMarginPercentageWarningSent.HasValue) { // will trigger the warning if it has not already been sent PortfolioTarget.MinimumOrderMarginPercentageWarningSent = false; } } } } } }
#region imports using System; using System.Collections; using System.Collections.Generic; using System.Linq; using System.Globalization; using System.Drawing; using QuantConnect; using QuantConnect.Algorithm.Selection; using QuantConnect.Algorithm.Framework; using QuantConnect.Algorithm.Framework.Selection; using QuantConnect.Algorithm.Framework.Alphas; using QuantConnect.Algorithm.Framework.Portfolio; using QuantConnect.Algorithm.Framework.Execution; using QuantConnect.Algorithm.Framework.Risk; using QuantConnect.Parameters; using QuantConnect.Benchmarks; using QuantConnect.Brokerages; using QuantConnect.Util; using QuantConnect.Interfaces; using QuantConnect.Algorithm; using QuantConnect.Indicators; using QuantConnect.Data; using QuantConnect.Data.Consolidators; using QuantConnect.Data.Custom; using QuantConnect.DataSource; using QuantConnect.Data.Fundamental; using QuantConnect.Data.Market; using QuantConnect.Data.UniverseSelection; using QuantConnect.Notifications; using QuantConnect.Orders; using QuantConnect.Orders.Fees; using QuantConnect.Orders.Fills; using QuantConnect.Orders.Slippage; using QuantConnect.Scheduling; using QuantConnect.Securities; using QuantConnect.Securities.Equity; using QuantConnect.Securities.Future; using QuantConnect.Securities.Option; using QuantConnect.Securities.Positions; using QuantConnect.Securities.Forex; using QuantConnect.Securities.Crypto; using QuantConnect.Securities.Interfaces; using QuantConnect.Storage; using QCAlgorithmFramework = QuantConnect.Algorithm.QCAlgorithm; using QCAlgorithmFrameworkBridge = QuantConnect.Algorithm.QCAlgorithm; #endregion namespace QuantConnect.Algorithm.CSharp { public class StockUniverseSelectionModel : ManualUniverseSelectionModel { public StockUniverseSelectionModel() : base(SelectSymbols()) { } public static IEnumerable<Symbol> SelectSymbols() { // // var tickers = new[] { "NVDA", "MMM", "ABBV", "MSFT", "TSLA", "COIN", "V", "NFLX", "MCD" }; var tickers = new[] {"NVDA"}; return tickers.Select(ticker => QuantConnect.Symbol.Create(ticker, SecurityType.Equity, Market.USA)); } } }