| Overall Statistics |
|
Total Trades 175 Average Win 16.73% Average Loss -8.25% Compounding Annual Return -3.570% Drawdown 75.000% Expectancy 0.172 Net Profit -30.492% Sharpe Ratio 0.139 Probabilistic Sharpe Ratio 0.050% Loss Rate 61% Win Rate 39% Profit-Loss Ratio 2.03 Alpha 0.028 Beta 0.268 Annual Standard Deviation 0.393 Annual Variance 0.154 Information Ratio -0.107 Tracking Error 0.405 Treynor Ratio 0.204 Total Fees $269.23 Estimated Strategy Capacity $5000000.00 Lowest Capacity Asset VX Y59NU0I6SFS9 |
#region imports
from AlgorithmImports import *
#endregion
class VixCalendarSpread(QCAlgorithm):
def Initialize(self):
self.cap = 40000
self.leverage = 1.
self.SetStartDate(2012, 12, 13) # Set Start Date
self.SetCash(self.cap)
self.vix = self.AddFuture(
ticker=Futures.Indices.VIX,
resolution=Resolution.Minute,
dataMappingMode=DataMappingMode.LastTradingDay,
dataNormalizationMode=DataNormalizationMode.Raw,
contractDepthOffset=0,
fillDataForward=True
)
self.vix.SetFilter(0, 90)
self.AddEquity("SPY")
self.Schedule.On(
self.DateRules.EveryDay("SPY"),
self.TimeRules.AfterMarketOpen("SPY", 60),
self.Rebalance)
self.isExpired = True
self.orderWeights = {}
def OnData(self, slice) -> None:
for changedEvent in slice.SymbolChangedEvents.Values:
if changedEvent.Symbol == self.vix.Symbol: self.isExpired = True
if not self.isExpired: return
chain = slice.FuturesChains.get(self.vix.Symbol)
if not chain: return
contracts = [symbol for symbol, contract in chain.Contracts.items()]
if len(contracts) < 2: return
self.isExpired = False
self.orderWeights = {}
self.orderWeights[contracts[0]] = -1
self.orderWeights[contracts[1]] = 1
def Rebalance(self):
if len(self.orderWeights) < 1: return
for symbol, holding in self.Portfolio.items():
self.orderWeights[symbol] = self.orderWeights.get(symbol, 0)-holding.Quantity
for symbol, quantity in self.orderWeights.items():
if quantity!=0:
self.MarketOrder(symbol, quantity)
self.orderWeights = {}