| Overall Statistics |
|
Total Trades 10 Average Win 0.35% Average Loss -0.61% Compounding Annual Return -0.402% Drawdown 0.400% Expectancy -0.051 Net Profit -0.134% Sharpe Ratio -0.666 Probabilistic Sharpe Ratio 12.029% Loss Rate 40% Win Rate 60% Profit-Loss Ratio 0.58 Alpha -0.004 Beta 0.022 Annual Standard Deviation 0.004 Annual Variance 0 Information Ratio -0.375 Tracking Error 0.14 Treynor Ratio -0.117 Total Fees $6.00 Estimated Strategy Capacity $450000.00 Lowest Capacity Asset GOOCV WN5253VSCTIE|GOOCV VP83T1ZUHROL |
#region imports
from AlgorithmImports import *
#endregion
from datetime import timedelta
class BullCallSpreadAlgorithm(QCAlgorithm):
def Initialize(self):
self.SetStartDate(2017, 5, 1)
self.SetEndDate(2017, 8, 30)
self.SetCash(600000)
equity = self.AddEquity("GOOG")
option = self.AddOption("GOOG")
self.symbol = option.Symbol
# set our strike/expiry filter for this option chain
option.SetFilter(-7, 7, 30, 60)
# use the underlying equity GOOG as the benchmark
self.SetBenchmark(equity.Symbol)
def OnData(self, slice):
# if there is no securities in portfolio, trade the options
if self.Portfolio.Invested:
return
chain = slice.OptionChains.get(self.symbol)
if not chain:
return
# sorted the optionchain by expiration date and choose the furthest date
expiry = sorted(chain, key=lambda x: x.Expiry, reverse=True)[0].Expiry
# filter the call options from the contracts expires on that date
calls = [i for i in chain if i.Expiry == expiry and i.Right == OptionRight.Call]
if len(calls) < 1: return
# sorted the contracts according to their strike prices
calls = sorted(calls, key=lambda x: x.Strike)
# Buy call option contract with lower strike
self.Buy(calls[0].Symbol, 1)
# Sell call option contract with higher strike
self.Sell(calls[-1].Symbol, 1)
def OnOrderEvent(self, orderEvent):
self.Log(f'{orderEvent}')