Overall Statistics
Total Trades
3271
Average Win
0.83%
Average Loss
-0.22%
Compounding Annual Return
-4.595%
Drawdown
51.600%
Expectancy
-0.103
Net Profit
-40.305%
Sharpe Ratio
-0.178
Probabilistic Sharpe Ratio
0.002%
Loss Rate
81%
Win Rate
19%
Profit-Loss Ratio
3.85
Alpha
-0.046
Beta
0.127
Annual Standard Deviation
0.16
Annual Variance
0.025
Information Ratio
-0.772
Tracking Error
0.213
Treynor Ratio
-0.224
Total Fees
$2860.00
using System;
using System.Collections.Generic;
using System.Linq;
using QuantConnect.Data;
using QuantConnect.Data.Market;
using QuantConnect.Orders;
using QuantConnect.Securities;
using QuantConnect.Securities.Option;
using QuantConnect.Util;

namespace QuantConnect.Algorithm.CSharp
{
	public class PerformanceTest : QCAlgorithm
	{
		private const int MaxInvested = 15;

		private static readonly string UnderlyingTicker = "GOOG";
		private static readonly Symbol OptionSymbol = QuantConnect.Symbol.Create(UnderlyingTicker, SecurityType.Option, Market.USA);
		private static readonly Symbol UnderlyingSymbol = QuantConnect.Symbol.Create(UnderlyingTicker, SecurityType.Equity, Market.USA);
		private static readonly ISet<Symbol> tradedSymbols = new HashSet<Symbol>();
		private static readonly ISet<Symbol> seenSymbols = new HashSet<Symbol>();
		private static readonly ISet<Symbol> chainSymbols = new HashSet<Symbol>();
		
		private DateTime dailyTracking = DateTime.Now;
		private bool tradedToday = false;
		
        public override void Initialize()
        {
	        SetStartDate(new DateTime(2010, 1, 1));
            SetEndDate(DateTime.Now);
            SetCash(1000000);

            AddEquity(UnderlyingSymbol, Resolution.Daily, Market.USA, false);
            Option option = AddOption(UnderlyingSymbol, Resolution.Minute, Market.USA, false);
            option.SetFilter(u => 
			        u.Expiration(30, 90)
	            	.Strikes(10, 10)
            );
            // option.PriceModel = OptionPriceModels.BaroneAdesiWhaley();
        }

        public override void OnData(Slice slice)
        {
	        IEnumerable<SecurityHolding> investedSecurities = Portfolio.Values.Where(sh => sh.Invested);
	        int count = investedSecurities.Count();
	        if (count > MaxInvested)
	        {
		        int countToLiquidate = count - MaxInvested;
		        foreach (SecurityHolding securityHolding in investedSecurities)
		        {
			        if (IsMarketOpen(securityHolding.Symbol))
			        {
			        	// Debug($"Liquidating {securityHolding.Symbol} {countToLiquidate}");
				        Liquidate(securityHolding.Symbol);
				        if (--countToLiquidate <= 0)
					        break;
			        }
		        }
	        }
	        
	        OptionChain chain;
	        if (CurrentSlice.OptionChains.TryGetValue(OptionSymbol, out chain))
	        {
	        	chainSymbols.UnionWith(chain.Select(oc => oc.Symbol));
	        	
	        	if(!tradedToday)
	        	{
			        foreach (OptionContract optionContract in chain.SkipWhile(contract => tradedSymbols.Contains(contract.Symbol)))
			        {
			        	seenSymbols.Add(optionContract.Symbol);
				        if (IsMarketOpen(optionContract.Symbol))
				        {
				        	// Debug($"Sending mkt order {optionContract.Symbol}");
					        MarketOrder(optionContract.Symbol, Decimal.One);
					        break;
				        }
			        }
	        	}
	        }
        }

        public override void OnOrderEvent(OrderEvent orderEvent)
        {
	        if (orderEvent.Status == OrderStatus.Filled || orderEvent.Status == OrderStatus.PartiallyFilled)
	        {
	        	if(orderEvent.Quantity > 0)
	        	{
		        	// Debug($"Filled {orderEvent.Symbol}");
			        tradedSymbols.Add(orderEvent.Symbol);
			        tradedToday = true;
	        	}
	        	// else
	        	// {
	        	// 	Debug($"Unwound {orderEvent.Symbol}");
	        	// }
	        }
        }

