| Overall Statistics |
|
Total Orders 3 Average Win 0% Average Loss 0% Compounding Annual Return -24.211% Drawdown 0.500% Expectancy 0 Start Equity 500000 End Equity 498467.5 Net Profit -0.306% Sharpe Ratio -5.278 Sortino Ratio 0 Probabilistic Sharpe Ratio 13.583% Loss Rate 0% Win Rate 0% Profit-Loss Ratio 0 Alpha -0.122 Beta 0.081 Annual Standard Deviation 0.035 Annual Variance 0.001 Information Ratio 1.629 Tracking Error 0.37 Treynor Ratio -2.295 Total Fees $0.00 Estimated Strategy Capacity $0 Lowest Capacity Asset SPXW 31XTG94286YY6|SPX 31 Portfolio Turnover 0.04% |
# region imports
from AlgorithmImports import *
# endregion
class OptionTest(QCAlgorithm):
def initialize(self) -> None:
self.set_start_date(2022, 5, 15)
self.set_end_date(2022, 5, 18)
self.set_cash(500000)
self.universe_settings.asynchronous = True
equity = self.add_equity("SPY", Resolution.HOUR)
index_symbol = self.add_index("SPX").Symbol
option = self.add_index_option(index_symbol, "SPX", Resolution.HOUR)
option.set_filter(lambda universe: universe.strikes(-200, 200).expiration(0,29))
self.monthly_symbol = option.symbol
option = self.add_index_option(index_symbol, "SPXW", Resolution.HOUR)
option.set_filter(lambda universe: universe.include_weeklys().strikes(-200, 200).expiration(0,29))
self.weekly_symbol = option.symbol
def sell_puts(self, chain, DTE, delta):
# Takes Option Chain and isolates a specific delta and specific DTE count [DTE in trading days]
# Returns a single Options Contract
expos = []
for x in chain:
if x.expiry not in expos: expos.append(x.expiry)
expos = sorted(expos)
target_dte_puts = []
for x in chain:
if x.expiry == expos[DTE] and x.right == OptionRight.PUT:
target_dte_puts.append(x)
target_delta = sorted(target_dte_puts, key=lambda x: abs(delta - x.greeks.delta))[0]
return target_delta
def on_data(self, slice: Slice) -> None:
if self.time.hour == 10 and self.time.minute == 0:
self.log(str(self.time))
monthly_chain = slice.option_chains.get(self.monthly_symbol, None) # Un-used for now
weekly_chain = slice.option_chains.get(self.weekly_symbol, None)
put = self.sell_puts(weekly_chain, 3, -0.06)
self.market_order(put.symbol, -1)
self.log(f'sold {put.strike} put strike')