Overall Statistics
Total Trades
4
Average Win
1.38%
Average Loss
-0.08%
Compounding Annual Return
11.892%
Drawdown
22.700%
Expectancy
8.529
Net Profit
87.023%
Sharpe Ratio
0.739
Probabilistic Sharpe Ratio
20.463%
Loss Rate
50%
Win Rate
50%
Profit-Loss Ratio
18.06
Alpha
0.034
Beta
0.557
Annual Standard Deviation
0.12
Annual Variance
0.014
Information Ratio
-0.085
Tracking Error
0.104
Treynor Ratio
0.159
Total Fees
$2.00
Estimated Strategy Capacity
$0
Lowest Capacity Asset
MSFT R735QTJ8XC9X
Portfolio Turnover
0.02%
#region imports
from AlgorithmImports import *
#endregion
class TransdimensionalCalibratedRadiator(QCAlgorithm):

    def Initialize(self):
        self.SetStartDate(2018, 1, 1)  # Set Start Date
        self.SetCash(30000)  # Set Strategy Cash

        option = self.AddOption("MSFT")
        self.symbol = option.Symbol
        option.SetFilter(-29, 29, timedelta(11), timedelta(11))

        

    def OnData(self, slice: Slice) -> None:
        
        if self.Portfolio.Invested: return

        # Get the OptionChain
        chain = slice.OptionChains.GetValue(self.symbol) 
        if chain is None:  return
        lowerBound = chain.Underlying.Price * 0.972
        upperBound = chain.Underlying.Price * 1.05
        if not chain: return

        # Get the furthest expiration date of the contracts
        expiry = sorted(chain, key = lambda x: x.Expiry, reverse=True)[0].Expiry
        
        # Select the put Option contracts with the furthest expiry
        puts = [i for i in chain if i.Expiry == expiry and i.Right == OptionRight.Put]
        if len(puts) == 0: return

        # Select the ITM and OTM contract strikes from the remaining contracts
        put_strikes = sorted([x.Strike for x in puts])
        #filtered_strikes = put_strikes[put_strikes.Values[0]> lowerBound and put_strikes.Values[0] < upperBound]
        filtered_strikes = [x for x in put_strikes if x> lowerBound and x < upperBound]
        otm_strike = filtered_strikes[0]
        itm_strike = filtered_strikes[-1]
        
        option_strategy = OptionStrategies.BullPutSpread(self.symbol, itm_strike, otm_strike, expiry)
        self.Buy(option_strategy, 1)

#        for chain in data.OptionChains.Values:
#             lowerBound = chain.Underlying.Price * 0.9
#             upperBound = chain.Underlying.Price * 1.0
#             # Option contracts sorted by their strikes
#             contracts = sorted(chain, key=lambda x: x.Strike)
#             # The contracts from -5% to 5%
#             selectedContracts = [x for x in contracts if x.Strike > lowerBound and x.Strike < upperBound and x.Symbol.ID.OptionRight == OptionRight.Put ]
            
#             # For validation we get the strikes of the selected contracts
#             strikes = [x.Strike for x in contracts if x.Strike > lowerBound and x.Strike < upperBound]
#             self.Log(f"Lower Bound: {lowerBound} \n Upper Bound: {upperBound} \n Strikes: {strikes}")
#             self.longOption = selectedContracts[0]
#             self.shortOption = selectedContracts[0]
#             self.Buy(self.longOption.Symbol, 1)
#             self.Sell(self.shortOption.Symbol, 1)