        public override void OnEndOfDay()
        {
	        Log($"{(DateTime.Now - dailyTracking).TotalSeconds}, {Portfolio.Count}, {Portfolio.Count(kvp => kvp.Value.Invested)}, {seenSymbols.Count()}, {tradedSymbols.Count()}, {chainSymbols.Count()}");
	        dailyTracking = DateTime.Now;
	        tradedToday = false;
        }
	}
}
namespace QuantConnect.Algorithm.Framework.Alphas
{
    public class EquityHighLowAlphaModel : AlphaModel
    {
        private readonly Resolution _resolution;
        private readonly TimeSpan _insightDuration;
        private readonly Symbol _highs;
        private readonly Symbol _lows; 

        public EquityHighLowAlphaModel(
            QCAlgorithm algorithm,
            int insightPeriod = 1,
            Resolution resolution = Resolution.Daily
            )
        {
        	_resolution = resolution;
        	// Add Quandl data for the Federal Interest Rate
            _highs = algorithm.AddData<Quandl52WeekHigh>("URC/NASDAQ_52W_HI" , _resolution).Symbol;
            _lows = algorithm.AddData<Quandl52WeekLow>("URC/NYSE_52W_LO" , _resolution).Symbol;
            _insightDuration = resolution.ToTimeSpan().Multiply(insightPeriod);
        }
        
        
        public override IEnumerable<Insight> Update(QCAlgorithm algorithm, Slice data)
        {
            var insights = new List<Insight>();
            
            // Check for all Quandl Symbols in current data Slice
            if (!(data.ContainsKey(_highs) && data.ContainsKey(_lows))){
            	return insights;
            }

			// Higher numbers of stocks at their 52-week low naturally correlate with recessions or
            // large stock market corrections, and the opposite can be said of large numbers of stocks
            // reaching their 52-week highs at the same time. When viewed like this, the spread between
            // the two numbers can tell us a lot about the overall direction of the US equities
            // market. If the spread between High and Low decreases and/or inverts, this is likely a
            // significant indicator of a bear market. This and other metrics can be used to generate
            // valuable Insights
            
            // More URC market data can be found at Quandl
            // https://www.quandl.com/data/URC-Unicorn-Research-Corporation
	        
	        // Generate Insights here!
	        
            return insights;
        } 
        
        public override void OnSecuritiesChanged(QCAlgorithm algorithm, SecurityChanges changes)
        {
        	
        }
    }

    public class Quandl52WeekHigh : Quandl
    {
        public Quandl52WeekHigh()
            : base(valueColumnName: "Numbers of Stocks")
        {
        }
    }

    public class Quandl52WeekLow : Quandl
    {
        public Quandl52WeekLow()
            : base(valueColumnName: "Numbers of Stocks")
        {
        }
    }
}
using QuantConnect.Data.Custom.CBOE;
namespace QuantConnect
{
	public class CboeVixAlphaModel : AlphaModel
	{
		private Symbol _vix;
		
		public CboeVixAlphaModel(QCAlgorithm algorithm)
		{
			_vix = algorithm.AddData<CBOE>("VIX").Symbol;
		}
		
		public override IEnumerable<Insight> Update(QCAlgorithm algorithm, Slice data)
		{
			var insights = new List<Insight>();
			
			if (!data.ContainsKey(_vix))
			{
				return insights;
			}
			
			var vix = data.Get<CBOE>(_vix);
			
			// The Cboe Volatility Index® (VIX® Index) is the most popular benchmark index to measure
	        // the market’s expectation of future volatility. The VIX Index is based on
	        // options of the S&P 500® Index, considered the leading indicator of the broad
	        // U.S. stock market. The VIX Index is recognized as the world’s premier gauge
	        // of U.S. equity market volatility.
	        
	        // Generate Insights here!
			
			return insights;
		}
		
		public override void OnSecuritiesChanged(QCAlgorithm algorithm, SecurityChanges changes)
        {
            // For instruction on how to use this method, please visit
            // https://www.quantconnect.com/docs/algorithm-framework/alpha-creation#Alpha-Creation-Good-Design-Patterns
        }
	}
}
namespace QuantConnect.Algorithm.Framework.Alphas
{
    public class FederalInterestRateAlphaModel : AlphaModel
    {
        private readonly Resolution _resolution;
        private readonly TimeSpan _insightDuration;
        private readonly Symbol _fedRate;

