Overall Statistics
Total Trades
2
Average Win
0%
Average Loss
0%
Compounding Annual Return
0%
Drawdown
0%
Expectancy
0
Net Profit
0%
Sharpe Ratio
0
Sortino Ratio
0
Probabilistic Sharpe Ratio
0%
Loss Rate
0%
Win Rate
0%
Profit-Loss Ratio
0
Alpha
0
Beta
0
Annual Standard Deviation
0
Annual Variance
0
Information Ratio
0
Tracking Error
0
Treynor Ratio
0
Total Fees
$1.00
Estimated Strategy Capacity
$4000.00
Lowest Capacity Asset
SPY Y05J8KTZA1K6|SPY R735QTJ8XC9X
Portfolio Turnover
0.81%
# region imports
from AlgorithmImports import *
# endregion

class CustomExerciseModelAlgorithm(QCAlgorithm):

    def Initialize(self):
        self.SetStartDate(2022, 7, 1)
        self.SetEndDate(2022, 7, 10)
        self.SetCash(100000)

        self.SetSecurityInitializer(MySecurityInitializer(self.BrokerageModel, FuncSecuritySeeder(self.GetLastKnownPrices)))

        option = self.AddOption("SPY")
        self.option_symbol = option.Symbol

    def OnData(self, data: Slice):
        chain = data.OptionChains.get(self.option_symbol)
        if chain:
            contract = sorted(
                [x for x in chain if x.Right == OptionRight.Call],
                key=lambda x: x.Strike
            )[0]
            self.MarketOrder(contract.Symbol, 1)
            self.ExerciseOption(contract.Symbol, 1)
            self.Quit()


class MySecurityInitializer(BrokerageModelSecurityInitializer):

    def __init__(self, brokerage_model: IBrokerageModel, security_seeder: ISecuritySeeder) -> None:
        super().__init__(brokerage_model, security_seeder)

    def Initialize(self, security: Security) -> None:
        super().Initialize(security)
        if security.Type == SecurityType.Option:
            security.SetOptionExerciseModel(MyOptionExerciseModel())

class MyOptionExerciseModel(DefaultExerciseModel):
    def OptionExercise(self, option: Option, order: OptionExerciseOrder) -> List[OrderEvent]:
        in_the_money = option.IsAutoExercised(option.Underlying.Close)
        is_assignment = in_the_money and option.Holdings.IsShort

        order_event = OrderEvent(
            order.Id,
            option.Symbol,
            Extensions.ConvertToUtc(option.LocalTime, option.Exchange.TimeZone),
            OrderStatus.Filled,
            Extensions.GetOrderDirection(order.Quantity),
            0.0,
            order.Quantity,
            OrderFee.Zero,
            "MyTag"
        )
        order_event.IsAssignment = is_assignment
        return [ order_event ]