Overall Statistics
Total Trades
158
Average Win
1.80%
Average Loss
-5.13%
Compounding Annual Return
5.829%
Drawdown
32.300%
Expectancy
0.033
Net Profit
8.232%
Sharpe Ratio
0.295
Probabilistic Sharpe Ratio
15.716%
Loss Rate
24%
Win Rate
76%
Profit-Loss Ratio
0.35
Alpha
0
Beta
0
Annual Standard Deviation
0.238
Annual Variance
0.056
Information Ratio
0.295
Tracking Error
0.238
Treynor Ratio
0
Total Fees
$128.00
Estimated Strategy Capacity
$0
Lowest Capacity Asset
SPY 327TQB8RG3OQU|SPY R735QTJ8XC9X
Portfolio Turnover
6.90%
# weekend effect of the selling options
# open - Fri 15:55
# close - Mon 9:45
# delta - 0.5
# 1 contract / account size 100,000 USD

import pandas as pd
import talib as ta
import numpy as np
from AlgorithmImports import *


class BasicTemplateSPXWeeklyIndexOptionsAlgorithm(QCAlgorithm):
    def Initialize(self):
        self.SetStartDate(2022,1, 1)
        #self.SetEndDate(2022, 1, 10)
        self.SetCash(15000)
        self.SetTimeZone(TimeZones.NewYork)
        self.SetBrokerageModel(BrokerageName.InteractiveBrokersBrokerage,AccountType.Margin)
        
        self.spy = self.AddEquity("SPY", Resolution.Minute)
        self.SetBenchmark("SPX")

        # weekly option SPX contracts
        spyw = self.AddOption("SPY")
        # set our strike/expiry filter for this option chain
        spyw.SetFilter(lambda u: (u.Strikes(-1, 1)
                                     .Expiration(7,7)
                                     .IncludeWeeklys()))

        self.spyw_option = spyw.Symbol
        self.Schedule.On(self.DateRules.Every(DayOfWeek.Wednesday), self.TimeRules.At(11, 0), self.Start)
        self.trade_run = 0
 
    def OnData(self,slice):        
        
        if self.trade_run == 0:
            return
   
        else:
            quantity = 1
            delta =0.5
        
            self.chain = slice.OptionChains.GetValue(self.spyw_option)
                    
            if self.chain is None:
                return
            
            put = [x for x in self.chain if x.Right == OptionRight.Put]
            
            # we sort the contracts to find contract with the right delta
            put_contract = sorted(put,key = lambda x: abs(x.Greeks.Delta - delta))
            self.Debug(self.trade_run)

            if len(put_contract) == 0: 
                return
            else:
                self.put_ = put_contract[0]
                self.MarketOrder(self.put_.Symbol, -quantity)
                self.trade_run = 0

        
    def OnOrderEvent(self, orderEvent):
        self.Debug(str(orderEvent))

 

    def Start(self):
        self.Liquidate()
        self.trade_run = 1