/// <summary> /// Main constructor for the class /// </summary> /// <param name="rangePeriod">Range period</param> /// <param name="consolidatorResolution">Time length of consolidator</param> public SymbolData(int rangePeriod, TimeSpan consolidatorResolution) { _rangeWindow = new RollingWindow <TradeBar>(rangePeriod); _consolidator = new TradeBarConsolidator(consolidatorResolution); // event fired at new consolidated trade bar _consolidator.DataConsolidated += (sender, consolidated) => { // add new tradebar to _rangeWindow.Add(consolidated); if (IsReady) { var hh = _rangeWindow.Select(x => x.High).Max(); var hc = _rangeWindow.Select(x => x.Close).Max(); var lc = _rangeWindow.Select(x => x.Close).Min(); var ll = _rangeWindow.Select(x => x.Low).Min(); Range = Math.Max(hh - lc, hc - ll); UpperLine = consolidated.Close + K1 * Range; LowerLine = consolidated.Close - K2 * Range; } }; }
public void OnData(TradeBars data) { if (IsWarmingUp) { return; } var logData = _window.Select(closingPrice => Math.Log10(closingPrice)); var diff = logData.Zip(logData.Skip(1), (x, y) => y - x); var returns = _engine.CreateNumericVector(diff); _engine.SetSymbol("roll.returns", returns); _engine.Evaluate(@"source('C:\Users\M\Documents\Visual Studio 2015\Projects\Trading\Trading\arima_garch.r')"); var direction = _engine.GetSymbol("directions").AsInteger()[0]; var holdings = Portfolio[Symbol].Quantity; if (holdings <= 0 && direction == 1) { Log("BUY >> " + Securities[Symbol].Price); SetHoldings(Symbol, 1.0); } else if (holdings >= 0 && direction == -1) { Log("SELL >> " + Securities[Symbol].Price); SetHoldings(Symbol, -1.0); } }
private decimal VolatilityScaledSharpeRatio(decimal spyAllocation, decimal tltAllocation) { var dailyReturns = _dailyReturns.Select(dailyReturn => spyAllocation * dailyReturn.Item1 + tltAllocation * dailyReturn.Item2); var mean = dailyReturns.Average(); foreach (var dr in dailyReturns) { _sd.Update(DateTime.Now, dr); } var sharpe = mean / Convert.ToDecimal(Math.Pow(Convert.ToDouble(_sd), _volatilityFactor)); return(sharpe); }
private decimal VolatilityScaledSharpeRatio(decimal spyAllocation, decimal tltAllocation) { var dailyReturns = _dailyReturns.Select(dailyReturn => spyAllocation * dailyReturn.Item1 + tltAllocation * dailyReturn.Item2); var mean = dailyReturns.Average(); foreach (var dr in dailyReturns) { _sd.Update(DateTime.Now, dr); } var sharpe = mean / (decimal)Math.Pow((double)_sd.Current.Value, _volatilityFactor); return(sharpe); }
public void WhenComputing_Then_ResultIsTheSumOfAllDataInTheWindow() { const int period = 5; var sut = new SumOfSquaresComputation(); var window = new RollingWindow <double>(period); for (int i = 0; i < 2 * period; i++) { window.Add(i); var result = sut.Compute(window); Assert.AreEqual(window.Select(x => x * x).Sum(), result); } }
public override void Initialize() { SetStartDate(2015, 1, 1); SetEndDate(DateTime.Now); SetCash(10000); AddSecurity(SecurityType.Equity, spy, _dataResolution); AddSecurity(SecurityType.Equity, tlt, _dataResolution); _sd = new StandardDeviation(LookbackPeriod - 1); _dailyReturns = new RollingWindow <Tuple <decimal, decimal> >(LookbackPeriod - 1); var spyHistory = History(spy, TimeSpan.FromDays(LookbackPeriod), _dataResolution); var tltHistory = History(tlt, TimeSpan.FromDays(LookbackPeriod), _dataResolution); var history = spyHistory.Zip(tltHistory, (spyBar, tltBar) => new Tuple <TradeBar, TradeBar>(spyBar, tltBar)); var highestSharpe = 0m; for (decimal spyAllocation = 0.0m, tltAllocation = 1.0m; spyAllocation <= 1.0m; spyAllocation += 0.1m, tltAllocation -= 0.1m) { var previousBar = history.First(); foreach (var tradeBar in history.Skip(1)) { var spyReturn = spyAllocation * (tradeBar.Item1.Close - previousBar.Item1.Close) / previousBar.Item1.Close; var tltReturn = tltAllocation * (tradeBar.Item2.Close - previousBar.Item2.Close) / previousBar.Item2.Close; _dailyReturns.Add(new Tuple <decimal, decimal>(spyReturn, tltReturn)); _sd.Update(tradeBar.Item1.EndTime, spyReturn + tltReturn); previousBar = tradeBar; } var mean = _dailyReturns.Select(dailyReturn => dailyReturn.Item1 + dailyReturn.Item2).Average(); var sharpe = mean / Convert.ToDecimal(Math.Pow(Convert.ToDouble(_sd), _volatilityFactor)); if (sharpe > highestSharpe) { highestSharpe = sharpe; _spyAllocation = spyAllocation; _tltAllocation = tltAllocation; } _sd.Reset(); _dailyReturns.Reset(); } }