Overall Statistics |
Total Trades 355 Average Win 2.49% Average Loss -3.27% Compounding Annual Return 5.066% Drawdown 64.100% Expectancy 0.121 Net Profit 54.202% Sharpe Ratio 0.293 Probabilistic Sharpe Ratio 0.782% Loss Rate 36% Win Rate 64% Profit-Loss Ratio 0.76 Alpha 0.083 Beta 0.053 Annual Standard Deviation 0.305 Annual Variance 0.093 Information Ratio -0.117 Tracking Error 0.337 Treynor Ratio 1.693 Total Fees $13061.29 |
from Execution.ImmediateExecutionModel import ImmediateExecutionModel from datetime import datetime, timedelta from QuantConnect.Data.Custom.CBOE import CBOE import numpy as np class WhoPredictsWho(QCAlgorithm): def Initialize(self): self.SetStartDate(2011, 11, 1) self.SetEndDate(datetime.today()) self.SetCash(1000000) self.spy = self.AddEquity("SPY", Resolution.Daily).Symbol # Leveraged ETF: self.uvxy = self.AddEquity("UVXY", Resolution.Daily).Symbol self.SetBenchmark("SPY") # The algorithm does not perform intraday operations: self.UniverseSettings.Resolution = Resolution.Daily self.SetBrokerageModel(AlphaStreamsBrokerageModel()) self.SetExecution(ImmediateExecutionModel()) self.SetPortfolioConstruction( InsightWeightingPortfolioConstructionModel( lambda time: None)) # VIX data: self.vix = self.AddData(CBOE, 'VIX', Resolution.Daily).Symbol # Initialize Alpha and Universe Selection self.AddAlpha(PredictWho(self, self.vix, self.spy, self.uvxy)) class PredictWho(AlphaModel): """ A very simple volatility-predicted VIX model. """ def __init__(self, algorithm, vix_symbol, spy_symbol, uvxy_symbol): # Symbols: self.vix = vix_symbol self.spy = spy_symbol self.uvxy = uvxy_symbol #Holding Period: self.holding_period = 22 self.gain_target = 0.10 #Placeholder def Update(self, algorithm, data): insights = [] time = timedelta(days=self.holding_period) i_type = InsightType.Price if not data.HasData: return [] # History calls do load the backtest a lot. It is better to use # "deque" objects to hold this short (22 day) closing data. In this # case the test is very short and is not taking up much time: history = algorithm.History(self.spy, 22, Resolution.Daily) vol_22D = np.sqrt(252)*history['close'].rolling(22).std()[-1] if vol_22D > 150: for security in algorithm.Securities.Values: if security.Invested: direction = InsightDirection.Flat insight = Insight(security.Symbol, time, i_type, direction, self.gain_target, 1, "PredictWho", 1) insights.append(insight) return insights if vol_22D > 80: if algorithm.Securities[self.spy].Invested: direction = InsightDirection.Flat insight = Insight(self.spy, time, i_type, direction, self.gain_target, 1, "PredictWho", 1) insights.append(insight) if algorithm.Securities[self.uvxy].Invested: return insights direction = InsightDirection.Up insight = Insight(self.uvxy, time, i_type, direction, self.gain_target, 1, "PredictWho", 1) insights.append(insight) return insights if vol_22D < 80: if algorithm.Securities[self.spy].Invested: return [] direction = InsightDirection.Up insight = Insight(self.spy, time, i_type, direction, self.gain_target, 1, "PredictWho", 1) insights.append(insight) return insights