| Overall Statistics |
|
Total Trades 3950 Average Win 0.55% Average Loss -1.02% Compounding Annual Return 23.809% Drawdown 67.300% Expectancy 0.143 Net Profit 685.980% Sharpe Ratio 0.633 Probabilistic Sharpe Ratio 4.958% Loss Rate 26% Win Rate 74% Profit-Loss Ratio 0.54 Alpha 0.106 Beta 1.549 Annual Standard Deviation 0.424 Annual Variance 0.18 Information Ratio 0.44 Tracking Error 0.372 Treynor Ratio 0.174 Total Fees $9586.07 Estimated Strategy Capacity $60000.00 Lowest Capacity Asset VX Y120ZM67092H |
from AlgorithmImports import *
import datetime
class BasicTemplateFuturesAlgorithm(QCAlgorithm):
def Initialize(self):
self.SetStartDate(2013, 1, 1)
self.SetEndDate(2022, 8, 25)
self.SetCash(100000)
self.vx = self.AddFuture(Futures.Indices.VIX)
self.vx.SetFilter(0, 120)
# 1. Widen the free portfolio percentage to 30% to avoid margin calls for futures
def OnMarginCallWarning(self):
self.Error("You received a margin call warning..")
def OnData(self, slice):
now = self.Time
for chain in slice.FutureChains:
self.popularContracts = [contract for contract in chain.Value if (contract.Expiry - now).days > 20]
if len(self.popularContracts) < 3:
return
sortedByOIContracts = sorted(self.popularContracts, key=lambda k: k.Expiry, reverse=False)
self.c1 = sortedByOIContracts[0]
self.c2 = sortedByOIContracts[1]
has_data = slice.ContainsKey(self.c1.Symbol) and slice.ContainsKey(self.c2.Symbol)
if not has_data and not self.Portfolio.Invested:
return
# if not self.Portfolio.Invested and slice[self.c1.Symbol].Price < slice[self.c2.Symbol].Price:
diff = slice[self.c1.Symbol].Price - slice[self.c2.Symbol].Price
time_to_trade = self.Time.time() == datetime.time(15, 50)
if time_to_trade and diff < 0:
self.MarketOrder(self.c1.Symbol, 1)
self.MarketOrder(self.c2.Symbol, -1)
elif (self.c1.Expiry - now).days <= 1 and self.Portfolio.Invested:
self.Liquidate(self.c1.Symbol)
elif time_to_trade and self.Portfolio.Invested and diff > 5:
self.Liquidate()
# elif slice[self.c1.Symbol].Price > 28:
# self.Liquidate()