Overall Statistics |
Total Trades 71 Average Win 0% Average Loss -53.38% Compounding Annual Return 3.247% Drawdown 58.700% Expectancy -1 Net Profit 26.465% Sharpe Ratio 0.277 Loss Rate 100% Win Rate 0% Profit-Loss Ratio 0 Alpha 0.078 Beta -0.058 Annual Standard Deviation 0.263 Annual Variance 0.069 Information Ratio -0.073 Tracking Error 0.3 Treynor Ratio -1.265 Total Fees $86.38 |
namespace QuantConnect { public class ShortVXX : QCAlgorithm { private int MINIMUM_BLOCK_SIZE = 100; private double MINIMUM_EXPOSURE = 25; // percent // Due to data error with split private Tuple<long, long> [] blackPeriods = { new Tuple<long, long>(Convert.ToDateTime("08/07/2016").Ticks, Convert.ToDateTime("08/09/2016").Ticks), new Tuple<long, long>(Convert.ToDateTime("11/03/2013").Ticks, Convert.ToDateTime("11/10/2013").Ticks), new Tuple<long, long>(Convert.ToDateTime("10/01/2012").Ticks, Convert.ToDateTime("10/06/2012").Ticks) }; public override void Initialize() { SetStartDate(2010, 1, 1); SetEndDate(DateTime.Now); SetCash(250000); AddEquity("VXX", Resolution.Hour); //Securities["VXX"].SetLeverage(5.0m); //Securities["VXX"].MarginModel = (Securities.ISecurityMarginModel)MarginCallModel.Null; Chart plotter = new Chart("VXX short"); plotter.AddSeries(new Series("Position", SeriesType.Line)); AddChart(plotter); } private bool isBlackPeriod(DateTime dt) { return false; long dtTicks = dt.Ticks; foreach (var period in blackPeriods) { if ((dtTicks >= period.Item1) && (dtTicks <= period.Item2)) { return true; } } return false; } public void OnData(TradeBars data) { if (!data.ContainsKey("VXX")) { return; } TradeBar dataBar = data["VXX"]; if (dataBar.EndTime.Hour != 15) // rebalance at the start of the trading day { return; } int positionShares = Math.Abs(Portfolio["VXX"].Quantity); var closePrice = (double)dataBar.Close; var positionSize = positionShares * (double)closePrice; if (isBlackPeriod(dataBar.EndTime)) { if (positionShares > 0) { Debug("Black period liquidation=" + positionShares + " "+dataBar.EndTime); Order("VXX", positionShares); } return; } var delta = (MINIMUM_EXPOSURE/100)*(double)Portfolio.Cash - positionSize; int amount = (int)Math.Ceiling(delta/closePrice); if (amount >= MINIMUM_BLOCK_SIZE) { Debug("NET=" + Portfolio.Cash + " positionShares=" + (-positionShares) + " price=" + closePrice + " amount=" + (-amount)); Order("VXX", -amount); //Plot("VXX short", "Position", positionSize); } } } }