Overall Statistics |
Total Orders 2 Average Win 0% Average Loss 0% Compounding Annual Return 6.361% Drawdown 0.600% Expectancy 0 Start Equity 100000 End Equity 100485.5 Net Profit 0.486% Sharpe Ratio 1.073 Sortino Ratio 1.026 Probabilistic Sharpe Ratio 75.361% Loss Rate 0% Win Rate 0% Profit-Loss Ratio 0 Alpha 0.005 Beta -0.104 Annual Standard Deviation 0.025 Annual Variance 0.001 Information Ratio 1.681 Tracking Error 0.138 Treynor Ratio -0.257 Total Fees $2.00 Estimated Strategy Capacity $5100000.00 Lowest Capacity Asset GOOCV Y6URRG5V0U06|GOOCV VP83T1ZUHROL Portfolio Turnover 0.03% |
# region imports from AlgorithmImports import * # endregion class HyperActiveOrangeHippopotamus(QCAlgorithm): def initialize(self): self.set_start_date(2023, 2, 3) self.set_end_date(2023, 3, 3) self.set_cash(100000) option = self.add_option("GOOG", Resolution.MINUTE) self.symbol = option.symbol option.set_filter(lambda universe: universe.strikes(-10, 10).expiration(30, 45)) self.itm_call = None self.otm_call = None def on_data(self, data: Slice): # Get the OptionChain chain = data.option_chains.get(self.symbol, None) if not chain: return if self.itm_call is None: # Get the furthest expiry date of the contracts expiry = sorted(chain, key = lambda x: x.expiry, reverse=True)[0].expiry # Select the ITM call with the lowest strike itm_calls = [c for c in chain if c.expiry == expiry and c.right == OptionRight.CALL and c.strike < chain.underlying.price] if len(itm_calls) == 0: return self.itm_call = sorted(itm_calls, key=lambda x: x.strike)[0] # Sell an ITM call self.market_order(self.itm_call.symbol, -1) if self.otm_call is None and self.time.day > 13: # Select the OTM call with the highest strike otm_calls = [c for c in chain if c.expiry == self.itm_call.expiry and c.right == OptionRight.CALL and c.strike > chain.underlying.price and c.strike > self.itm_call.strike] if len(otm_calls) == 0: return self.otm_call = sorted(otm_calls, key=lambda x: x.strike)[-1] # Buy an OTM call self.market_order(self.otm_call.symbol, 1)