Overall Statistics |
Total Trades 3259 Average Win 0.22% Average Loss -0.06% Compounding Annual Return -0.850% Drawdown 14.200% Expectancy -0.028 Net Profit -2.118% Sharpe Ratio 0.004 Probabilistic Sharpe Ratio 5.768% Loss Rate 78% Win Rate 22% Profit-Loss Ratio 3.38 Alpha 0.056 Beta -0.354 Annual Standard Deviation 0.135 Annual Variance 0.018 Information Ratio -0.463 Tracking Error 0.337 Treynor Ratio -0.002 Total Fees $4433.31 |
namespace QuantConnect.Algorithm.CSharp { using QuantConnect.Algorithm; using QuantConnect.Algorithm.Framework.Alphas; using QuantConnect.Algorithm.Framework.Execution; using QuantConnect.Algorithm.Framework.Portfolio; using QuantConnect.Algorithm.Framework.Risk; using QuantConnect.Algorithm.Framework.Selection; using QuantConnect.Data; using QuantConnect.Data.UniverseSelection; using QuantConnect.Orders; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; public class EmaCrossAlphaModelX : EmaCrossAlphaModel { public EmaCrossAlphaModelX(int fastPeriod = 12, int slowPeriod = 26, Resolution resolution = Resolution.Daily) : base(fastPeriod, slowPeriod, resolution) { } public override IEnumerable<Insight> Update(QCAlgorithm algorithm, Slice data) { return base.Update(algorithm, data); } public override void OnSecuritiesChanged(QCAlgorithm algorithm, SecurityChanges changes) { base.OnSecuritiesChanged(algorithm, changes); } } public class StandardDeviationExecutionModelX : StandardDeviationExecutionModel { public StandardDeviationExecutionModelX(int period = 60, decimal deviations = 2, Resolution resolution = Resolution.Hour) : base(period, deviations, resolution) { } public override void Execute(QCAlgorithm algorithm, IPortfolioTarget[] targets) { base.Execute(algorithm, targets); } public override void OnSecuritiesChanged(QCAlgorithm algorithm, SecurityChanges changes) { base.OnSecuritiesChanged(algorithm, changes); } } public class InsightWeightingPortfolioConstructionModelX : InsightWeightingPortfolioConstructionModel { public override IEnumerable<IPortfolioTarget> CreateTargets(QCAlgorithm algorithm, Insight[] insights) { return base.CreateTargets(algorithm, insights); } public override void OnSecuritiesChanged(QCAlgorithm algorithm, SecurityChanges changes) { base.OnSecuritiesChanged(algorithm, changes); } } public class MaximumUnrealizedProfitPercentPerSecurityX : MaximumUnrealizedProfitPercentPerSecurity { public MaximumUnrealizedProfitPercentPerSecurityX(decimal maximumUnrealizedProfitPercent = 0.05M) : base(maximumUnrealizedProfitPercent) { } public override IEnumerable<IPortfolioTarget> ManageRisk(QCAlgorithm algorithm, IPortfolioTarget[] targets) { return base.ManageRisk(algorithm, targets); } public override void OnSecuritiesChanged(QCAlgorithm algorithm, SecurityChanges changes) { base.OnSecuritiesChanged(algorithm, changes); } } public class SeparatedConcernEMAWeighted : QCAlgorithm { public Dictionary<int, Insight> insights = new Dictionary<int, Insight>(); int i = 0; //random stock picks. replace these with your own picks public List<string> tickers = new List<string> { "GILD", "ABMD", "UNH", "ALXN", "BLK", "HFC", "KSU" }; public override void Initialize() { SetStartDate(2018, 4, 5); //Set Start Date SetCash(100000); //Set Strategy Cash // // AddEquity("SPY", Resolution.Hour); AddAlpha(new EmaCrossAlphaModel(50, 200, Resolution.Hour)); SetExecution(new StandardDeviationExecutionModelX(60, 2, Resolution.Hour)); SetPortfolioConstruction(new InsightWeightingPortfolioConstructionModelX()); SetRiskManagement(new MaximumUnrealizedProfitPercentPerSecurityX(0.03m)); UniverseSettings.Resolution = Resolution.Hour; var symbols = tickers.Select(t => QuantConnect.Symbol.Create(t, SecurityType.Equity, Market.USA)).ToArray(); SetUniverseSelection(new ManualUniverseSelectionModel(symbols)); InsightsGenerated += SeparatedConcernEMAWeighted_InsightsGenerated; } private void SeparatedConcernEMAWeighted_InsightsGenerated(Interfaces.IAlgorithm algorithm, GeneratedInsightsCollection eventData) { //Insight.CloseTimeUtc //Insight.Confidence //Insight.Direction //Insight.EstimatedValue //Insight.GeneratedTimeUtc //Insight.GroupId //Insight.Id //Insight.Magnitude //Insight.Period //Insight.ReferenceValue //Insight.ReferenceValueFinal //Insight.Score //Insight.SourceModel //Insight.Symbol //Insight.Type //Insight.Weight //this.EmitInsights foreach (var insight in eventData.Insights) { insights.Add(i++, insight); } //delete old insights var keys = new List<int>(); foreach(var kvp in insights) { if(kvp.Value.IsActive(Time) == false) { keys.Add(kvp.Key); } } keys.ForEach(k => insights.Remove(k)); } public static OrderDirection ItoODir(InsightDirection direction) { switch(direction) { case InsightDirection.Down: return OrderDirection.Sell; case InsightDirection.Up: return OrderDirection.Buy; default : return OrderDirection.Hold; } } /// OnData event is the primary entry point for your algorithm. Each new data point will be pumped in here. /// Slice object keyed by symbol containing the stock data public override void OnData(Slice data) { //foreach (var target in PortfolioConstruction.CreateTargets(this, insights.Values.ToArray())) foreach(var insight in insights) { if(data.ContainsKey(insight.Value.Symbol) == false) continue; var cash = Portfolio.Cash; var holding = Portfolio[insight.Value.Symbol]; //holding.SetHoldings(holding.Price, Portfolio.GetMarginRemaining(insight.Value.Symbol, ItoODir(insight.Value.Direction))); if(insight.Value.Direction == InsightDirection.Up) { SetHoldings(insight.Value.Symbol, 1.0m/tickers.Count); //Debug(insight.Value.Symbol.Value + ": before; " + cash + ", after; " + Portfolio.Cash); } if(insight.Value.Direction == InsightDirection.Down) { SetHoldings(insight.Value.Symbol, -1.0m/tickers.Count); //Debug(insight.Value.Symbol.Value + ": before; " + cash + ", after; " + Portfolio.Cash); } } } public override void OnWarmupFinished() { } public override void OnOrderEvent(OrderEvent orderEvent) { } public override void OnSecuritiesChanged(SecurityChanges changes) { } } }