Overall Statistics |
Total Trades 4 Average Win 0% Average Loss 0% Compounding Annual Return 2507.604% Drawdown 57.800% Expectancy 0 Net Profit 36.711% Sharpe Ratio 17.227 Probabilistic Sharpe Ratio 61.566% Loss Rate 0% Win Rate 0% Profit-Loss Ratio 0 Alpha 30.618 Beta 4.795 Annual Standard Deviation 1.919 Annual Variance 3.684 Information Ratio 17.281 Tracking Error 1.884 Treynor Ratio 6.895 Total Fees $294.15 |
import math import numpy as np import pandas as pd import talib from calendar import monthrange from datetime import date, datetime, time, timedelta from QuantConnect.Python import PythonQuandl class Algorithm(QCAlgorithm): def Initialize(self): self.SetCash(1000000) self.SetStartDate(2020, 7, 31) #self.SetEndDate(2020, 5, 15) #self.Settings.FreePortfolioValuePercentage = 0.0 # SECURITIES self.usequities = ["SPY"] for s in self.usequities: x = self.AddEquity(s, Resolution.Daily) self.fut_sp = self.AddFuture(Futures.Indices.SP500EMini) self.fut_sp.SetFilter(TimeSpan.Zero, TimeSpan.FromDays(60)) self.fut_gold = self.AddFuture(Futures.Metals.Gold) self.fut_gold.SetFilter(TimeSpan.FromDays(30), TimeSpan.FromDays(60)) self.fut_vol = self.AddFuture(Futures.Indices.VIX) self.fut_vol.SetFilter(TimeSpan.Zero, TimeSpan.FromDays(60)) #self.fut_tb_two = self.AddFuture(Futures.Financials.Y2TreasuryBond) #self.fut_tb_two.SetFilter(TimeSpan.Zero, TimeSpan.FromDays(60)) #self.fut_tb_five = self.AddFuture(Futures.Financials.Y5TreasuryBond) #self.fut_tb_five.SetFilter(TimeSpan.Zero, TimeSpan.FromDays(60)) #self.fut_tb_ten = self.AddFuture(Futures.Financials.Y10TreasuryBond) #self.fut_tb_ten.SetFilter(TimeSpan.Zero, TimeSpan.FromDays(60)) #self.fut_tb_thirty = self.AddFuture(Futures.Financials.Y30TreasuryBond) #self.fut_tb_thirty.SetFilter(TimeSpan.Zero, TimeSpan.FromDays(60)) self.prev_contract = None # SCHEDULE FUNCTIONS self.Schedule.On(self.DateRules.MonthEnd("SPY"), self.TimeRules.At(9, 45), self.Trade) #self.Schedule.On(self.DateRules.EveryDay("SPY"), self.TimeRules.At(9, 45), self.Roll_contracts) # TRADING def Trade(self): # trade SPX if self.fut_sp.Symbol not in self.CurrentSlice.FutureChains: return chain = self.CurrentSlice.FutureChains[self.fut_sp.Symbol] sp = [sp for sp in chain if sp.OpenInterest > 0] sorted_sp = sorted(sp, key=lambda k: k.OpenInterest, reverse = True) trade_sp = sorted_sp[0] self.SetHoldings(trade_sp.Symbol, 0.25) #self.MarketOrder(trade_sp.Symbol, 1) # trade gold if self.fut_gold.Symbol not in self.CurrentSlice.FutureChains: return chain = self.CurrentSlice.FutureChains[self.fut_gold.Symbol] gc = [gc for gc in chain if gc.OpenInterest > 0] sorted_gc = sorted(gc, key=lambda k: k.OpenInterest, reverse = True) trade_gc = sorted_gc[0] self.SetHoldings(trade_gc.Symbol, 0.25) def Roll_contracts(self): for chain in self.CurrentSlice.FutureChains: fut = [fut for fut in chain if fut.OpenInterest > 0] sorted = sorted(fut, key=lambda k: k.OpenInterest, reverse = True) trade_fut = sorted_fut[0] if self.prev_contract is None: self.prev_contract = trade_fut if self.prev_contract.Symbol != trade_fut.Symbol: self.Liquidate(self.prev_contract.Symbol) self.prev_contract = trade_fut self.SetHoldings(trade_fut.Symbol, 0.25)