Overall Statistics
Total Orders
49
Average Win
2.55%
Average Loss
-1.07%
Compounding Annual Return
7.127%
Drawdown
8.400%
Expectancy
0.688
Start Equity
25000
End Equity
32920.16
Net Profit
31.681%
Sharpe Ratio
0.713
Sortino Ratio
0.787
Probabilistic Sharpe Ratio
38.252%
Loss Rate
50%
Win Rate
50%
Profit-Loss Ratio
2.38
Alpha
0.003
Beta
0.489
Annual Standard Deviation
0.056
Annual Variance
0.003
Information Ratio
-0.615
Tracking Error
0.058
Treynor Ratio
0.082
Total Fees
$49.00
Estimated Strategy Capacity
$640000000.00
Lowest Capacity Asset
SPY R735QTJ8XC9X
Portfolio Turnover
2.13%
from AlgorithmImports import *
from QuantConnect.DataSource import *

class CBOEDataAlgorithmAlgorithm(QCAlgorithm):

    def initialize(self) -> None:

        self.set_start_date(2014,1,1) 
        self.set_end_date(2018,1,1)  
        self.set_cash(25000)
        
        self.spy = self.add_equity("SPY", Resolution.DAILY).symbol

        # Define the symbol and "type" of our generic data
        self.vix = self.add_data(CBOE, 'VIX', Resolution.DAILY).symbol
        self.vxv = self.add_data(CBOE, 'VIX3M', Resolution.DAILY).symbol
        
        # Set up default Indicators, these are just 'identities' of the closing price
        self.vix_sma = self.SMA(self.vix, 1, Resolution.DAILY)
        self.vxv_sma = self.SMA(self.vxv, 1, Resolution.DAILY)
        
        # This will create a new indicator whose value is smaVXV / smaVIX
        self.ratio = IndicatorExtensions.over(self.vxv_sma, self.vix_sma)
        
        # Plot indicators each time they update using the PlotIndicator function
        self.plot_indicator("Ratio", self.ratio)
        self.plot_indicator("Data", self.vix_sma, self.vxv_sma)

        history = self.history(CBOE, self.vix, 60, Resolution.DAILY)
        self.debug(f"We got {len(history.index)} items from our history request");
    
    def on_data(self, slice: Slice) -> None:
        
        # Wait for all indicators to fully initialize
        if not (self.vix_sma.is_ready and self.vxv_sma.is_ready and self.ratio.is_ready): return
        if not self.portfolio.invested and self.ratio.current.value > 1:
            self.market_order(self.spy, 100)
        elif self.ratio.current.value < 1:
            self.liquidate()