Overall Statistics |
Total Trades 1242 Average Win 0.25% Average Loss -0.12% Compounding Annual Return 9.219% Drawdown 16.900% Expectancy 1.762 Net Profit 353.092% Sharpe Ratio 0.957 Probabilistic Sharpe Ratio 35.804% Loss Rate 7% Win Rate 93% Profit-Loss Ratio 1.97 Alpha 0.043 Beta 0.271 Annual Standard Deviation 0.068 Annual Variance 0.005 Information Ratio -0.123 Tracking Error 0.127 Treynor Ratio 0.241 Total Fees $1247.67 Estimated Strategy Capacity $220000000.00 Lowest Capacity Asset BGU U7EC123NWZTX |
""" Covered puts """ from datetime import timedelta class AdaptableYellowGreenJaguar(QCAlgorithm): def Initialize(self): self.SetStartDate(2015, 1, 1) self.SetEndDate(2020, 1, 1) self.SetCash(100000) self.ticker = "SPY" self.equity = self.AddEquity(self.ticker, Resolution.Minute) self.option = self.AddOption(self.ticker, Resolution.Minute) self.symbol = self.option.Symbol self.option.SetFilter(-100, 0, timedelta(0), timedelta(30)) self.SetBenchmark(self.equity.Symbol) # TODO: Schedule once a month def OnData(self, data): if not self.Portfolio[self.ticker].Invested: self.SetHoldings(self.equity.Symbol, 0.99) option_invested = [x.Key for x in self.Portfolio if x.Value.Invested and x.Value.Type==SecurityType.Option] if len(option_invested) < 1: self.TradeOptions(data) def TradeOptions(self, data): for i in data.OptionChains: if i.Key != self.symbol: continue chain = i.Value call = [x for x in chain if x.Right == OptionRight.Put] # sorted the contracts according to their expiration dates and choose the ATM options contracts = sorted(sorted(call, key = lambda x: abs(chain.Underlying.Price - x.Strike)), key = lambda x: x.Expiry, reverse=True) [self.print_option(c) for c in contracts] if len(contracts) == 0: return put = contracts[0].Symbol self.SetHoldings(self.equity.Symbol, 0.01) def OnOrderEvent(self, orderEvent): self.Log(str(orderEvent)) def print_option(self, contract): self.Debug(f"{contract.Symbol.Value}, strike: {contract.Strike}, Delta: {contract.Greeks.Delta}, Vega: {contract.Greeks.Vega}, Last Price: {contract.LastPrice}, Underlying Price: {contract.UnderlyingLastPrice}")
class StaticBarbell(QCAlgorithm): def Initialize(self): self.SetStartDate(2005, 1, 1) # Set Start Date self.SetCash(10000) # Set Strategy Cash self.SetBrokerageModel(BrokerageName.AlphaStreams) self.stock = self.AddEquity("SPXL", Resolution.Daily) # SPXL, FIHD self.safe = self.AddEquity("IEF", Resolution.Daily) # IEF self.insurance = self.AddEquity("VIXY", Resolution.Daily) self.insu_ratio = 0.01 self.stock_ratio = 0.20 self.safe_ratio = 1.0 - self.insu_ratio - self.stock_ratio self.Schedule.On(self.DateRules.WeekStart("SPXL"), self.TimeRules.At(10, 0, 0), self.RebalancePortfolio) def RebalancePortfolio(self): self.SetPosition(self.stock, self.stock_ratio) self.SetPosition(self.safe, self.safe_ratio) self.SetPosition(self.insurance, self.insu_ratio) def SetPosition(self, asset, share): if self.IsMarketOpen(asset.Symbol) and asset.Price > 0: self.SetHoldings(asset.Symbol, share)
""" ML Version of Black Swan Model @version: 0.1 """ import clr clr.AddReference("System") clr.AddReference("QuantConnect.Algorithm") clr.AddReference("QuantConnect.Common") from System import * from QuantConnect import * from QuantConnect.Algorithm import * from QuantConnect.Algorithm.Framework.Execution import * import pandas as pd pd.set_option('mode.use_inf_as_na', True) from sklearn.pipeline import Pipeline from sklearn.preprocessing import MinMaxScaler from sklearn.neural_network import MLPRegressor import features as ft STEPS = [("scaler", MinMaxScaler()), ("model", MLPRegressor(n_iter_no_change=1, early_stopping=True))] class MLCryptoAlgo(QCAlgorithm): def Initialize(self): self.SetStartDate(2010, 1, 1) self.SetCash(100000) self.Settings.FreePortfolioValuePercentage = 0.05 self.resolution = Resolution.Daily self.tickers = ["SPXL", "IEF", "VIXY"] self.SetBenchmark("SPY") [self.AddEquity(t, self.resolution) for t in self.tickers] self.lookback = 252 self.train_days = timedelta(365 * 5) self.test_days = timedelta(365 * 2) self.test_start = None self.model = Pipeline(steps=STEPS) self.Train(self.DateRules.WeekStart(), self.TimeRules.At(0, 0), self.train_model) self.Schedule.On(self.DateRules.EveryDay("SPXL"), self.TimeRules.AfterMarketOpen("SPXL", 5), self.trade) def train_model(self): self.test_start = self.Time-self.test_days train_start = self.test_start-self.train_days x_train, y_train = self.get_data(train_start, self.test_start) self.model.fit(x_train, y_train) x_test, y_test = self.get_data(self.test_start, self.Time) score = self.model.score(x_test, y_test) self.Debug(f"Model score {score:.2f}") def trade(self): if self.test_start is not None: self.Transactions.CancelOpenOrders() x_pred = self.get_data(self.test_start, self.Time, include_y=False) x_pred = x_pred.sort_index().groupby("symbol").last() symbols = x_pred.index.get_level_values("symbol") y_pred = pd.Series(self.model.predict(x_pred), index=symbols) positions = y_pred.clip(lower=0) positions = (positions/sum(positions)).fillna(0) self.Debug(f"{self.Time} - {positions}") [self.SetHoldings(sym, pos) for sym, pos in positions.iteritems()] def get_data(self, start, end, include_y=True): tickers = list(self.ActiveSecurities.Keys) history = self.History(tickers, start, end, self.resolution) history.eval("volatility = high - low", inplace=True) features = ft.sequence(history[["close", "volume", "volatility"]], lookback=self.lookback).dropna() target = history["close"].groupby("symbol").pct_change(1).shift(-1) if include_y: target = target.reindex_like(features).dropna() return features.loc[target.index], target else: return features
class StaticBarbell(QCAlgorithm): def Initialize(self): self.SetStartDate(2005, 1, 1) # Set Start Date self.SetCash(10000) # Set Strategy Cash self.SetBrokerageModel(BrokerageName.AlphaStreams) self.stock = self.AddEquity("SPXL", Resolution.Daily) # SPXL, FIHD self.safe = self.AddEquity("IEF", Resolution.Daily) # IEF self.insurance = self.AddEquity("VIXY", Resolution.Daily) self.insu_ratio = 0.05 self.stock_ratio = 0.9 self.safe_ratio = 1.0 - self.insu_ratio - self.stock_ratio self.Schedule.On(self.DateRules.WeekStart("SPXL"), self.TimeRules.At(10, 0, 0), self.RebalancePortfolio) def RebalancePortfolio(self): self.SetPosition(self.stock, self.stock_ratio) self.SetPosition(self.safe, self.safe_ratio) self.SetPosition(self.insurance, self.insu_ratio) def SetPosition(self, asset, share): if self.IsMarketOpen(asset.Symbol) and asset.Price > 0: self.SetHoldings(asset.Symbol, share)
class StaticBarbell(QCAlgorithm): def Initialize(self): self.SetStartDate(2005, 1, 1) # Set Start Date self.SetCash(10000) # Set Strategy Cash self.SetBrokerageModel(BrokerageName.AlphaStreams) self.positions = {"SPXL": 0.2, "IEF": 0.8} # VIXY? [self.AddEquity(ticker) for ticker in self.positions] self.Schedule.On(self.DateRules.MonthStart("SPXL"), self.TimeRules.At(10, 0, 0), self.RebalancePortfolio) def RebalancePortfolio(self): [self.SetHoldings(t, p) for t, p in self.positions.items()]