Overall Statistics
Total Orders
272
Average Win
12.73%
Average Loss
-11.02%
Compounding Annual Return
-49.502%
Drawdown
94.900%
Expectancy
-0.097
Start Equity
100000
End Equity
5227.4
Net Profit
-94.773%
Sharpe Ratio
-1.46
Sortino Ratio
-0.604
Probabilistic Sharpe Ratio
0.000%
Loss Rate
58%
Win Rate
42%
Profit-Loss Ratio
1.16
Alpha
-0.393
Beta
0.195
Annual Standard Deviation
0.258
Annual Variance
0.067
Information Ratio
-1.554
Tracking Error
0.295
Treynor Ratio
-1.928
Total Fees
$7334.60
Estimated Strategy Capacity
$6000.00
Lowest Capacity Asset
QQQ 32GUNU5C4K2JQ|QQQ RIWIV7K5Z9LX
Portfolio Turnover
8.45%
# 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("QQQ", 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()