Overall Statistics
Total Trades
4
Average Win
0.30%
Average Loss
-0.33%
Compounding Annual Return
-72.392%
Drawdown
0.400%
Expectancy
-0.358
Net Profit
-0.352%
Sharpe Ratio
-11.225
Loss Rate
67%
Win Rate
33%
Profit-Loss Ratio
0.93
Alpha
-0.887
Beta
-1.405
Annual Standard Deviation
0.04
Annual Variance
0.002
Information Ratio
-1.889
Tracking Error
0.068
Treynor Ratio
0.316
Total Fees
$2.00
class OptionExerciseAssignRegressionAlgorithm(QCAlgorithm):

    def Initialize(self):

        self.SetCash(100000)
        self.SetStartDate(2015,12,24)
        self.SetEndDate(2015,12,24)

        option = self.AddOption("GOOG")

        # set our strike/expiry filter for this option chain
        option.SetFilter(self.UniverseFunc)

        self.SetBenchmark("GOOG")
        self._assignedOption = False

    def OnData(self, slice):
        if self.Portfolio.Invested: return
        for kvp in slice.OptionChains:
            chain = kvp.Value
            # find the call options expiring today
            contracts = filter(lambda x:
                               x.Expiry.date() == self.Time.date() and
                               x.Strike < chain.Underlying.Price and
                               x.Right ==  OptionRight.Call, chain)
            
            # sorted the contracts by their strikes, find the second strike under market price 
            sorted_contracts = sorted(contracts, key = lambda x: x.Strike, reverse = True)[:2]

            if sorted_contracts:
                self.MarketOrder(sorted_contracts[0].Symbol, 1)
                self.MarketOrder(sorted_contracts[1].Symbol, -1)

    # set our strike/expiry filter for this option chain
    def UniverseFunc(self, universe):
        return universe.IncludeWeeklys().Strikes(-2, 2).Expiration(timedelta(0), timedelta(10))

    def OnOrderEvent(self, orderEvent):
        if orderEvent.IsAssignment:
            order = self.Transactions.GetOrderById(orderEvent.OrderId)
            if order.Type == OrderType.OptionExercise:
                self.Log(str(order))

    def OnAssignmentOrderEvent(self, assignmentEvent):
        self.Log(str(assignmentEvent))
        self._assignedOption = True