Overall Statistics Total Trades 21 Average Win 21.00% Average Loss -7.00% Compounding Annual Return 31.716% Drawdown 26.000% Expectancy 0.201 Net Profit 5.253% Sharpe Ratio 0.645 Loss Rate 70% Win Rate 30% Profit-Loss Ratio 3.00 Alpha -1.912 Beta 149.273 Annual Standard Deviation 0.78 Annual Variance 0.608 Information Ratio 0.625 Tracking Error 0.779 Treynor Ratio 0.003 Total Fees \$45.25
```import numpy as np
import pandas as pd
import datetime

from System import *
from QuantConnect import *
from QuantConnect.Algorithm import *
from QuantConnect.Data import *

class bugs(QCAlgorithm):

def Initialize(self):

self.SetStartDate(2018, 1, 1)   #Set Start Date
self.SetEndDate(2018, 3, 10)    #Set End Date
self.SetCash(25000)             #Set Strategy Cash

# Find more symbols here: http://quantconnect.com/data
self.symbol = option.Symbol
self.ATMcall = None
self.ATMput = None
self.Allocate = 0.10
# Scheduled event on Mondays at 3:45PM
self.Schedule.On(self.DateRules.EveryDay("SPY"),
self.TimeRules.BeforeMarketClose("SPY", 1),
self.TurnOn)

self.Schedule.On(self.DateRules.Every([DayOfWeek.Friday]), \
self.TimeRules.At(15, 45), \
self.SellTime)

option.SetFilter(lambda universe: universe.IncludeWeeklys().Strikes(0, 0).Expiration(datetime.timedelta(15), datetime.timedelta(20)))

def OnData(self, slice):

## Add a boolean condition to see if the algo. should continue to trade that day

if slice != None:
for i in slice.OptionChains:
if i.Key != self.symbol: continue
optionchain = i.Value

self.Log(f"underlying price: {optionchain.Underlying.Price}")

puts = [x for x in optionchain if x.Right == 1]

# get closest ATM put
self.ATMput = sorted(puts, key = lambda x: x.Strike, reverse = True)[0]
self.Log(f'{self.Time} :: Put expiry: {self.ATMput.Expiry}')
self.Log(f'{self.Time} :: Put Symbol: {self.ATMput.Symbol}')
for symbol in self.Securities.Keys:
if self.Securities[symbol].Invested:
self.Log(f'{self.Time} :: Liquidating {symbol}')

self.Liquidate()
self.SetHoldings(self.ATMput.Symbol, self.Allocate)
self.Log(f'{self.Time} :: Purchased Put Option with ' + str(abs((self.ATMput.Expiry - self.Time).days)) + ' days to expiration')

def SellTime(self):
for symbol in self.Securities.Keys:
if self.Securities[symbol].Invested:
self.Log(f'{self.Time} :: Liquidating {symbol}')
self.Liquidate()

## This means that the OnData() section won't execute any of the code inside the if() statement from 15:46 - Market Close