| Overall Statistics |
|
Total Trades 1 Average Win 0% Average Loss 0% Compounding Annual Return 1.858% Drawdown 26.300% Expectancy 0 Net Profit 0% Sharpe Ratio 0.25 Loss Rate 0% Win Rate 0% Profit-Loss Ratio 0 Alpha 0.019 Beta -0.029 Annual Standard Deviation 0.07 Annual Variance 0.005 Information Ratio -0.137 Tracking Error 0.203 Treynor Ratio -0.611 Total Fees $1.00 |
using QuantConnect.Data.Consolidators;
namespace QuantConnect
{
/*
* John Ehlers' Empirical Mode Decomposition
* (programmed by Jean-Paul van Brakel)
*/
public class BasicTemplateAlgorithm : QCAlgorithm
{
public string _ticker = "SPY"; // which stock ticker
public static double DC_delta = 0.5; // band sensitivity
public static int DC_period = 20; // lags to consider
public static decimal DC_frac = 0.10M; // fraction sensitivity
public static int MESA_length = 9;
private TradeBarConsolidator consolidator;
public static int _consolidated_days = 5; // number of days
private readonly RollingWindow<TradeBar> Closes = new RollingWindow<TradeBar>(MESA_length);
private readonly RollingWindow<double> BPHist = new RollingWindow<double>((int)DC_period);
private readonly RollingWindow<double> PeakHist = new RollingWindow<double>(55);
private readonly RollingWindow<double> ValleyHist = new RollingWindow<double>(55);
private readonly SimpleMovingAverage MA_BP = new SimpleMovingAverage(2*DC_period);
private readonly SimpleMovingAverage MA_Peak = new SimpleMovingAverage(50);
private readonly SimpleMovingAverage MA_Valley = new SimpleMovingAverage(50);
private Chart plotter;
decimal _oldprice = 100000;
decimal _price;
int _old_dir = 0;
int _mama_dir = 0;
int _trend_dir = 0;
public override void Initialize()
{
//Start and End Date range for the backtest:
SetStartDate(2000, 1, 1);
SetEndDate(2014, 1, 1);
SetCash(25000);
AddSecurity(SecurityType.Equity, _ticker, Resolution.Daily);
consolidator = new TradeBarConsolidator(TimeSpan.FromDays(_consolidated_days));
consolidator.DataConsolidated += ConsolidatedHandler;
SubscriptionManager.AddConsolidator(_ticker, consolidator);
plotter = new Chart("Decomp", ChartType.Overlay);
plotter.AddSeries(new Series("Mean", SeriesType.Line));
plotter.AddSeries(new Series("Upper band", SeriesType.Line));
plotter.AddSeries(new Series("Lower band", SeriesType.Line));
AddChart(plotter);
PeakHist.Add(0.0); // add one empty Peak entry
ValleyHist.Add(0.0); // add one empty Valley entry
}
public void OnData(TradeBars data)
{
// ignore this for now
}
public void ConsolidatedHandler(object sender, TradeBar data) {
Closes.Add(data);
_price = data.Close;
if (!Closes.IsReady) return;
// Empirical Mode Decomposition
// *********************************************************************************************************
double beta = Math.Cos(2*Math.PI/DC_period);
double gamma = (1 / Math.Cos(4*Math.PI*DC_delta / DC_period));
double alpha = gamma - Math.Sqrt(Math.Pow(gamma, 2) - 1);
double p0 = (double)((decimal)Closes[0].High+(decimal)Closes[0].Low)/2;
double p2 = (double)((decimal)Closes[2].High+(decimal)Closes[2].Low)/2;
double BP = 0;
if (BPHist.IsReady) {
BP = 0.5*(1-alpha)*(p0-p2)+beta*(1+alpha)*BPHist[0]-alpha*BPHist[1];
} else {
BP = 0.5*(1-alpha)*(p0-p2);
}
// update data
BPHist.Add(BP); // so current BP is now [0]
MA_BP.Update(new IndicatorDataPoint(data.Time, (decimal)BP));
decimal Mean = MA_BP;
if (!BPHist.IsReady) return;
// calculate peak and valley
double Peak = PeakHist[0];
double Valley = ValleyHist[0];
if (BPHist[1] > BPHist[0] && BPHist[1] > BPHist[2]) {
Peak = BPHist[1];
}
if (BPHist[1] < BPHist[0] && BPHist[1] < BPHist[2]) {
Valley = BPHist[1];
}
// update data
PeakHist.Add(Peak); // so current Peak is now [0]
ValleyHist.Add(Valley); // so current Valley is now [0]
MA_Peak.Update(new IndicatorDataPoint(data.Time, (decimal)Peak));
MA_Valley.Update(new IndicatorDataPoint(data.Time, (decimal)Valley));
decimal AvgPeak = MA_Peak;
decimal AvgValley = MA_Valley;
// calculate final indicators
decimal upperBand = DC_frac*AvgPeak;
decimal lowerBand = DC_frac*AvgValley;
// Update chart
Plot("Decomp", "Mean", Mean);
Plot("Decomp", "Upper band", upperBand);
Plot("Decomp", "Lower band", lowerBand);
// *********************************************************************************************************
// Update chart
Plot("Decomp", "Mean", Mean);
Plot("Decomp", "Upper band", upperBand);
Plot("Decomp", "Lower band", lowerBand);
// No logic (this algorithm is to demonstrate the decomposition)
if (!Portfolio.HoldStock) {
Order(_ticker, 100);
}
}
}
}