| Overall Statistics |
|
Total Trades 240 Average Win 0.28% Average Loss -0.39% Compounding Annual Return 17.020% Drawdown 1.600% Expectancy 0.106 Net Profit 5.015% Sharpe Ratio 3.037 Probabilistic Sharpe Ratio 91.485% Loss Rate 36% Win Rate 64% Profit-Loss Ratio 0.72 Alpha 0.11 Beta 0.034 Annual Standard Deviation 0.038 Annual Variance 0.001 Information Ratio -0.562 Tracking Error 0.128 Treynor Ratio 3.446 Total Fees $240.00 Estimated Strategy Capacity $37000.00 Lowest Capacity Asset SPXW Y7QDMKELZ9TA|SPX 31 Portfolio Turnover 1.22% |
#author : Nguyen Tung nttssv@gmail.com
# strategy -1) volatility play 2) Sell ATM strangle at 1650 and close at 9:45 the next day DTE 1
from AlgorithmImports import *
class BasicTemplateSPXWeeklyIndexOptionsAlgorithm(QCAlgorithm):
def Initialize(self):
self.SetStartDate(2023,1, 1)
#self.SetEndDate(2023, 2, 13)
self.SetCash(300000)
self.SetTimeZone(TimeZones.NewYork)
self.SetBrokerageModel(BrokerageName.InteractiveBrokersBrokerage,AccountType.Margin)
self.spx = self.AddIndex("SPX", Resolution.Minute)
self.SetBenchmark("SPX")
# weekly option SPX contracts
spxw = self.AddIndexOption(self.spx.Symbol, "SPXW")
# set our strike/expiry filter for this option chain
spxw.SetFilter(lambda u: (u.Strikes(-3, 3)
.Expiration(1,1)
.IncludeWeeklys()))
self.spxw_option = spxw.Symbol
self.order_call = 0
self.order_put = 0
def OnData(self,slice):
#day high and day low
current_price = self.spx.Price
#if self.Portfolio.Invested:
# return
if self.Time.hour == 15 and self.Time.minute == 50:
self.Debug(f'current spx value is {current_price}')
chain = slice.OptionChains.GetValue(self.spxw_option)
if chain is None:
return
call = [x for x in chain if x.Right == OptionRight.Call]
put = [x for x in chain if x.Right == OptionRight.Put]
# we sort the contracts to find contract with the right delta
put_contract = sorted(put,key = lambda x: abs(abs(x.Strike) - current_price))
call_contract = sorted(call,key = lambda x: abs(x.Strike - current_price))
# if found, trade it
if len(put_contract) == 0 and self.order_put == 0:
return
else:
put_ = put_contract[0].Symbol
self.Debug(f'{self.order_put}')
self.order_put = 1
self.MarketOrder(put_, -1)
if len(call_contract) == 0 and self.order_call == 0:
return
else:
call_ = call_contract[0].Symbol
self.Debug(f'{self.order_call}')
self.order_call = 1
self.MarketOrder(call_, -1)
elif self.Time.hour == 9 and self.Time.minute == 45:
self.Liquidate()
self.order_call = 0
self.order_put = 0
else:
return
def OnOrderEvent(self, orderEvent):
self.Debug(str(orderEvent))
self.Debug(self.spx.Price)
self.Debug(self.Time)