Overall Statistics |
Total Trades 25 Average Win 3.40% Average Loss -3.75% Compounding Annual Return 37.491% Drawdown 9.100% Expectancy 0.429 Net Profit 20.208% Sharpe Ratio 1.665 Loss Rate 25% Win Rate 75% Profit-Loss Ratio 0.91 Alpha 0.23 Beta -0.013 Annual Standard Deviation 0.138 Annual Variance 0.019 Information Ratio 1.565 Tracking Error 0.138 Treynor Ratio -17.829 Total Fees $46.25 |
using System; using System.Linq; using QuantConnect.Brokerages; using QuantConnect.Data; using QuantConnect.Data.Custom; using QuantConnect.Indicators; using QuantConnect.Securities; using QuantConnect.Securities.Future; namespace QuantConnect.Algorithm.CSharp { public class VIXFuturesTermStructure : QCAlgorithm { private Future _es; private Identity _esIdentity; private IndicatorDataPoint _latestEs; private IndicatorDataPoint _latestVx; private Identity _vix; private Future _vx; private Identity _vxIdentity; private bool _entryLong; private DateTime _entryDate; public override void Initialize() { SetStartDate(year: 2018, month: 1, day: 1); SetEndDate(year: 2018, month: 8, day: 1); SetCash(startingCash: 100000); SetBrokerageModel(BrokerageName.InteractiveBrokersBrokerage); // Schedule.On(DateRules.EveryDay(), TimeRules.At(hour: 9, minute: 31), Rebalance); _es = AddFuture(Futures.Indices.SP500EMini); _vx = AddFuture(Futures.Indices.VIX); _es.SetFilter(f => f.FrontMonth()); _vx.SetFilter(TimeSpan.Zero, TimeSpan.FromDays(value: 182)); AddData<QaundlVIX>("CBOE/VIX", Resolution.Daily, TimeZones.Chicago); _vix = new Identity("VIX"); _vxIdentity = new Identity("VX"); _esIdentity = new Identity("ES"); PlotIndicator("VIX", _vix); PlotIndicator("VIX", _vxIdentity); PlotIndicator("ES", _esIdentity); } public override void OnData(Slice slice) { if (slice.FutureChains.ContainsKey(_vx.Symbol)) { var vixContract = slice.FutureChains[_vx.Symbol].OrderBy(x => x.Expiry).FirstOrDefault(); if (vixContract != null) { _latestVx = new IndicatorDataPoint(Time, vixContract.LastPrice); } } if (slice.FutureChains.ContainsKey(_es.Symbol)) { var esContract = slice.FutureChains[_es.Symbol].OrderBy(x => x.Expiry).LastOrDefault(); if (esContract != null) { _latestEs = new IndicatorDataPoint(Time, esContract.LastPrice); if (!Portfolio.Invested && _entryLong) { MarketOrder(esContract.Symbol, 1); _entryDate = Time; } if (Portfolio.Invested && Time > _entryDate.AddDays(15)) { Liquidate(); } } } } public void OnData(Quandl data) { // Updates the identity indicators. if (data.Symbol.Value.EndsWith("VIX")) _vix.Update(Time, data.Value); } public override void OnEndOfDay() { _vxIdentity.Update(_latestVx); _esIdentity.Update(_latestEs); _entryLong = _vix < _vxIdentity; } } public class QaundlVIX : Quandl { public QaundlVIX() : base("VIX Close") { } } }