| Overall Statistics |
|
Total Trades 0 Average Win 0% Average Loss 0% Compounding Annual Return 0% Drawdown 0% Expectancy 0 Net Profit 0% Sharpe Ratio 0 Probabilistic Sharpe Ratio 0% Loss Rate 0% Win Rate 0% Profit-Loss Ratio 0 Alpha 0 Beta 0 Annual Standard Deviation 0 Annual Variance 0 Information Ratio 0.441 Tracking Error 0.2 Treynor Ratio 0 Total Fees $0.00 Estimated Strategy Capacity $0 Lowest Capacity Asset |
#region imports
from AlgorithmImports import *
#endregion
class VixCalendarSpread(QCAlgorithm):
def Initialize(self):
self.cap = 400000
self.leverage = 1.
self.SetStartDate(2021, 12, 8) # Set Start Date
self.SetCash(self.cap)
self.vix = self.AddFuture(
ticker=Futures.Indices.VIX,
resolution=Resolution.Hour,
dataNormalizationMode = DataNormalizationMode.Raw,
dataMappingMode = DataMappingMode.LastTradingDay,
contractDepthOffset = 0
)
self.AddEquity("SPY")
self.Schedule.On(
self.DateRules.EveryDay("SPY"),
self.TimeRules.AfterMarketOpen("SPY", 60),
self.Rebalance)
self.orderWeights = {}
self.isExpired = False
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
self.chain = slice.FuturesChains.get(self.vix.Symbol.Canonical)
if not self.chain: return
contracts = [c for c in self.chain.Value]
if len(contracts) < 1: return
self.isExpired = False
sortedChain = sorted(contracts, key = lambda x: x.Expiry, reverse=False)
self.contractSymbols = [x.Symbol for x in sortedChain[:2]]
front, second = self.contractSymbols
self.orderWeights[front] = -1
self.orderWeights[second] = 1
self.Debug(f"Short {sortedChain[0].Symbol}, long {sortedChain[1].Symbol}")
def Rebalance(self):
if len(self.orderWeights) < 0: return
for symbol, holding in self.Portfolio.items():
if symbol in self.orderWeights:
self.orderWeights[symbol] -= holding.Quantity
self.orderWeights[symbol] = -holding.Quantity
for symbol, quantity in self.orderWeights.items():
if quantity!=0:
self.MarketOrder(symbol, quantity)