Overall Statistics |
Total Trades 26 Average Win 479.29% Average Loss -13.64% Compounding Annual Return 10.377% Drawdown 84.100% Expectancy 5.774 Net Profit 161.806% Sharpe Ratio 0.437 Loss Rate 81% Win Rate 19% Profit-Loss Ratio 35.13 Alpha 0.206 Beta 0.046 Annual Standard Deviation 0.48 Annual Variance 0.23 Information Ratio 0.229 Tracking Error 0.516 Treynor Ratio 4.609 Total Fees $242.07 |
namespace QuantConnect { public class BasicTemplateAlgorithm : QCAlgorithm { private RateOfChangePercent ROCPyear; private ROCPRateOfChangePercent ROCPROCPyear; private string symbol; public override void Initialize() { SetStartDate(2006, 1, 1); SetEndDate(DateTime.Now); SetCash(25000); symbol = "LNG"; AddSecurity(SecurityType.Equity, symbol, Resolution.Daily); ROCPyear = new RateOfChangePercent(252); // 252 trading days in a US year RegisterIndicator(symbol, ROCPyear, Resolution.Daily, Field.Close); PlotIndicator("ROCP", true, ROCPyear); ROCPROCPyear = new ROCPRateOfChangePercent(252); RegisterIndicator(symbol, ROCPROCPyear, Resolution.Daily, Field.Close); PlotIndicator("ROCP", true, ROCPROCPyear); } //Data Event Handler: New data arrives here. "TradeBars" type is a dictionary of strings so you can access it by symbol. public void OnData(TradeBars data) { if (!ROCPyear.IsReady) return; var quantity = Portfolio[symbol].Quantity; if (quantity == 0 && ROCPyear > 20) { SetHoldings(symbol, .75); } if (quantity > 0) { if (ROCPyear < 0) { SetHoldings(symbol, 0); } } if (quantity < 0) { if (ROCPyear > 0) { SetHoldings(symbol, 0); } } if (quantity == 0 && ROCPyear < -20) { SetHoldings(symbol, -.75); } } } }
using MathNet.Numerics; namespace QuantConnect { public class AnnualizedExponentialSlope : WindowIndicator<IndicatorDataPoint> { public AnnualizedExponentialSlope(int period) : base("AdjustedSlope" + period, period) { } public AnnualizedExponentialSlope(string name, int period) : base(name, period) { } protected override decimal ComputeNextValue(IReadOnlyWindow<IndicatorDataPoint> window, IndicatorDataPoint input) { if (window.Count < 3) return 0m; var xVals = new double[window.Count]; var yVals = new double[window.Count]; // load input data for regression for (int i = 0; i < window.Count; i++) { xVals[i] = i; // we want the log of our y values yVals[i] = Math.Log((double)window[window.Count - i - 1].Value); } //http://numerics.mathdotnet.com/Regression.html // solves y=a + b*x via linear regression var fit = Fit.Line(xVals, yVals); var intercept = fit.Item1; var slope = fit.Item2; // compute rsquared var rsquared = GoodnessOfFit.RSquared(xVals.Select(x => intercept + slope*x), yVals); // anything this small can be viewed as flat if (double.IsNaN(slope) || Math.Abs(slope) < 1e-25) return 0m; // trading days per year for us equities const int dayCount = 252; // annualize dy/dt var annualSlope = ((Math.Pow(Math.Exp(slope), dayCount)) - 1) * 100; // scale with rsquared annualSlope = annualSlope * rsquared; return (decimal) annualSlope; } } }
/* * QUANTCONNECT.COM - Democratizing Finance, Empowering Individuals. * Lean Algorithmic Trading Engine v2.0. Copyright 2014 QuantConnect Corporation. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ namespace QuantConnect.Indicators { /// <summary> /// This indicator computes the n-period percentage rate of change in a value using the following: /// 100 * (value_0 - value_n) / value_n /// </summary> public class ROCPRateOfChangePercent : WindowIndicator<IndicatorDataPoint> { /// <summary> /// Creates a new RateOfChangePercent indicator with the specified period /// </summary> /// <param name="period">The period over which to perform to computation</param> public ROCPRateOfChangePercent(int period) : base("ROCPROCP" + period, period + 1) { } /// <summary> /// Creates a new RateOfChangePercent indicator with the specified period /// </summary> /// <param name="name">The name of this indicator</param> /// <param name="period">The period over which to perform to computation</param> public ROCPRateOfChangePercent(string name, int period) : base(name, period + 1) { } /// <summary> /// Computes the next value for this indicator from the given state. /// </summary> /// <param name="window">The window of data held in this indicator</param> /// <param name="input">The input value to this indicator on this time step</param> /// <returns>A new value for this indicator</returns> protected override decimal ComputeNextValue(IReadOnlyWindow<IndicatorDataPoint> window, IndicatorDataPoint input) { // if we're not ready just grab the first input point in the window decimal denominator = !window.IsReady ? window[window.Count - 1] : window.MostRecentlyRemoved; decimal newDenom = !window.IsReady ? window[window.Count - 2] : window[window.Count - 1]; if (denominator == 0 || newDenom == 0) { return 0; } decimal oldROCP = (window[0] - denominator)/denominator; decimal newROCP = (input - newDenom)/newDenom; if (oldROCP == 0) { return 0; } return 100*(newROCP - oldROCP)/oldROCP; } } }