Overall Statistics
Total Trades
1135
Average Win
0.70%
Average Loss
-0.58%
Compounding Annual Return
-3.561%
Drawdown
28.900%
Expectancy
-0.060
Net Profit
-19.562%
Sharpe Ratio
-0.278
Loss Rate
57%
Win Rate
43%
Profit-Loss Ratio
1.20
Alpha
-0.023
Beta
0.016
Annual Standard Deviation
0.079
Annual Variance
0.006
Information Ratio
-0.735
Tracking Error
0.152
Treynor Ratio
-1.389
Total Fees
$1135.00
namespace QuantConnect 
{   
    /*
    *   Little algorithm that goes long in a stock when VIX goes down
    *	Likewise, goes short when VIX goes up
    * 	[By JPB for Stephen Oehler]
    */
    public class VolatilityETN : QCAlgorithm
    {
    	// Initialise tickers
    	string ticker = "SPY";
        string volindex = "YAHOO/INDEX_VIX";
        
        // Initialise moving averages
		ExponentialMovingAverage emaFast;
        ExponentialMovingAverage emaSlow;
        
        // Current trading direction
        int _dir = 0;
        
        //Initialize the data and resolution you require for your strategy:
        public override void Initialize()
        {
            SetStartDate(2010, 1, 1);         
            SetEndDate(2016, 1, 1);
            SetCash(25000);
            
            // Add the SPY
            AddSecurity(SecurityType.Equity, ticker, Resolution.Hour);
            
            // Add the VIX (from Quandl)
            AddData<Quandl>(volindex, Resolution.Daily);
            
            // Create moving averages based on VIX
            emaFast = EMA(volindex, 1);
            emaSlow = EMA(volindex, 5);
            
            //Manually creating and subscribing indicator for data updates.
            //This allows the indicator to automatically be the right value.
            var SlowConsolidator = new DynamicDataConsolidator(1, TimeSpan.FromDays(1));
            RegisterIndicator(volindex, emaFast, SlowConsolidator, x => x.Value);
            
            var FastConsolidator = new DynamicDataConsolidator(1, TimeSpan.FromDays(1));
            RegisterIndicator(volindex, emaSlow, FastConsolidator, x => x.Value);
        }
        
        //Data Event Handler for Quandl data
        public void OnData(Quandl data)
        {
            // Leave this for now (don't need it for logic)
        }

		// Handle data in OnData(Slice data) event
        public void OnData(TradeBars data) 
        {   
        	// Before OnData() is called, moving averages are updated
        	// So we can now simply use them in our trading logic
            
            // Trading logic will be that VIX is the inverse of SPY
            // So if moving average of VIX goes up, we expect SPY to go down
            
            // buy/sell logic   
            if (_dir != -1 && emaFast > emaSlow) { 			// moving average VIX up && not currently short
            	Liquidate(ticker);							// Liquidate current position
            	Order(ticker, -100);						// go SHORT
            	_dir = -1;
            } else if (_dir != 1 && emaFast < emaSlow){		// moving average VIX down && not currently long
				Liquidate(ticker);							// Liquidate current position
            	Order(ticker, 100);							// go LONG
            	_dir = 1;
            }
        }
    }
}