| Overall Statistics |
|
Total Trades 28 Average Win 0.00% Average Loss 0.00% Compounding Annual Return -0.001% Drawdown 0.000% Expectancy -0.753 Net Profit -0.010% Sharpe Ratio -0.335 Probabilistic Sharpe Ratio 0.000% Loss Rate 79% Win Rate 21% Profit-Loss Ratio 0.15 Alpha -0 Beta 0 Annual Standard Deviation 0 Annual Variance 0 Information Ratio -0.662 Tracking Error 0.154 Treynor Ratio -3.083 Total Fees $51.80 Estimated Strategy Capacity $2900000.00 Lowest Capacity Asset ZW YEALCV7W1CTH |
from AlgorithmImports import *
class QAFutureSpreader(QCAlgorithm):
# ==================================================================================
# Reserved for future comments
# ==================================================================================
def Initialize(self):
self.SetStartDate(2015, 8, 29)
self.SetCash(100000000)
self.corn = self.AddFuture(Futures.Grains.Corn, Resolution.Daily)
self.symbolcorn = self.corn.Symbol
self.corn.SetFilter(lambda x: x.ExpirationCycle([1, 12]))
self.wheat = self.AddFuture(Futures.Grains.Wheat, Resolution.Daily)
self.symbolwheat = self.wheat.Symbol
self.wheat.SetFilter(lambda x: x.ExpirationCycle([1,12]))
self.SetWarmup(21)
self.traded_thismonth = False
self.n_days = 12
self.ticket= None
def OnData(self, slice: Slice) -> None:
chain = slice.FuturesChains.get(self.symbolcorn)
chain2 = slice.FutureChains.get(self.symbolwheat)
if chain and chain2:
contract = sorted(chain, key=lambda contract: contract.Expiry, reverse=True)[0]
contract2 = sorted(chain2, key =lambda contract: contract.Expiry, reverse=True)[0]
if self.ticket is not None and self.UtcTime >= self.ticket.Time + timedelta(days=self.n_days):
self.Liquidate()
self.ticket = None
if self.Time.month == 9 and self.Time.day < self.n_days:
if not self.Portfolio.Invested:
self.ticket = self.MarketOrder(contract.Symbol, 1)
self.MarketOrder(contract2.Symbol, -1)