Overall Statistics
Total Trades
47914
Average Win
0.01%
Average Loss
0.00%
Compounding Annual Return
75.576%
Drawdown
20.700%
Expectancy
2.327
Net Profit
208.744%
Sharpe Ratio
1.672
Probabilistic Sharpe Ratio
85.913%
Loss Rate
14%
Win Rate
86%
Profit-Loss Ratio
2.86
Alpha
0.528
Beta
-0.065
Annual Standard Deviation
0.305
Annual Variance
0.093
Information Ratio
0.661
Tracking Error
0.364
Treynor Ratio
-7.903
Total Fees
$49284.48
using QuantConnect.Algorithm.Framework.Selection;
using QuantConnect.Data.Fundamental;
using QuantConnect.Data.UniverseSelection;
using System;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace QuantConnect.Algorithm.CSharp.Caruso
{
    public partial class SmallCapGFCUniverseSelectionModel : FundamentalUniverseSelectionModel 
    {
        bool initialized = false;
        IEnumerable<FineFundamental> universe;

        public SmallCapGFCUniverseSelectionModel(bool filterFineData)
            : base(filterFineData) { }

        public override IEnumerable<Symbol> SelectCoarse(QCAlgorithm qcAlgorithm, IEnumerable<CoarseFundamental> coarseFundamentals)
        {
            List<CoarseFundamental> filtered = new List<CoarseFundamental>();
            List<Symbol> symbols = new List<Symbol>();

            foreach (CoarseFundamental coarseFundamental in coarseFundamentals)
            {   if (coarseFundamental.Price <= 0)
                {
                    continue;
                }
                if (coarseFundamental.Volume <= 0)
                {
                    continue;
                }
                if (!coarseFundamental.HasFundamentalData)
                {
                    continue;
                }
                filtered.Add(coarseFundamental);
                

            }
            filtered = filtered.OrderByDescending(o => o.DollarVolume).ToList();
            symbols = filtered.Select(o => o.Symbol).ToList();
            qcAlgorithm.Debug("Coarse: " + symbols.Count.ToString(CultureInfo.CreateSpecificCulture("en-GB")));
            // if (symbols.Count > 100)
            // {
            //    return symbols.Take(100);
            // }
            return symbols;

        }

        override public IEnumerable<Symbol> SelectFine(QCAlgorithm qCAlgorithm, IEnumerable<FineFundamental> fine)
        {
            if (initialized)
            {
                return this.universe.Select(o => o.Symbol);
            }
            List<FineFundamental> filtered = new List<FineFundamental>();
            foreach (FineFundamental fineFundamental in fine)
            {
                if (fineFundamental.AssetClassification.StyleBox == StyleBox.SmallCore)
                {
                    qCAlgorithm.Debug("Add SmallCore");
                    filtered.Add(fineFundamental);
                }
                if (fineFundamental.AssetClassification.StyleBox == StyleBox.SmallValue)
                {
                    qCAlgorithm.Debug("Add SmallValue");
                    filtered.Add(fineFundamental);
                }
                if (fineFundamental.AssetClassification.StyleBox == StyleBox.SmallGrowth)
                {
                    qCAlgorithm.Debug("Add SmallGrowth");
                    filtered.Add(fineFundamental);
                }

            }
            qCAlgorithm.Debug("Fine: " + filtered.Count.ToString(CultureInfo.CreateSpecificCulture("en-GB")));
            this.universe = filtered.Take(100);
            this.initialized = true;
            return this.universe.Select(o => o.Symbol);


        }
    }
}
using QuantConnect.Algorithm.Framework.Alphas;
using QuantConnect.Data;
using QuantConnect.Securities;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace QuantConnect.Algorithm.CSharp.Caruso
{
    public partial class SmallCapGFCAlphaModel : AlphaModel
    {
        bool initialized = false;
        TimeSpan signalValidityPeriod;

        public SmallCapGFCAlphaModel(TimeSpan signalValidityPeriod)
        {
            this.signalValidityPeriod = signalValidityPeriod;
        }

        public override IEnumerable<Insight> Update(QCAlgorithm algorithm, Slice data)
        {
            List<Insight> insights = new List<Insight>();
            if (!initialized)
            {
                foreach (KeyValuePair<Symbol, BaseData> keyValuePair in data)
                {
                    insights.Add(Insight.Price(keyValuePair.Key, this.signalValidityPeriod, InsightDirection.Up));
                }

            }
            this.initialized = true;
            return insights;
        }

    }
}
using QuantConnect.Algorithm.Framework.Execution;
using QuantConnect.Algorithm.Framework.Portfolio;
using QuantConnect.Algorithm.Framework.Risk;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace QuantConnect.Algorithm.CSharp.Caruso
{
    public partial class SmallCapGFC : QCAlgorithm
    {
        public override void Initialize()
        {
            SetStartDate(2009, 3, 1);
            SetEndDate(2011, 3, 1);
            SetCash(1000000);

            UniverseSettings.Resolution = Resolution.Daily;
            SetUniverseSelection(new SmallCapGFCUniverseSelectionModel(true));
            TimeSpan signalValidityPeriod = TimeSpan.FromDays(1000);
            SetAlpha(new SmallCapGFCAlphaModel(signalValidityPeriod));
            SetRiskManagement(new NullRiskManagementModel());
            SetPortfolioConstruction(new EqualWeightingPortfolioConstructionModel());
            SetExecution(new ImmediateExecutionModel());
        }

    }
}