Overall Statistics
Total Orders
204
Average Win
15.41%
Average Loss
-10.74%
Compounding Annual Return
-36.912%
Drawdown
86.300%
Expectancy
-0.069
Start Equity
100000
End Equity
13673.2
Net Profit
-86.327%
Sharpe Ratio
-1.348
Sortino Ratio
-0.564
Probabilistic Sharpe Ratio
0.000%
Loss Rate
62%
Win Rate
38%
Profit-Loss Ratio
1.44
Alpha
-0.274
Beta
-0.061
Annual Standard Deviation
0.207
Annual Variance
0.043
Information Ratio
-1.273
Tracking Error
0.283
Treynor Ratio
4.557
Total Fees
$11629.80
Estimated Strategy Capacity
$11000.00
Lowest Capacity Asset
IWM YHRN4RL2U02U|IWM RV0PWMLXVHPH
Portfolio Turnover
6.46%
# region imports
from AlgorithmImports import *
from datetime import timedelta
import pandas as pd
# endregion

class SimpleStraddleBacktest(QCAlgorithm):

    def initialize(self):
        self.set_start_date(2020, 1, 1)
        self.set_end_date(2024, 6, 1)
        self.set_cash(100_000)

        # Setting up asset and equity
        self._option = self.add_option("IWM", Resolution.MINUTE)        
        self._symbol = self._option.symbol
        self._option.set_filter(timedelta(7), timedelta(7))

        # Schedule liquidate
        self.schedule.on(self.date_rules.every_day(self._symbol), self.time_rules.at(9,33), self.liquidate_positions)
        
    def on_data(self, data:Slice):

        # Start the strategy at 3:58 PM
        if self.time.hour == 15 and self.time.minute == 38:
            
            # Find the list of contracts
            chain = data.option_chains.get(self._symbol)

            if chain is None:
                return
            
            calls = [x for x in chain if x.right == OptionRight.CALL]
            puts = [x for x in chain if x.right == OptionRight.PUT]
            
            straddles = [[call, put] for call in calls for put in puts if call.strike == put.strike]
            self.cheapest_straddle = sorted(straddles, key=lambda straddle: straddle[0].last_price + straddle[1].last_price)[0]
            self.log(f"Cheapest straddle contracts: {self.cheapest_straddle[0].symbol.value, self.cheapest_straddle[1].symbol.value}")

            # Set leverage
            self.securities[self.cheapest_straddle[0].symbol].set_leverage(1)
            self.securities[self.cheapest_straddle[1].symbol].set_leverage(1)


            if not self.portfolio.invested:
                # Buying straddle
                self.set_holdings(self.cheapest_straddle[0].symbol, .5)
                self.set_holdings(self.cheapest_straddle[1].symbol, .5)

    def liquidate_positions(self):
        self.liquidate()