| 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 Tracking Error 0 Treynor Ratio 0 Total Fees $0.00 Estimated Strategy Capacity $0 Lowest Capacity Asset |
from System import *
from QuantConnect import *
from QuantConnect.Algorithm import *
from QuantConnect.Securities import *
from datetime import timedelta
from QuantConnect.Securities.Future import FuturesExpiryFunctions
import datetime
class BasicTemplateFuturesAlgorithm(QCAlgorithm):
def Initialize(self):
self.SetCash(1000* 1000 * 1000)
# self.SetStartDate(2015, 1, 1)
# self.SetStartDate(2016, 1, 1)
self.SetStartDate(2020, 1, 1)
# self.SetStartDate(2020, 11, 1)
self.SetEndDate(2021, 1, 1)
self.futureSP500 = self.AddFuture(Futures.Indices.SP500EMini, Resolution.Minute) # Symbol: ES
self.futureSP500.SetFilter(timedelta(0), timedelta(365))
benchmark = self.AddEquity("SPY")
self.SetBenchmark(benchmark.Symbol)
self.last_date = datetime.datetime(2000, 1, 1)
def GetLatestFutures(self, slice):
result = {}
# FutureChains reference https://www.quantconnect.com/lean/documentation/topic24120.html
for chain in slice.FutureChains:
# FuturesContract reference https://www.quantconnect.com/lean/documentation/topic24129.html
# Get contracts expiring no earlier than in 90 days
contracts = list(filter(lambda x: x.Expiry > self.Time + timedelta(90), chain.Value))
front = sorted(contracts, key = lambda x: x.Expiry, reverse=True)[0]
result[front.Symbol.ID.Symbol] = front
return result
def OnData(self, slice):
if self.last_date >= self.Time.date:
return
self.last_date = self.Time.date
futures = self.GetLatestFutures(slice)
self.MarketOrder(futures['ES'].Symbol, 2)
def OnEndOfAlgorithm(self):
pass# https://github.com/QuantConnect/Lean/blob/master/Algorithm.Python/BasicTemplateFuturesAlgorithm.py
# from clr import AddReference
# AddReference("System")
# AddReference("QuantConnect.Algorithm")
# AddReference("QuantConnect.Common")
from System import *
from QuantConnect import *
from QuantConnect.Algorithm import *
from QuantConnect.Securities import *
from datetime import timedelta
from QuantConnect.Securities.Future import FuturesExpiryFunctions
class BasicTemplateFuturesAlgorithm(QCAlgorithm):
def Initialize(self):
self.SetCash(1000* 1000 * 1000)
# self.SetStartDate(2015, 1, 1)
# self.SetStartDate(2016, 1, 1)
self.SetStartDate(2020, 1, 1)
# self.SetStartDate(2020, 11, 1)
self.SetEndDate(2021, 1, 1)
# Subscribe and set our expiry filter for the futures chain
self.futureSP500 = self.AddFuture(Futures.Indices.SP500EMini, Resolution.Minute) # Symbol: ES
self.futureSP500.SetFilter(timedelta(0), timedelta(365))
# self.future10YTreasuryNote = self.AddFuture(Futures.Financials.Y10TreasuryNote, Resolution.Minute)
# self.future10YTreasuryNote.SetFilter(timedelta(0), timedelta(365))
# futureGold = self.AddFuture(Futures.Metals.Gold, Resolution.Minute)
# futureGold.SetFilter(timedelta(0), timedelta(182))
# self.Debug('futureSP500 leveratge ' + str(self.futureSP500.Leverage))
# self.Debug('future10YTreasuryNote leveratge ' + str(self.future10YTreasuryNote.Leverage))
self.Debug('futureSP500 HoldingsValue ' + str(self.futureSP500.Holdings.HoldingsValue))
benchmark = self.AddEquity("SPY")
self.SetBenchmark(benchmark.Symbol)
# self.step_flag = False
# self.Schedule.On(self.DateRules.EveryDay("SPY"),
# self.TimeRules.AfterMarketOpen("SPY", 30),
# self.Step)
# self.Schedule.On(self.DateRules.EveryDay(self.futureSP500.Symbol),
# self.TimeRules.AfterMarketOpen("SPY", 30),
# self.Step)
def GetLatestFutures(self, slice):
result = {}
# FutureChains reference https://www.quantconnect.com/lean/documentation/topic24120.html
for chain in slice.FutureChains:
# FuturesContract reference https://www.quantconnect.com/lean/documentation/topic24129.html
# Get contracts expiring no earlier than in 90 days
contracts = list(filter(lambda x: x.Expiry > self.Time + timedelta(90), chain.Value))
front = sorted(contracts, key = lambda x: x.Expiry, reverse=True)[0]
# self.Debug('* ' + str(front.Symbol))
# self.Debug('* ' + str(front.Expiry))
# self.Debug('* ' + str(front.LastPrice))
result[front.Symbol.ID.Symbol] = front
return result
# def ComputeTarget(self, slice):
# futures = self.GetLatestFutures(slice)
# total = self.Portfolio.TotalPortfolioValue
# self.Debug('futures...........' + str(futures.keys()))
# es_num = int(total*0.95 / (futures['ES'].LastPrice*50))
# self.Debug('compute target. ' + str(total) + '\t' + str(futures['ES'].LastPrice))
# self.Debug('compute target. ' + str(es_num))
# return {futures['ES'].Symbol:es_num}
# def Execute(self, targets):
# # Sell
# for p in [x for x in self.Portfolio.Values if x.Invested ]:
# # self.Debug('ha1 ' + str(p))
# if p.Symbol in targets.keys():
# if p.Quantity > targets[p.Symbol]:
# self.Debug('sell method 1')
# self.MarketOrder(p.Symbol, targets[p.Symbol] - p.Quantity)
# else:
# self.Debug('sell method 2')
# self.Liquidate(p.Symbol)
# # Buy
# for target_symbol, target_quantity in targets.items():
# if target_symbol in [x.Symbol for x in self.Portfolio.Values]:
# if target_quantity > self.Portfolio[str(target_symbol)].Quantity:
# self.MarketOrder(target_symbol, target_quantity - self.Portfolio[str(target_symbol)].Quantity)
# else:
# self.MarketOrder(target_symbol, target_quantity)
def Step(self):
self.step_flag = True
def OnData(self, slice):
try:
self.last_date
except:
self.last_date = self.Time.date
if self.last_date == self.Time.date:
return
return
self.last_date = self.Time.date
futures = self.GetLatestFutures(slice)
self.MarketOrder(futures['ES'].Symbol, 2)
# def OnData_Old(self, slice):
# # if not self.step_flag:
# # return
# # try:
# # self.Debug('self.Time.date: ' + str(self.Time.date))
# # self.Debug('self.last_date: ' + str(self.last_date))
# # if self.last_date != self.Time.date:
# # self.last_date = self.Time.date
# # return
# # except:
# # self.last_date = self.Time.date
# # return
# # self.step_flag = False
# futures = self.GetLatestFutures(slice)
# self.MarketOrder(futures['ES'].Symbol, 1)
# # self.MarketOrder('SPY', 1)
# return
# self.Debug('OnData: ' + str(self.Time))
# self.Debug('* totalvalue ' + str(self.Portfolio.TotalPortfolioValue))
# self.Debug('** ' + str(self.ComputeTarget(slice)))
# targets = self.ComputeTarget(slice)
# self.Execute(targets)
# # SecurityHoldings reference https://www.quantconnect.com/lean/documentation/topic26942.html
# # Symbol reference https://www.quantconnect.com/lean/documentation/topic7826.html
# # SecurityIdentifier reference https://www.quantconnect.com/lean/documentation/topic7432.html
# invested = [x for x in self.Portfolio.Values if x.Invested ]
# for p in invested:
# self.Debug('* Symbol: ' + str(p.Symbol))
# # self.Debug('* 1: ' + str(p.Symbol.ID.Date))
# # self.Debug('* 2: ' + str(p.Symbol.ID.Symbol))
# # self.Debug('* 1: ' + str(dir(p.Symbol)))
# # self.Debug('* 2: ' + str(p.Quantity))
# self.Debug('* 3: ' + str(p.HoldingsValue))
# # self.Debug('* 4: ' + str(p.AbsoluteHoldingsValue))
# # self.Debug("invested: " + str(invested))
# def OnData(self, slice):
# if self.last_day == self.Time.date():
# return
# last_day = self.Time.date()
# self.Debug(self.Time.date())
# float(self.Portfolio.TotalPortfolioValue)
# if not self.Portfolio.Invested:
# for chain in slice.FutureChains:
# # Get contracts expiring no earlier than in 90 days
# contracts = list(filter(lambda x: x.Expiry > self.Time + timedelta(90), chain.Value))
# # if there is any contract, trade the front contract
# if len(contracts) == 0: continue
# front = sorted(contracts, key = lambda x: x.Expiry, reverse=True)[0]
# self.contractSymbol = front.Symbol
# self.MarketOrder(front.Symbol , 1)
# else:
# self.Liquidate()
def OnEndOfAlgorithm(self):
pass
# # Get the margin requirements
# buyingPowerModel = self.Securities[self.contractSymbol].BuyingPowerModel
# name = type(buyingPowerModel).__name__
# if name != 'FutureMarginModel':
# raise Exception(f"Invalid buying power model. Found: {name}. Expected: FutureMarginModel")
# initialOvernight = buyingPowerModel.InitialOvernightMarginRequirement
# maintenanceOvernight = buyingPowerModel.MaintenanceOvernightMarginRequirement
# initialIntraday = buyingPowerModel.InitialIntradayMarginRequirement
# maintenanceIntraday = buyingPowerModel.MaintenanceIntradayMarginRequirement