Overall Statistics |
Total Trades 9991 Average Win 0.42% Average Loss -0.46% Compounding Annual Return 3.456% Drawdown 31.500% Expectancy 0.035 Net Profit 97.474% Sharpe Ratio 0.303 Probabilistic Sharpe Ratio 0.010% Loss Rate 46% Win Rate 54% Profit-Loss Ratio 0.92 Alpha -0.002 Beta 0.364 Annual Standard Deviation 0.093 Annual Variance 0.009 Information Ratio -0.433 Tracking Error 0.124 Treynor Ratio 0.078 Total Fees $458009.51 Estimated Strategy Capacity $170000000.00 Lowest Capacity Asset SPY R735QTJ8XC9X |
from AlgorithmImports import * class PTLbuySellOpen(QCAlgorithm): def Initialize(self): self.SetStartDate(2002, 8, 1)# set start and end date for backtest self.SetEndDate(2022, 8, 5) self.SetCash(1000000) # initialize cash balance self.security = self.AddEquity("SPY", Resolution.Minute)# add an equity self.security.SetFeeModel(ConstantFeeModel(0)) self.security.SetFeeModel(SecurityMarginModel(3)) self.closingOrderSent = False # defualt false # use Interactive Brokers model for fees self.SetBrokerageModel(BrokerageName.InteractiveBrokersBrokerage, AccountType.Margin) self.Schedule.On(self.DateRules.EveryDay(self.security.Symbol), self.TimeRules.AfterMarketOpen(self.security.Symbol, 1), self.SellOpen) # benchmark against S&P 500 self.SetBenchmark("SPY") def SellOpen(self): if self.Portfolio.Invested: self.Liquidate() self.closingOrderSent = False 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 self.Time.hour == 15 and not self.Portfolio.Invested and not self.closingOrderSent: quantity = self.CalculateOrderQuantity(self.security.Symbol, 1) self.MarketOnCloseOrder(self.security.Symbol, quantity) self.closingOrderSent = True self.Debug("Purchased Stock") def OnEndOfAlgorithm(self): self.Debug("Final portfolio value: " + str(self.Portfolio.TotalPortfolioValue))