Overall Statistics |
Total Trades 0 Average Win 0% Average Loss 0% Compounding Annual Return 0% Drawdown 0% Expectancy 0 Net Profit 0% Sharpe Ratio 0 Probabilistic Sharpe Ratio 0% Loss Rate 0% Win Rate 0% Profit-Loss Ratio 0 Alpha 0 Beta 0 Annual Standard Deviation 0 Annual Variance 0 Information Ratio -19.439 Tracking Error 0.132 Treynor Ratio 0 Total Fees $0.00 Estimated Strategy Capacity $0 |
from clr import AddReference AddReference("System") AddReference("QuantConnect.Algorithm") AddReference("QuantConnect.Algorithm.Framework") AddReference("QuantConnect.Common") from QuantConnect import * from QuantConnect.Parameters import * from QuantConnect.Benchmarks import * from QuantConnect.Brokerages import * from QuantConnect.Util import * from QuantConnect.Interfaces import * from QuantConnect.Algorithm import * from QuantConnect.Algorithm.Framework import * from QuantConnect.Algorithm.Framework.Selection import * from QuantConnect.Algorithm.Framework.Alphas import * from QuantConnect.Algorithm.Framework.Portfolio import * from QuantConnect.Algorithm.Framework.Execution import * from QuantConnect.Algorithm.Framework.Risk import * from QuantConnect.Indicators import * from QuantConnect.Data import * from QuantConnect.Data.Consolidators import * from QuantConnect.Data.Custom import * from QuantConnect.Data.Fundamental import * from QuantConnect.Data.Market import * from QuantConnect.Data.UniverseSelection import * from QuantConnect.Notifications import * from QuantConnect.Orders import * from QuantConnect.Orders.Fees import * from QuantConnect.Orders.Fills import * from QuantConnect.Orders.Slippage import * from QuantConnect.Scheduling import * from QuantConnect.Securities import * from QuantConnect.Securities.Equity import * from QuantConnect.Securities.Forex import * from QuantConnect.Securities.Interfaces import * from datetime import date, datetime, timedelta from QuantConnect.Python import * from QuantConnect.Storage import * QCAlgorithmFramework = QCAlgorithm QCAlgorithmFrameworkBridge = QCAlgorithm import calendar class FirstDaySPY(QCAlgorithmFramework): """Buy on close on the last day of the month and sell on the close of the next day""" def Initialize(self): self.SetStartDate(2020, 8, 29) # Set Start Date self.SetEndDate(2020, 9, 2) self.SetCash(100000) # Set Strategy Cash # Parameters self.maximumDuration = 1 # maximum duration to keep trades open # Universe self.UniverseSettings.Resolution = Resolution.Daily self.AddUniverseSelection(CoarseFundamentalUniverseSelectionModel(self.SelectCoarse)) self.AddAlpha(FirstDayAlphaModel()) self.SetPortfolioConstruction(EqualWeightingPortfolioConstructionModel()) self.AddRiskManagement(FixedDurationTrades(self.maximumDuration)) # TODO: verify this, I want to buy on close at the end of the last day and sell on close of the next day self.SetExecution(ImmediateExecutionModel()) self.Debug("test") def SelectCoarse(self, coarse): self.Debug(f"Select coarse time: {self.Time}") sortedByDollarVolume = sorted(coarse, key=lambda x: x.DollarVolume, reverse=True) isETF = [x.Symbol for x in sortedByDollarVolume if not x.HasFundamentalData] self.Debug(f"{len(sortedByDollarVolume)} and {len(isETF)}") return isETF[:10] def OnSecuritiesChanged(self, changes): self._changes = changes self.Debug(f"OnSecuritiesChanged({self.UtcTime}):: {changes}") self.Log(f"OnSecuritiesChanged({self.UtcTime}):: {changes}") # def OnData(self, data): # """OnData event is the primary entry point for your algorithm. Each new data point will be pumped in here. # Arguments: # data: Slice object keyed by symbol containing the stock data # """ # # if not self.Portfolio.Invested: # # self.SetHoldings("SPY", 1) # # self.Debug("Purchased Stock") class FixedDurationTrades(RiskManagementModel): def __init__(self, maximumDuration = 1): """Provides an implementation of IRiskManagementModel that limits the maximum number of periods that we can stay in a trade""" self.maximumDuration = maximumDuration self.investedTime = {} def ManageRisk(self, algorithm, targets): riskAdjustedTargets = list() for kvp in algorithm.Securities: symbol = kvp.Key security = kvp.Value # Remove if not invested if not security.Invested: self.investedTime.pop(symbol, None) continue # Add newly invested securities if symbol not in self.investedTime: self.investedTime[symbol] = 0 # Set to 0 periods invested continue self.investedTime[symbol] += 1 if self.investedTime[symbol] >= self.maximumDuration: # liquidate securities that have reached max duration riskAdjustedTargets.append(PortfolioTarget(symbol, 0.)) self.Debug(f"Setting liquidation target for {symbol}") return riskAdjustedTargets class FirstDayAlphaModel(AlphaModel): Name = "FirstDayAlphaModel" def Update(self, algorithm, slice): # Updates this alpha model with the latest data from the algorithm. # This is called each time the algorithm receives data for subscribed securities # Generate insights on the securities in the universe. insights = [] if algorithm.Time.day == calendar.monthrange(algorithm.Time.year, algorithm.Time.month): algorithm.Log("Last Day of the month, emit Insight") symbols = [s.Symbol for s in algorithm.ActiveSecurities] # insight expiry time and direction insightExpiry = Expiry.EndOfDay(algorithm.Time) insightDirection = InsightDirection.Up # insight direction # TODO: weight by how many often this worked in the past for symbol in symbols: algorithm.Debug("Emit insight UP for symbol {symbol}") insights.append(Insight.Price(symbol, insightExpiry, insightDirection, None, None, None, None)) return insights def OnSecuritiesChanged(self, algorithm, changes): # Handle security changes in from your universe model. pass