Overall Statistics
Total Orders
2
Average Win
9.61%
Average Loss
0%
Compounding Annual Return
4.330%
Drawdown
8.800%
Expectancy
0
Start Equity
100000
End Equity
109608
Net Profit
9.608%
Sharpe Ratio
-0.217
Sortino Ratio
-0.087
Probabilistic Sharpe Ratio
12.850%
Loss Rate
0%
Win Rate
100%
Profit-Loss Ratio
0
Alpha
-0.049
Beta
0.252
Annual Standard Deviation
0.091
Annual Variance
0.008
Information Ratio
-1.139
Tracking Error
0.118
Treynor Ratio
-0.078
Total Fees
$0.00
Estimated Strategy Capacity
$12000000.00
Lowest Capacity Asset
SPX Y63ASX4ISXV2|SPX 31
Portfolio Turnover
0.02%
from AlgorithmImports import *

class IndexOptionBuyAndHold(QCAlgorithm):

    def Initialize(self):
        self.SetStartDate(2023, 1, 1)   # Set start date
        self.SetCash(100000)            # Set initial cash
        self.underlying = "SPX"         # Underlying index (S&P 500 Index)
        
        # Add index and its options
        self.index = self.AddIndex(self.underlying)
        self.option = self.AddIndexOption(self.underlying)
        
        # Corrected SetFilter syntax
        self.option.SetFilter(-10, 10, 30, 60)

        self.bought = False  # Track if we have bought an option

    def OnData(self, data):
        if self.bought or self.Portfolio.Invested:
            return  # Ensure we buy only once
        
        # Get option chain
        chain = data.OptionChains.get(self.option.Symbol, None)
        if not chain:
            return
        
        # Select the nearest expiry and at-the-money (ATM) call option
        contracts = sorted(chain, key=lambda x: (x.Expiry, abs(x.Strike - chain.Underlying.Price)))
        if not contracts:
            return
        
        selected_contract = contracts[0]  # Choose the best contract
        
        # Place a market order to buy 1 contract
        self.MarketOrder(selected_contract.Symbol, 1)
        
        self.bought = True  # Ensure we don't buy again