| Overall Statistics |
|
Total Trades 11 Average Win 23.34% Average Loss -9.00% Compounding Annual Return 34.079% Drawdown 19.300% Expectancy 0.197 Net Profit 13.175% Sharpe Ratio 0.619 Probabilistic Sharpe Ratio 37.691% Loss Rate 67% Win Rate 33% Profit-Loss Ratio 2.59 Alpha 0.272 Beta 0.895 Annual Standard Deviation 0.345 Annual Variance 0.119 Information Ratio 0.954 Tracking Error 0.292 Treynor Ratio 0.239 Total Fees $492.10 |
from math import floor
class FuturesHarryBrownStyle(QCAlgorithm):
def Initialize(self):
self.SetStartDate(2010, 4, 20)
self.SetEndDate(2010, 9, 20)
self.SetCash(1000000)
self.Settings.FreePortfolioValuePercentage = 0.3
self.usd = self.AddFuture(Futures.Currencies.CAD, Resolution.Minute)
self.usd.SetFilter(30, 90)
self.spEmini = self.AddFuture(Futures.Indices.SP500EMini)
self.spEmini.SetFilter(30, 90)
self.bonds = self.AddFuture(Futures.Financials.Y30TreasuryBond)
self.bonds.SetFilter(30, 90)
self.currentHoldings = {}
def OnMarginCallWarning(self):
self.Error("You received a margin call warning..")
def OnData(self, slice):
# Delete delisted contracts we're holding
for k in self.currentHoldings.copy():
if self.currentHoldings[k].Expiry < self.Time:
del self.currentHoldings[k]
for chain in slice.FutureChains:
self.popularContracts = [contract for contract in chain.Value if contract.LastPrice > 0 ]
if len(self.popularContracts) == 0:
continue
sortedByOIContracts = sorted(self.popularContracts, key=lambda k : k.OpenInterest, reverse=True)
self.liquidContract = sortedByOIContracts[0]
underlying = str((self.liquidContract))[:2]
if self.Portfolio[self.liquidContract.Symbol].Invested:
continue
if underlying not in self.currentHoldings:
self.SetHoldings(self.liquidContract.Symbol, 0.08)
self.Debug(f"New Position: {self.liquidContract.Symbol}. Expiry: {self.liquidContract.Expiry}")
self.currentHoldings[underlying] = self.liquidContract
elif self.liquidContract.Expiry > self.currentHoldings[underlying].Expiry:
# Sell the old & Delete asset from currentHoldings (for cleancode)
#if self.currentHoldings[underlying].Expiry > self.Time:
self.Liquidate(self.currentHoldings[underlying].Symbol)
self.Debug(f"Old contract {self.currentHoldings[underlying].Symbol} liquidated. Expiry: {self.currentHoldings[underlying].Expiry}")
# Buy the new, and update currentHoldingsDict
self.SetHoldings(self.liquidContract.Symbol, 0.08)
self.Debug(f"New Position: {self.liquidContract.Symbol}. Expiry: {self.liquidContract.Expiry}")
self.currentHoldings[underlying] = self.liquidContractfrom Selection.FutureUniverseSelectionModel import FutureUniverseSelectionModel
from datetime import date, timedelta
class FrontMonthUniverseSelectionModel(FutureUniverseSelectionModel):
def __init__(self, select_future_chain_symbols):
super().__init__(timedelta(1), select_future_chain_symbols)
def Filter(self, filter):
return (filter.FrontMonth())