        public FederalInterestRateAlphaModel(
            QCAlgorithm algorithm,
            int insightPeriod = 30,
            Resolution resolution = Resolution.Daily
            )
        {
        	_resolution = resolution;
        	// Add Quandl data for the Federal Interest Rate
            _fedRate = algorithm.AddData<QuandlFedRateColumns>("FRED/FEDFUNDS" , _resolution).Symbol;
            _insightDuration = resolution.ToTimeSpan().Multiply(insightPeriod); 
        }
        
        
        public override IEnumerable<Insight> Update(QCAlgorithm algorithm, Slice data)
        {
            var insights = new List<Insight>();  
            
            // Check for all Quandl Symbols in current data Slice
            if (!data.ContainsKey(_fedRate)){
            	return insights;
            }

			// The Federal Interest Rate (Federal Funds Rate) is one of the most important elements
	        // of the US economy and any change has profound effects across all markets, but especially
	        // in debt-based securities, currencies, consumer spending, and a negative effect on equities 
	        // whose companies primarily do business in international markets. The data is monthly, so
	        // Insight generation will not occur with a high frequency.
	        
	        // Additional Federal Reserve data can be found at Quandl
	        // https://www.quandl.com/data/FRED-Federal-Reserve-Economic-Data
	        
	        // Generate Insights here!
	        
            return insights;
        } 
        
        public override void OnSecuritiesChanged(QCAlgorithm algorithm, SecurityChanges changes)
        {
        } 

    }
    public class QuandlFedRateColumns : Quandl
    {
        public QuandlFedRateColumns()
        	// Rename the Quandl object column to the data we want, which is the column containing 
        	// the yield in the CSV that our API call returns
            : base(valueColumnName: "Value")
        {
        }
    }
}
namespace QuantConnect.Algorithm.Framework.Alphas
{
    public class TreasuryYieldAlphaModel : AlphaModel
    {
        private readonly Resolution _resolution;
        private readonly TimeSpan _insightDuration;
        private readonly double _insightMagnitude;
        private readonly Symbol _fedRate; 

        public TreasuryYieldAlphaModel(
            QCAlgorithm algorithm,
            int insightPeriod = 15,
            double insightMagnitude = 0.0005,
            Resolution resolution = Resolution.Daily
            )
        {
        	_resolution = resolution;
        	// Add Quandl data for FRED 10-Year Treasury Constant Maturity Rate
            _fedRate = algorithm.AddData<QuandlTreasuryYieldColumns>("FRED/DGS10" , _resolution).Symbol;
            _insightDuration = resolution.ToTimeSpan().Multiply(insightPeriod);
            _insightMagnitude = insightMagnitude;
        }
        
        public override IEnumerable<Insight> Update(QCAlgorithm algorithm, Slice data)
        {
            var insights = new List<Insight>();
            
            // Check for all Quandl Symbols in current data Slice
            if (!data.ContainsKey(_fedRate)){
            	return insights;
            }

			// Treasury rates have been shown to affect the movement of mortgage rate, corporate and municipal bonds,
	        // mortgage backed securities, and a number of other debt-related securities. This can also trickle down,
	        // such as mortgage rate movement affecting real estate based securities.
	        
	        // Additional Federal Reserve data on Treasury Bond Yields can be found at Quandl
	        // https://www.quandl.com/data/FRED-Federal-Reserve-Economic-Data
	        
	        // Generate Insights here! 
	        
            return insights;
        }
        
        public override void OnSecuritiesChanged(QCAlgorithm algorithm, SecurityChanges changes)
        {
        	
        } 


    }
    public class QuandlTreasuryYieldColumns : Quandl
    {
        /// <summary>
        /// Initializes a new instance of the <see cref="QuandlMortgagePriceColumns"/> class.
        /// </summary>
        public QuandlTreasuryYieldColumns()
        	// Rename the Quandl object column to the data we want, which is the 'Value' column
        	// of the CSV that our API call returns
            : base(valueColumnName: "Value")
        {
        }
    }
}
using QuantConnect.Data.Custom.USTreasury;
namespace QuantConnect
{
	public class YieldCurveAlphaModel : AlphaModel
	{
		private Symbol _yieldCurve;

		public YieldCurveAlphaModel(QCAlgorithm algorithm)
		{
			_yieldCurve = algorithm.AddData<USTreasuryYieldCurveRate>("YIELDCURVE").Symbol;
		}
		
		public override IEnumerable<Insight> Update(QCAlgorithm algorithm, Slice data)
		{
			var insights = new List<Insight>();
			
			if (data.ContainsKey(_yieldCurve))
			{
				var rate = data.Get<USTreasuryYieldCurveRate>().Values.First();
				
				// The data is sourced directly from the U.S. Department of the Treasury. Also known
	            // as "Constant Maturity Treasury" (CMT) rates, these market yields are calculated
	            // from composites of indicative, bid-side market quotations (not actual transactions)
	            // obtained by the Federal Reserve Bank of New York at or near 3:30 PM each trading day.
	        
	            // Data can be accessed the normal way via the Slice events. Slice events deliver
	            // unique articles to your algorithm as they happen. You can access different term 
	            // yield curve fields such as rate.OneMonth, rate.TwoYear, rate.TwentyYear, etc.
	        
	            // Generate Insights here!
			}
			
			return insights;
		}
	}
}