Overall Statistics |
Total Trades 7 Average Win 2.23% Average Loss 0% Compounding Annual Return 15.505% Drawdown 5.600% Expectancy 0 Net Profit 7.450% Sharpe Ratio 1.061 Loss Rate 0% Win Rate 100% Profit-Loss Ratio 0 Alpha 0.078 Beta 0.653 Annual Standard Deviation 0.118 Annual Variance 0.014 Information Ratio 0.614 Tracking Error 0.085 Treynor Ratio 0.192 Total Fees $18.08 |
using AForge.Fuzzy; namespace QuantConnect { public class FuzzyEngine { private InferenceSystem IS; public FuzzyEngine() { // Linguistic labels (fuzzy sets) for Momentum FuzzySet momDown = new FuzzySet("Down", new TrapezoidalFunction(-20, 5, 5, 5)); FuzzySet momNeutral = new FuzzySet("Neutral", new TrapezoidalFunction(-20, 0, 0, 20)); FuzzySet momUp = new FuzzySet("Up", new TrapezoidalFunction(5, 20, 20, 20)); // Linguistic labels (fuzzy sets) for RSI FuzzySet rsiLow = new FuzzySet("Low", new TrapezoidalFunction(0, 30, 30, 30)); FuzzySet rsiMedium = new FuzzySet("Medium", new TrapezoidalFunction(0, 50, 50, 100)); FuzzySet rsiHigh = new FuzzySet("High", new TrapezoidalFunction(70, 100, 100, 100)); // MOM (Input) LinguisticVariable lvMom = new LinguisticVariable("MOM", -20, 20); lvMom.AddLabel(momDown); lvMom.AddLabel(momNeutral); lvMom.AddLabel(momUp); // RSI (Input) LinguisticVariable lvRsi = new LinguisticVariable("RSI", 0, 100); lvRsi.AddLabel(rsiLow); lvRsi.AddLabel(rsiMedium); lvRsi.AddLabel(rsiHigh); // Linguistic labels (fuzzy sets) that compose the Signal FuzzySet fsShort = new FuzzySet("Sell", new TrapezoidalFunction(-100, 0, 0, 00)); FuzzySet fsHold = new FuzzySet("Hold", new TrapezoidalFunction(-50, 0, 0, 50)); FuzzySet fsLong = new FuzzySet("Buy", new TrapezoidalFunction(0, 100, 100, 100)); // Output LinguisticVariable lvSignal = new LinguisticVariable("Signal", -100, 100); lvSignal.AddLabel(fsShort); lvSignal.AddLabel(fsHold); lvSignal.AddLabel(fsLong); // The database Database fuzzyDB = new Database(); fuzzyDB.AddVariable(lvMom); fuzzyDB.AddVariable(lvRsi); fuzzyDB.AddVariable(lvSignal); // Creating the inference system IS = new InferenceSystem(fuzzyDB, new CentroidDefuzzifier(1000)); // Rules IS.NewRule("Rule 1", "IF RSI IS Low AND MOM IS Down THEN Signal IS Buy"); IS.NewRule("Rule 2", "IF RSI IS Medium AND MOM IS Down THEN Signal IS Buy"); IS.NewRule("Rule 3", "IF RSI IS High AND MOM IS Down THEN Signal IS Hold"); IS.NewRule("Rule 4", "IF RSI IS Low AND MOM IS Neutral THEN Signal IS Buy"); IS.NewRule("Rule 5", "IF RSI IS Medium AND MOM IS Neutral THEN Signal IS Hold"); IS.NewRule("Rule 6", "IF RSI IS High AND MOM IS Neutral THEN Signal IS Sell"); IS.NewRule("Rule 7", "IF RSI IS Low AND MOM IS Up THEN Signal IS Hold"); IS.NewRule("Rule 8", "IF RSI IS Medium AND MOM IS Up THEN Signal IS Sell"); IS.NewRule("Rule 9", "IF RSI IS High AND MOM IS Up THEN Signal IS Sell"); } public double DoInference(float mom, float rsi) { // Setting inputs IS.SetInput("MOM", mom); IS.SetInput("RSI", rsi); // Setting outputs double signal = IS.Evaluate("Signal"); return signal; } } }
using QuantConnect.Data.Market; using QuantConnect.Indicators; using AForge.Fuzzy; namespace QuantConnect.Algorithm.CSharp { public class FuzzyInferenceAlgorithm : QCAlgorithm { //Indicators private RelativeStrengthIndex rsi; private Momentum mom; private string symbol = "SPY"; //Fuzzy Engine private FuzzyEngine engine; public override void Initialize() { SetStartDate(2016, 01, 01); //Set Start Date SetEndDate(2016, 06, 30); //Set End Date SetCash(100000); //Set Strategy Cash AddEquity(symbol, Resolution.Daily); rsi = RSI(symbol, 14, MovingAverageType.Simple, Resolution.Daily); mom = MOM(symbol, 10, Resolution.Daily, Field.Close); engine = new FuzzyEngine(); } public void OnData(TradeBars data) { if (rsi.IsReady && mom.IsReady) { try { double signal = engine.DoInference((float)mom.Current.Value,(float)rsi.Current.Value); if (!Portfolio.Invested) { if (signal > 30) { int quantity = Decimal.ToInt32(Portfolio.Cash / data[symbol].Price); Buy(symbol, quantity); Debug("Purchased Stock: " + quantity + " shares"); } } else { if(signal < -10) { int quantity = Portfolio[symbol].Quantity; Sell(symbol, quantity); Debug("Sold Stock: " + quantity + " shares"); } } } catch(Exception ex) { Debug("Ex: "+ex.Message); Debug("## rsi: "+ rsi + " mom: " + mom ); } } } } }