Overall Statistics
Total Trades
19
Average Win
1247.40%
Average Loss
-1.97%
Compounding Annual Return
254.221%
Drawdown
9.600%
Expectancy
69.470
Net Profit
1157.630%
Sharpe Ratio
10.198
Probabilistic Sharpe Ratio
7.959%
Loss Rate
89%
Win Rate
11%
Profit-Loss Ratio
633.23
Alpha
76.713
Beta
0.352
Annual Standard Deviation
7.525
Annual Variance
56.629
Information Ratio
10.187
Tracking Error
7.526
Treynor Ratio
217.896
Total Fees
$273727.50
Estimated Strategy Capacity
$25000.00
Lowest Capacity Asset
SPY 2ZE1VVCOOOW2U|SPY R735QTJ8XC9X
class MuscularFluorescentYellowFox(QCAlgorithm):

    def Initialize(self):
        
        self.SetStartDate(2011, 1, 1)  # Set Start Date
        self.SetEndDate(2012, 12, 31)
        self.SetCash(1000000)  # Set Strategy Cash
        spy = self.AddEquity("SPY", Resolution.Minute)
        spy.SetDataNormalizationMode(DataNormalizationMode.Raw)
        
        self.spy = spy.Symbol
        
        self.Settings.FreePortfolioValuePercentage = 0.00
        
        # schedule trading at end of every week 
        self.Schedule.On(self.DateRules.WeekEnd("SPY"), \
                        self.TimeRules.BeforeMarketClose("SPY", 10), \
                        self.Trade)
        
        self.percentage = 0.98                
        
        # put option
        
        self.OTM = 0.6
        
        self.contract_n = None
        self.threshold_time_n = 60
        self.lower_thr = self.threshold_time_n * 2 - 10
        self.upper_thr = self.threshold_time_n * 2 + 10
        
        
    def Trade(self):
        
        self.insurance_r(self.CurrentSlice)
        
    def insurance_r(self, slice):
        
        if self.contract_n is None:
            self.contract_n = self.GetContract(slice, self.OTM, self.lower_thr, self.upper_thr)
        
        elif self.contract_n:
            if not self.Portfolio[self.contract_n].Invested:
                self.SetHoldings(self.contract_n, (1 - self.percentage))
                self.UnderlyingPrice = self.Portfolio[self.spy].Price
                self.Log(str("CTR: [QTY_BUY, UnderlyingPrice, Option_Price, Strike] = ") + str(self.contract_n) + str(":") + 
                str([self.Portfolio[self.contract_n].Quantity, self.Portfolio[self.spy].Price, self.Portfolio[self.contract_n].Price, 
                self.contract_n.ID.StrikePrice]))
                self.UnderlyingPrice = self.Portfolio[self.spy].Price
                
            if (self.contract_n.ID.Date - self.Time).days < self.threshold_time_n:
                quantity = self.Portfolio[self.contract_n].Quantity
                self.Liquidate(self.contract_n)
                self.Log(str("CTR: [LQD_ROLL, SPY_Price, Option_Price, Strike]: ") + str(self.contract_n) + str(":") + 
                str([quantity, self.Portfolio[self.spy].Price, self.Portfolio[self.contract_n].Price,
                self.contract_n.ID.StrikePrice]))
                self.RemoveSecurity(self.contract_n)
                self.contract_n = None
                self.contract_n = self.GetContract(slice, self.OTM, self.lower_thr, self.upper_thr)
            
    def GetContract(self, slice, strike_OTM, lower_thr, upper_thr):
        
        upperStrike = (slice[self.spy].Price * (1 - strike_OTM)) - (slice[self.spy].Price * (1 - strike_OTM))%5 + 10
        lowerStrike = (slice[self.spy].Price * (1 - strike_OTM)) - (slice[self.spy].Price * (1 - strike_OTM))%5
        contracts = self.OptionChainProvider.GetOptionContractList(self.spy, self.Time)
        puts = [x for x in contracts if x.ID.OptionRight == OptionRight.Put]
        puts = sorted (sorted(puts, key = lambda x: x.ID.Date, reverse = True), key = lambda x: x.ID.StrikePrice)
        
        puts = [x for x in puts if lowerStrike <= x.ID.StrikePrice <= upperStrike]
        puts = [x for x in puts if lower_thr < (x.ID.Date - self.Time).days <= upper_thr]
        sort_strikes = sorted(puts, key = lambda x: x.ID.StrikePrice, reverse = False)
        sorted_puts = sorted(sort_strikes, key = lambda x: (x.ID.Date - self.Time).days, reverse = True)
        
        if len(sorted_puts) == 0:
            return None
        option = self.AddOptionContract(sorted_puts[0], Resolution.Minute)
        option.PriceModel = OptionPriceModels.BinomialTian() 
        self.Log("Option_Put: [Symbol, Strike, Expiry, Right]" + str(option) +  str([option.StrikePrice, option.Expiry, option.Right]))
        
        return sorted_puts[0]