Overall Statistics
Total Orders
3
Average Win
0%
Average Loss
0%
Compounding Annual Return
-24.211%
Drawdown
0.500%
Expectancy
0
Start Equity
500000
End Equity
498467.5
Net Profit
-0.306%
Sharpe Ratio
-5.278
Sortino Ratio
0
Probabilistic Sharpe Ratio
13.583%
Loss Rate
0%
Win Rate
0%
Profit-Loss Ratio
0
Alpha
-0.122
Beta
0.081
Annual Standard Deviation
0.035
Annual Variance
0.001
Information Ratio
1.629
Tracking Error
0.37
Treynor Ratio
-2.295
Total Fees
$0.00
Estimated Strategy Capacity
$0
Lowest Capacity Asset
SPXW 31XTG94286YY6|SPX 31
Portfolio Turnover
0.04%
# region imports
from AlgorithmImports import *
# endregion

class OptionTest(QCAlgorithm):

    def initialize(self) -> None:
        self.set_start_date(2022, 5, 15)
        self.set_end_date(2022, 5, 18)
        self.set_cash(500000)
        self.universe_settings.asynchronous = True
                
        equity = self.add_equity("SPY", Resolution.HOUR) 
        index_symbol = self.add_index("SPX").Symbol
        
        option = self.add_index_option(index_symbol, "SPX", Resolution.HOUR)       
        option.set_filter(lambda universe: universe.strikes(-200, 200).expiration(0,29)) 
        self.monthly_symbol = option.symbol

        option = self.add_index_option(index_symbol, "SPXW", Resolution.HOUR)        
        option.set_filter(lambda universe: universe.include_weeklys().strikes(-200, 200).expiration(0,29))
        self.weekly_symbol = option.symbol

 

    def sell_puts(self, chain, DTE, delta):

        # Takes Option Chain and isolates a specific delta and specific DTE count [DTE in trading days]
        # Returns a single Options Contract

        expos = []
        for x in chain:
            if x.expiry not in expos: expos.append(x.expiry)
        expos = sorted(expos)
        
        target_dte_puts = []
        for x in chain:
            if x.expiry == expos[DTE] and x.right == OptionRight.PUT:
                target_dte_puts.append(x)
        
        target_delta = sorted(target_dte_puts, key=lambda x: abs(delta - x.greeks.delta))[0]

        return target_delta


    def on_data(self, slice: Slice) -> None:
        
        if self.time.hour == 10 and self.time.minute == 0:
            self.log(str(self.time))        

            monthly_chain = slice.option_chains.get(self.monthly_symbol, None) # Un-used for now
            weekly_chain = slice.option_chains.get(self.weekly_symbol, None)

            put = self.sell_puts(weekly_chain, 3, -0.06)
            self.market_order(put.symbol, -1)
            self.log(f'sold {put.strike} put strike')