Exemplo n.º 1
0
            /// <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;
                    }
                };
            }
Exemplo n.º 2
0
        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);
            }
        }
Exemplo n.º 3
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);
        }
Exemplo n.º 4
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 / (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);
            }
        }
Exemplo n.º 6
0
        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();
            }
        }