Overall Statistics |
Total Trades 144 Average Win 0.00% Average Loss -0.01% Compounding Annual Return -0.381% Drawdown 0.700% Expectancy -0.767 Net Profit -0.573% Sharpe Ratio -1.93 Probabilistic Sharpe Ratio 0.019% Loss Rate 83% Win Rate 17% Profit-Loss Ratio 0.36 Alpha -0.003 Beta -0.003 Annual Standard Deviation 0.002 Annual Variance 0 Information Ratio -0.443 Tracking Error 0.282 Treynor Ratio 1.291 Total Fees $144.00 |
import pandas as pd import random as rand class HorizontalResistanceInterceptor(QCAlgorithm): def Initialize(self): self.SetStartDate(2018, 10, 30) # Set Start Date self.SetEndDate(2020, 5, 1) # Set Start Date self.SetCash(100000) # Set Strategy Cash self.AddEquity("SPY", Resolution.Hour) self.orders = pd.DataFrame() self.daily_tracker = pd.DataFrame() 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 ''' # Check if the market is open market_open = self.Securities["SPY"].Exchange.Hours.IsOpen(self.Time, False) if not market_open: return # Generate random trades r = rand.random() ticket = None if r < 0.03: ticket = self.MarketOrder("SPY", 1) elif r > 0.97: ticket = self.MarketOrder("SPY", -1) # Report trades if ticket is not None: value = ticket.QuantityFilled * ticket.AverageFillPrice order = pd.DataFrame({"value" : [value]}, index=[self.Time]) self.orders = self.orders.append(order) def OnEndOfDay(self): # Determine cumulative daily buys/sells buys = 0 sells = 0 if self.orders.shape[0] > 0: buys = self.orders[self.orders.value > 0].sum().value sells = -self.orders[self.orders.value < 0].sum().value self.orders = pd.DataFrame() # Track NAV nav = self.Portfolio.TotalPortfolioValue # Add new row to our daily_tracker row = pd.DataFrame({"buys" : [buys], "sells" : [sells], "NAV": [nav]}, index=[self.Time]) self.daily_tracker = self.daily_tracker.append(row) def OnEndOfAlgorithm(self): # Shrink daily_tracker to be just the latest 12 months self.daily_tracker = self.daily_tracker[self.daily_tracker.index>= self.Time - timedelta(days=365)] # Calculate portfolio turnover buys = self.daily_tracker['buys'].sum() sells = self.daily_tracker['sells'].sum() turnover = min(buys, sells) / self.daily_tracker['NAV'].mean() self.Debug(f"\n12 Month Portfolio Turnover: {turnover}")