| Overall Statistics |
|
Total Trades 196 Average Win -2.64% Average Loss -9.50% Compounding Annual Return -78.976% Drawdown 96.800% Expectancy -0.630 Net Profit -45.719% Sharpe Ratio 46.906 Probabilistic Sharpe Ratio 67.130% Loss Rate 49% Win Rate 51% Profit-Loss Ratio -0.28 Alpha 143.552 Beta 5.426 Annual Standard Deviation 3.155 Annual Variance 9.956 Information Ratio 47.665 Tracking Error 3.088 Treynor Ratio 27.279 Total Fees $84319.30 |
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(5000000)
self.SetStartDate(2020, 4, 1)
#self.SetEndDate(2020, 5, 15)
self.Settings.FreePortfolioValuePercentage = 0.2
# 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.prev_sp_contract = None
self.prev_gold_contract = None
# SCHEDULE FUNCTIONS
self.Schedule.On(self.DateRules.EveryDay("SPY"), self.TimeRules.At(9, 45), self.Trade_spfut)
self.Schedule.On(self.DateRules.EveryDay("SPY"), self.TimeRules.At(10, 45), self.Trade_goldfut)
# TRADING
def Trade_spfut(self):
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]
if len(sp) == 0:
if self.prev_sp_contract is not None:
self.Liquidate(self.prev_sp_contract.Symbol)
return
sorted_sp = sorted(sp, key=lambda k: k.OpenInterest, reverse = True)
trade_sp = sorted_sp[0]
if self.prev_sp_contract is None:
self.prev_sp_contract = trade_sp
if self.prev_sp_contract.Symbol != trade_sp.Symbol:
self.Liquidate(self.prev_sp_contract.Symbol)
self.prev_sp_contract = trade_sp
self.SetHoldings(trade_sp.Symbol, 0.5)
def Trade_goldfut(self):
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]
if len(gc) == 0:
if self.prev_gold_contract is not None:
self.Liquidate(self.prev_gold_contract.Symbol)
return
sorted_gc = sorted(gc, key=lambda k: k.OpenInterest, reverse = True)
trade_gc = sorted_gc[0]
if self.prev_gold_contract is None:
self.prev_gold_contract = trade_gc
if self.prev_gold_contract.Symbol != trade_gc.Symbol:
self.Liquidate(self.prev_gold_contract.Symbol)
self.prev_gold_contract = trade_gc
self.SetHoldings(trade_gc.Symbol, 0.5)