| Overall Statistics |
|
Total Trades 71 Average Win 0.62% Average Loss -0.33% Compounding Annual Return 1.711% Drawdown 2.800% Expectancy 0.329 Net Profit 5.193% Sharpe Ratio 0.687 Probabilistic Sharpe Ratio 26.819% Loss Rate 54% Win Rate 46% Profit-Loss Ratio 1.91 Alpha 0.012 Beta 0.015 Annual Standard Deviation 0.02 Annual Variance 0 Information Ratio -0.562 Tracking Error 0.2 Treynor Ratio 0.93 Total Fees $8966.95 |
from datetime import timedelta, date
import pandas as pd
### <summary>
### This example demonstrates how to add futures for a given underlying asset.
### It also shows how you can prefilter contracts easily based on expirations, and how you
### can inspect the futures chain to pick a specific contract to trade.
### </summary>
class BasicTemplateFuturesAlgorithm(QCAlgorithm):
def Initialize(self):
self.SetStartDate(2018,1,1)
# self.SetEndDate(2016, 12, 23)
self.SetCash(1000000)
self.SetBenchmark('SPY')
# Constants
self.roll_days = 10 # See: https://coinmetrics.io/improving-your-futures-roll-an-overview-of-the-basis-trade/
self.min_dur = 30 # Minimum duration of purchased future in days
# Subscribe and set our expiry filter for the futures chain
future = self.AddFuture(Futures.Currencies.BTC,Resolution.Minute)
future.SetFilter(timedelta(0), timedelta(182))
# Tracking
self.fut_hold = None
self.df = pd.DataFrame(columns=['fut','open','close'])
def OnData(self,slice):
if self.Time.date()==date(2020,12,23) and self.Time.hour==10 and self.Time.minute==0:
self.Log(self.df)
if self.Portfolio.Invested:
if self.Time.hour==9 and self.Time.minute==30:
contract = self.getfut(slice)
self.df.loc[self.Time.date(),'fut'] = contract.Symbol
self.df.loc[self.Time.date(),'open'] = contract.LastPrice
if self.Time.hour==16 and self.Time.minute==0:
contract = self.getfut(slice)
self.df.loc[self.Time.date(),'close'] = contract.LastPrice
if (self.fut_hold.Expiry - self.Time).days <= self.roll_days:
self.Liquidate()
if not self.Portfolio.Invested:
for chain in slice.FutureChains:
# Get contracts expiring no earlier than in n days
contracts = list(filter(lambda x: x.Expiry > self.Time + timedelta(self.min_dur), chain.Value))
# Trade front contract
if len(contracts) == 0: continue
self.fut_hold = sorted(contracts, key = lambda x: x.Expiry, reverse=False)[0]
self.SetHoldings(self.fut_hold.Symbol, 1)
def getfut(self,slice):
# get invested contract
contract = self.fut_hold
for chain in slice.FutureChains:
filt = [i for i in chain.Value if i.Symbol==self.fut_hold.Symbol]
if len(filt) == 0: continue
contract = filt[0]
return contract