private void SetPortfolioConstruction(Language language, QCAlgorithm algorithm, PortfolioBias bias = PortfolioBias.LongShort)
        {
            algorithm.SetPortfolioConstruction(new AccumulativeInsightPortfolioConstructionModel((Func <DateTime, DateTime>)null, bias));
            if (language == Language.Python)
            {
                using (Py.GIL())
                {
                    var name     = nameof(AccumulativeInsightPortfolioConstructionModel);
                    var instance = Py.Import(name).GetAttr(name).Invoke(((object)null).ToPython(), ((int)bias).ToPython());
                    var model    = new PortfolioConstructionModelPythonWrapper(instance);
                    algorithm.SetPortfolioConstruction(model);
                }
            }

            foreach (var kvp in _algorithm.Portfolio)
            {
                kvp.Value.SetHoldings(kvp.Value.Price, 0);
            }
            _algorithm.Portfolio.SetCash(_startingCash);
            SetUtcTime(new DateTime(2018, 7, 31));

            var changes = SecurityChangesTests.AddedNonInternal(_algorithm.Securities.Values.ToArray());

            algorithm.PortfolioConstruction.OnSecuritiesChanged(_algorithm, changes);
        }
        private void SetPortfolioConstruction(Language language)
        {
            _algorithm.SetCurrentSlice(null);
            IPortfolioConstructionModel model;

            if (language == Language.CSharp)
            {
                model = new EqualWeightingAlphaStreamsPortfolioConstructionModel();
            }
            else
            {
                throw new NotImplementedException($"{language} not implemented");
            }
            _algorithm.SetPortfolioConstruction(model);

            foreach (var kvp in _algorithm.Portfolio)
            {
                kvp.Value.SetHoldings(kvp.Value.Price, 0);
            }
            _algorithm.Portfolio.SetCash(100000);
            SetUtcTime(new DateTime(2018, 4, 5));

            var changes = SecurityChangesTests.AddedNonInternal(_algorithm.Securities.Values.ToArray());

            _algorithm.PortfolioConstruction.OnSecuritiesChanged(_algorithm, changes);
        }
Esempio n. 3
0
        private void SetPortfolioConstruction(Language language, QCAlgorithm algorithm, dynamic paramenter = null)
        {
            paramenter = paramenter ?? Resolution.Daily;
            algorithm.SetPortfolioConstruction(new ConfidenceWeightedPortfolioConstructionModel(paramenter));
            if (language == Language.Python)
            {
                using (Py.GIL())
                {
                    var name     = nameof(ConfidenceWeightedPortfolioConstructionModel);
                    var instance = Py.Import(name).GetAttr(name).Invoke(((object)paramenter).ToPython());
                    var model    = new PortfolioConstructionModelPythonWrapper(instance);
                    algorithm.SetPortfolioConstruction(model);
                }
            }

            foreach (var kvp in _algorithm.Portfolio)
            {
                kvp.Value.SetHoldings(kvp.Value.Price, 0);
            }
            _algorithm.Portfolio.SetCash(_startingCash);
            SetUtcTime(new DateTime(2018, 7, 31));

            var changes = SecurityChangesTests.AddedNonInternal(_algorithm.Securities.Values.ToArray());

            algorithm.PortfolioConstruction.OnSecuritiesChanged(_algorithm, changes);
        }
Esempio n. 4
0
        public void DelistedSecurityEmitsFlatTargetWithNewInsights(Language language, InsightDirection direction)
        {
            SetPortfolioConstruction(language, _algorithm);

            var insights = new[] { GetInsight(Symbols.SPY, InsightDirection.Down, _algorithm.UtcTime) };
            var targets  = _algorithm.PortfolioConstruction.CreateTargets(_algorithm, insights).ToList();

            Assert.AreEqual(1, targets.Count);

            // Removing SPY should clear the key in the insight collection
            var changes = SecurityChangesTests.RemovedNonInternal(_algorithm.Securities[Symbols.SPY]);

            _algorithm.PortfolioConstruction.OnSecuritiesChanged(_algorithm, changes);

            var amount          = _algorithm.Portfolio.TotalPortfolioValue * (decimal)Confidence;
            var expectedTargets = _algorithm.Securities.Select(x =>
            {
                // Expected target quantity for SPY is zero, since it will be removed
                var quantity = x.Key.Value == "SPY" ? 0 : (int)direction
                               * Math.Floor(amount * (1 - _algorithm.Settings.FreePortfolioValuePercentage)
                                            / x.Value.Price);
                return(new PortfolioTarget(x.Key, quantity));
            });

            // Do no include SPY in the insights
            insights = _algorithm.Securities.Keys.Where(x => x.Value != "SPY")
                       .Select(x => GetInsight(x, direction, _algorithm.UtcTime)).ToArray();

            // Create target from an empty insights array
            var actualTargets = _algorithm.PortfolioConstruction.CreateTargets(_algorithm, insights);

            AssertTargets(expectedTargets, actualTargets);
        }
Esempio n. 5
0
        public void EnsureCurrencyDataFeedChecksSecurityChangesForSecurity()
        {
            const int     quantity       = 100;
            const decimal conversionRate = 1 / 100m;
            var           cash           = new Cash("JPY", quantity, conversionRate);
            var           cashBook       = new CashBook();

            cashBook.Add("JPY", cash);
            var subscriptions = new SubscriptionManager();
            var dataManager   = new DataManagerStub(TimeKeeper);

            subscriptions.SetDataManager(dataManager);
            var abcConfig  = subscriptions.Add(Symbols.SPY, Resolution.Minute, TimeZone, TimeZone);
            var securities = new SecurityManager(TimeKeeper);

            securities.Add(
                Symbols.SPY,
                new Security(
                    SecurityExchangeHours,
                    abcConfig,
                    new Cash(cashBook.AccountCurrency, 0, 1m),
                    SymbolProperties.GetDefault(cashBook.AccountCurrency),
                    ErrorCurrencyConverter.Instance,
                    RegisteredSecurityDataTypesProvider.Null,
                    new SecurityCache()
                    )
                );
            var usdjpy          = new Security(Symbols.USDJPY, SecurityExchangeHours, new Cash("JPY", 0, 0), SymbolProperties.GetDefault("JPY"), ErrorCurrencyConverter.Instance, RegisteredSecurityDataTypesProvider.Null, new SecurityCache());
            var changes         = SecurityChangesTests.CreateNonInternal(new[] { usdjpy }, Enumerable.Empty <Security>());
            var addedSecurities = cash.EnsureCurrencyDataFeed(securities, subscriptions, MarketMap, changes, dataManager.SecurityService, cashBook.AccountCurrency);

            // the security exists in SecurityChanges so it is NOT added to the security manager or subscriptions
            // this security will be added by the algorithm manager
            Assert.True(addedSecurities == null || addedSecurities.Count == 0);
        }
Esempio n. 6
0
        public void OrdersAreNotSubmittedWhenNoTargetsToExecute(Language language)
        {
            var actualOrdersSubmitted = new List <SubmitOrderRequest>();

            var orderProcessor = new Mock <IOrderProcessor>();

            orderProcessor.Setup(m => m.Process(It.IsAny <SubmitOrderRequest>()))
            .Returns((OrderTicket)null)
            .Callback((OrderRequest request) => actualOrdersSubmitted.Add((SubmitOrderRequest)request));

            var algorithm = new QCAlgorithm();

            algorithm.SetPandasConverter();
            algorithm.SubscriptionManager.SetDataManager(new DataManagerStub(algorithm));
            algorithm.Transactions.SetOrderProcessor(orderProcessor.Object);

            var model = GetExecutionModel(language);

            algorithm.SetExecution(model);

            var changes = SecurityChangesTests.CreateNonInternal(Enumerable.Empty <Security>(), Enumerable.Empty <Security>());

            model.OnSecuritiesChanged(algorithm, changes);

            model.Execute(algorithm, new IPortfolioTarget[0]);

            Assert.AreEqual(0, actualOrdersSubmitted.Count);
        }
Esempio n. 7
0
        public void HandlesMultipleCustomDataOfSameTypeWithDifferentSymbols()
        {
            var symbol1 = Symbol.Create("SCF/CBOE_VX1_EW", SecurityType.Base, Market.USA);
            var symbol2 = Symbol.Create("SCF/CBOE_VX2_EW", SecurityType.Base, Market.USA);

            var subscriptionDataConfig1 = new SubscriptionDataConfig(
                typeof(UnlinkedData), symbol1, Resolution.Daily, TimeZones.Utc, TimeZones.Utc, true, true, false, isCustom: true);
            var subscriptionDataConfig2 = new SubscriptionDataConfig(
                typeof(UnlinkedData), symbol2, Resolution.Daily, TimeZones.Utc, TimeZones.Utc, true, true, false, isCustom: true);

            var security1 = new Security(
                SecurityExchangeHours.AlwaysOpen(TimeZones.Utc),
                subscriptionDataConfig1,
                new Cash(Currencies.USD, 0, 1m),
                SymbolProperties.GetDefault(Currencies.USD),
                ErrorCurrencyConverter.Instance,
                RegisteredSecurityDataTypesProvider.Null,
                new SecurityCache()
                );

            var security2 = new Security(
                SecurityExchangeHours.AlwaysOpen(TimeZones.Utc),
                subscriptionDataConfig1,
                new Cash(Currencies.USD, 0, 1m),
                SymbolProperties.GetDefault(Currencies.USD),
                ErrorCurrencyConverter.Instance,
                RegisteredSecurityDataTypesProvider.Null,
                new SecurityCache()
                );

            var timeSlice = _timeSliceFactory.Create(DateTime.UtcNow,
                                                     new List <DataFeedPacket>
            {
                new DataFeedPacket(security1, subscriptionDataConfig1, new List <BaseData> {
                    new UnlinkedData {
                        Symbol = symbol1, Time = DateTime.UtcNow.Date, Value = 15
                    }
                }),
                new DataFeedPacket(security2, subscriptionDataConfig2, new List <BaseData> {
                    new UnlinkedData {
                        Symbol = symbol2, Time = DateTime.UtcNow.Date, Value = 20
                    }
                }),
            },
                                                     SecurityChangesTests.CreateNonInternal(Enumerable.Empty <Security>(), Enumerable.Empty <Security>()),
                                                     new Dictionary <Universe, BaseDataCollection>());

            Assert.AreEqual(2, timeSlice.CustomData.Count);

            var data1 = timeSlice.CustomData[0].Data[0];
            var data2 = timeSlice.CustomData[1].Data[0];

            Assert.IsInstanceOf(typeof(UnlinkedData), data1);
            Assert.IsInstanceOf(typeof(UnlinkedData), data2);
            Assert.AreEqual(symbol1, data1.Symbol);
            Assert.AreEqual(symbol2, data2.Symbol);
            Assert.AreEqual(15, data1.Value);
            Assert.AreEqual(20, data2.Value);
        }
Esempio n. 8
0
        public void InsightsGenerationTest(Language language)
        {
            IAlphaModel model;

            if (!TryCreateModel(language, out model))
            {
                Assert.Ignore($"Ignore {GetType().Name}: Could not create {language} model.");
            }

            // Set the alpha model
            Algorithm.SetAlpha(model);
            Algorithm.SetUniverseSelection(new ManualUniverseSelectionModel());

            var changes = SecurityChangesTests.CreateNonInternal(AddedSecurities, RemovedSecurities);

            Algorithm.OnFrameworkSecuritiesChanged(changes);

            var actualInsights = new List <Insight>();

            Algorithm.InsightsGenerated += (s, e) => actualInsights.AddRange(e.Insights);

            var expectedInsights = ExpectedInsights().ToList();

            var consolidators = Algorithm.Securities.SelectMany(kvp => kvp.Value.Subscriptions).SelectMany(x => x.Consolidators);
            var slices        = CreateSlices();

            foreach (var slice in slices.ToList())
            {
                Algorithm.SetDateTime(slice.Time);

                foreach (var symbol in slice.Keys)
                {
                    var data = slice[symbol];
                    Algorithm.Securities[symbol].SetMarketPrice(data);

                    foreach (var consolidator in consolidators)
                    {
                        consolidator.Update(data);
                    }
                }

                Algorithm.OnFrameworkData(slice);
            }

            Assert.AreEqual(expectedInsights.Count, actualInsights.Count);

            for (var i = 0; i < actualInsights.Count; i++)
            {
                var actual   = actualInsights[i];
                var expected = expectedInsights[i];
                Assert.AreEqual(expected.Symbol, actual.Symbol);
                Assert.AreEqual(expected.Type, actual.Type);
                Assert.AreEqual(expected.Direction, actual.Direction);
                Assert.AreEqual(expected.Period, actual.Period);
                Assert.AreEqual(expected.Magnitude, actual.Magnitude);
                Assert.AreEqual(expected.Confidence, actual.Confidence);
            }
        }
        public void FillsOnTradesOnlyRespectingExchangeOpen(Language language, int expectedOrdersSubmitted, decimal expectedTotalQuantity, bool exchangeOpen)
        {
            var actualOrdersSubmitted = new List <SubmitOrderRequest>();

            var time = new DateTime(2018, 8, 2, 0, 0, 0);

            if (exchangeOpen)
            {
                time = time.AddHours(14);
            }

            var algorithm = new QCAlgorithm();

            algorithm.SetPandasConverter();
            algorithm.SubscriptionManager.SetDataManager(new DataManagerStub(algorithm));
            algorithm.SetDateTime(time.AddMinutes(5));

            var security = algorithm.AddEquity(Symbols.AAPL.Value);

            security.SetMarketPrice(new TradeBar {
                Value = 250
            });

            algorithm.SetFinishedWarmingUp();

            var orderProcessor = new Mock <IOrderProcessor>();

            orderProcessor.Setup(m => m.Process(It.IsAny <SubmitOrderRequest>()))
            .Returns((SubmitOrderRequest request) => new OrderTicket(algorithm.Transactions, request))
            .Callback((OrderRequest request) => actualOrdersSubmitted.Add((SubmitOrderRequest)request));
            orderProcessor.Setup(m => m.GetOpenOrders(It.IsAny <Func <Order, bool> >()))
            .Returns(new List <Order>());
            algorithm.Transactions.SetOrderProcessor(orderProcessor.Object);

            var model = GetExecutionModel(language);

            algorithm.SetExecution(model);

            var changes = SecurityChangesTests.CreateNonInternal(new[] { security }, Enumerable.Empty <Security>());

            model.OnSecuritiesChanged(algorithm, changes);

            var targets = new IPortfolioTarget[] { new PortfolioTarget(Symbols.AAPL, 10) };

            model.Execute(algorithm, targets);

            Assert.AreEqual(expectedOrdersSubmitted, actualOrdersSubmitted.Count);
            Assert.AreEqual(expectedTotalQuantity, actualOrdersSubmitted.Sum(x => x.Quantity));

            if (actualOrdersSubmitted.Count == 1)
            {
                var request = actualOrdersSubmitted[0];
                Assert.AreEqual(expectedTotalQuantity, request.Quantity);
                Assert.AreEqual(algorithm.UtcTime, request.Time);
            }
        }
        public void MultipleAlphaPositionAggregation(Language language, decimal totalPortfolioValueAlpha1, decimal totalPortfolioValueAlpha2, decimal freePortfolioValue)
        {
            SetPortfolioConstruction(language);

            _algorithm.Settings.FreePortfolioValue = freePortfolioValue;
            var alpha1 = _algorithm.AddData <AlphaStreamsPortfolioState>("9fc8ef73792331b11dbd5429a");
            var alpha2 = _algorithm.AddData <AlphaStreamsPortfolioState>("623b06b231eb1cc1aa3643a46");

            _algorithm.OnFrameworkSecuritiesChanged(SecurityChangesTests.AddedNonInternal(alpha1, alpha2));
            var symbol  = alpha1.Symbol;
            var symbol2 = alpha2.Symbol;
            var data    = _algorithm.History <AlphaStreamsPortfolioState>(symbol, TimeSpan.FromDays(1)).Last();

            AddSecurities(_algorithm, data);
            data.TotalPortfolioValue = totalPortfolioValueAlpha1;
            var position = data.PositionGroups.Single().Positions.Single();

            var data2 = (AlphaStreamsPortfolioState)data.Clone();

            data2.Symbol = symbol2;
            data2.TotalPortfolioValue = totalPortfolioValueAlpha2;
            data2.PositionGroups      =
                new List <PositionGroupState>
            {
                new PositionGroupState {
                    Positions =
                        new List <PositionState>
                    {
                        new PositionState
                        {
                            Quantity     = position.Quantity * -10,
                            Symbol       = position.Symbol,
                            UnitQuantity = 1
                        }
                    }
                }
            };

            _algorithm.SetCurrentSlice(new Slice(_algorithm.UtcTime, new List <BaseData> {
                data, data2
            }));

            var targets = _algorithm.PortfolioConstruction.CreateTargets(_algorithm, Array.Empty <Insight>()).ToList();

            Assert.AreEqual(1, targets.Count);
            Assert.AreEqual(position.Symbol, targets.Single().Symbol);

            var tvpPerAlpha  = (_algorithm.Portfolio.TotalPortfolioValue - freePortfolioValue) * 0.5m;
            var alpha1Weight = tvpPerAlpha / data.TotalPortfolioValue;
            var alpha2Weight = tvpPerAlpha / data2.TotalPortfolioValue;

            Assert.AreEqual((position.Quantity * alpha1Weight).DiscretelyRoundBy(1, MidpointRounding.ToZero)
                            + (position.Quantity * -10m * alpha2Weight).DiscretelyRoundBy(1, MidpointRounding.ToZero),
                            targets.Single().Quantity);
        }
        public void PortfolioBiasIsRespected(Language language, PortfolioBias bias)
        {
            SetPortfolioConstruction(language, _algorithm, bias);
            var now = new DateTime(2018, 7, 31);

            SetUtcTime(now.ConvertFromUtc(_algorithm.TimeZone));
            var appl = _algorithm.AddEquity("AAPL");

            appl.SetMarketPrice(new Tick(now, appl.Symbol, 10, 10));

            var spy = _algorithm.AddEquity("SPY");

            spy.SetMarketPrice(new Tick(now, spy.Symbol, 20, 20));

            var ibm = _algorithm.AddEquity("IBM");

            ibm.SetMarketPrice(new Tick(now, ibm.Symbol, 30, 30));

            var aig = _algorithm.AddEquity("AIG");

            aig.SetMarketPrice(new Tick(now, aig.Symbol, 30, 30));

            var qqq = _algorithm.AddEquity("QQQ");

            qqq.SetMarketPrice(new Tick(now, qqq.Symbol, 30, 30));

            var insights = new[]
            {
                new Insight(now, appl.Symbol, TimeSpan.FromDays(1), InsightType.Price, InsightDirection.Up, 0.1d, null),
                new Insight(now, spy.Symbol, TimeSpan.FromDays(1), InsightType.Price, InsightDirection.Down, -0.1d, null),
                new Insight(now, ibm.Symbol, TimeSpan.FromDays(1), InsightType.Price, InsightDirection.Down, 0d, null),
                new Insight(now, aig.Symbol, TimeSpan.FromDays(1), InsightType.Price, InsightDirection.Down, -0.1d, null),
                new Insight(now, qqq.Symbol, TimeSpan.FromDays(1), InsightType.Price, InsightDirection.Up, 0.1d, null)
            };

            _algorithm.PortfolioConstruction.OnSecuritiesChanged(_algorithm, SecurityChangesTests.AddedNonInternal(appl, spy, ibm, aig, qqq));

            var createdValidTarget = false;

            foreach (var target in _algorithm.PortfolioConstruction.CreateTargets(_algorithm, insights))
            {
                QuantConnect.Logging.Log.Trace($"{target.Symbol}: {target.Quantity}");
                if (target.Quantity == 0)
                {
                    continue;
                }

                createdValidTarget = true;
                Assert.AreEqual(Math.Sign((int)bias), Math.Sign(target.Quantity));
            }

            Assert.IsTrue(createdValidTarget);
        }
Esempio n. 12
0
        public void OnSecuritiesChangeDoesNotThrow(
            Language language,
            double[] historicalPrices,
            MarketDataType marketDataType)
        {
            var time = new DateTime(2018, 8, 2, 16, 0, 0);

            Func <double, int, BaseData> func = (x, i) =>
            {
                var price = Convert.ToDecimal(x);
                switch (marketDataType)
                {
                case MarketDataType.TradeBar:
                    return(new TradeBar(time.AddMinutes(i), Symbols.AAPL, price, price, price, price, 100m));

                case MarketDataType.QuoteBar:
                    var bar = new Bar(price, price, price, price);
                    return(new QuoteBar(time.AddMinutes(i), Symbols.AAPL, bar, 10m, bar, 10m));

                default:
                    throw new ArgumentException($"Invalid MarketDataType: {marketDataType}");
                }
            };

            var historyProvider = new Mock <IHistoryProvider>();

            historyProvider.Setup(m => m.GetHistory(It.IsAny <IEnumerable <HistoryRequest> >(), It.IsAny <DateTimeZone>()))
            .Returns(historicalPrices.Select((x, i) => new Slice(time.AddMinutes(i), new List <BaseData> {
                func(x, i)
            })));

            var algorithm = new QCAlgorithm();

            algorithm.SetPandasConverter();
            algorithm.SetHistoryProvider(historyProvider.Object);
            algorithm.SubscriptionManager.SetDataManager(new DataManagerStub(algorithm));
            algorithm.SetDateTime(time.AddMinutes(5));

            var security = algorithm.AddEquity(Symbols.AAPL.Value);

            security.SetMarketPrice(new TradeBar {
                Value = 250
            });
            algorithm.SetFinishedWarmingUp();

            var model = GetExecutionModel(language);

            algorithm.SetExecution(model);

            var changes = SecurityChangesTests.CreateNonInternal(new[] { security }, Enumerable.Empty <Security>());

            Assert.DoesNotThrow(() => model.OnSecuritiesChanged(algorithm, changes));
        }
Esempio n. 13
0
        public void AddedSecuritiesTest(Language language)
        {
            IAlphaModel model;

            if (!TryCreateModel(language, out model))
            {
                Assert.Ignore($"Ignore {GetType().Name}: Could not create {language} model.");
            }

            var changes = SecurityChangesTests.CreateNonInternal(AddedSecurities, RemovedSecurities);

            Assert.DoesNotThrow(() => model.OnSecuritiesChanged(Algorithm, changes));
        }
Esempio n. 14
0
        protected void SetPortfolioConstruction(Language language, PortfolioBias bias)
        {
            var model = GetPortfolioConstructionModel(language, Resolution.Daily, bias);

            _algorithm.SetPortfolioConstruction(model);

            foreach (var kvp in _algorithm.Portfolio)
            {
                kvp.Value.SetHoldings(kvp.Value.Price, 0);
            }

            var changes = SecurityChangesTests.AddedNonInternal(_algorithm.Securities.Values.ToArray());

            _algorithm.PortfolioConstruction.OnSecuritiesChanged(_algorithm, changes);
        }
Esempio n. 15
0
        public void HandlesTicks_ExpectInOrderWithNoDuplicates()
        {
            var subscriptionDataConfig = new SubscriptionDataConfig(
                typeof(Tick),
                Symbols.EURUSD,
                Resolution.Tick,
                TimeZones.Utc,
                TimeZones.Utc,
                true,
                true,
                false);

            var security = new Security(
                SecurityExchangeHours.AlwaysOpen(TimeZones.Utc),
                subscriptionDataConfig,
                new Cash(Currencies.USD, 0, 1m),
                SymbolProperties.GetDefault(Currencies.USD),
                ErrorCurrencyConverter.Instance,
                RegisteredSecurityDataTypesProvider.Null,
                new SecurityCache()
                );

            DateTime refTime = DateTime.UtcNow;

            Tick[] rawTicks = Enumerable
                              .Range(0, 10)
                              .Select(i => new Tick(refTime.AddSeconds(i), Symbols.EURUSD, 1.3465m, 1.34652m))
                              .ToArray();

            IEnumerable <TimeSlice> timeSlices = rawTicks.Select(t => _timeSliceFactory.Create(
                                                                     t.Time,
                                                                     new List <DataFeedPacket> {
                new DataFeedPacket(security, subscriptionDataConfig, new List <BaseData>()
                {
                    t
                })
            },
                                                                     SecurityChangesTests.CreateNonInternal(Enumerable.Empty <Security>(), Enumerable.Empty <Security>()),
                                                                     new Dictionary <Universe, BaseDataCollection>()));

            Tick[] timeSliceTicks = timeSlices.SelectMany(ts => ts.Slice.Ticks.Values.SelectMany(x => x)).ToArray();

            Assert.AreEqual(rawTicks.Length, timeSliceTicks.Length);
            for (int i = 0; i < rawTicks.Length; i++)
            {
                Assert.IsTrue(Compare(rawTicks[i], timeSliceTicks[i]));
            }
        }
        public void DailySampleValueBasedOnMarketHour(bool extendedMarketHoursEnabled)
        {
            var referenceDate = new DateTime(2020, 11, 25);
            var resultHandler = new LiveTradingResultHandler();

            resultHandler.Initialize(new LiveNodePacket(),
                                     new QuantConnect.Messaging.Messaging(),
                                     new Api.Api(),
                                     new BacktestingTransactionHandler());

            var algo = new AlgorithmStub(createDataManager: false);

            algo.SetFinishedWarmingUp();
            var dataManager = new DataManagerStub(new TestDataFeed(), algo);

            algo.SubscriptionManager.SetDataManager(dataManager);
            var aapl = algo.AddEquity("AAPL", extendedMarketHours: extendedMarketHoursEnabled);

            algo.PostInitialize();
            resultHandler.SetAlgorithm(algo, 100000);
            resultHandler.OnSecuritiesChanged(SecurityChangesTests.AddedNonInternal(aapl));

            // Add values during market hours, should always update
            algo.Portfolio.CashBook["USD"].AddAmount(1000);
            algo.Portfolio.InvalidateTotalPortfolioValue();

            resultHandler.Sample(referenceDate.AddHours(15));
            Assert.IsTrue(resultHandler.Charts.ContainsKey("Strategy Equity"));
            Assert.AreEqual(1, resultHandler.Charts["Strategy Equity"].Series["Equity"].Values.Count);

            var currentEquityValue = resultHandler.Charts["Strategy Equity"].Series["Equity"].Values.Last().y;

            Assert.AreEqual(101000, currentEquityValue);

            // Add value to portfolio, see if portfolio updates with new sample
            // will be changed to 'extendedMarketHoursEnabled' = true
            algo.Portfolio.CashBook["USD"].AddAmount(10000);
            algo.Portfolio.InvalidateTotalPortfolioValue();

            resultHandler.Sample(referenceDate.AddHours(22));
            Assert.AreEqual(2, resultHandler.Charts["Strategy Equity"].Series["Equity"].Values.Count);

            currentEquityValue = resultHandler.Charts["Strategy Equity"].Series["Equity"].Values.Last().y;
            Assert.AreEqual(extendedMarketHoursEnabled ? 111000 : 101000, currentEquityValue);

            resultHandler.Exit();
        }
Esempio n. 17
0
        protected void SetPortfolioConstruction(Language language, dynamic paramenter = null)
        {
            var model = GetPortfolioConstructionModel(language, paramenter ?? Resolution.Daily);

            Algorithm.SetPortfolioConstruction(model);

            foreach (var kvp in Algorithm.Portfolio)
            {
                kvp.Value.SetHoldings(kvp.Value.Price, 0);
            }
            Algorithm.Portfolio.SetCash(StartingCash);
            SetUtcTime(new DateTime(2018, 7, 31));

            var changes = SecurityChangesTests.AddedNonInternal(Algorithm.Securities.Values.ToArray());

            Algorithm.PortfolioConstruction.OnSecuritiesChanged(Algorithm, changes);
        }
Esempio n. 18
0
        public void RemovedSecuritiesTest(Language language)
        {
            IAlphaModel model;

            if (!TryCreateModel(language, out model))
            {
                Assert.Ignore($"Ignore {GetType().Name}: Could not create {language} model.");
            }

            var removedSecurities = Algorithm.Securities.Values;

            // We have to add some security if we then want to remove it, that's why we cannot use here
            // RemovedSecurities, because it doesn't contain any security
            var changes = SecurityChangesTests.CreateNonInternal(removedSecurities, AddedSecurities);

            Assert.DoesNotThrow(() => model.OnSecuritiesChanged(Algorithm, changes));
        }
Esempio n. 19
0
        public override void DelistedSecurityEmitsFlatTargetWithNewInsights(Language language, InsightDirection direction)
        {
            SetPortfolioConstruction(language);

            var insights = new[] { GetInsight(Symbols.SPY, InsightDirection.Down, Algorithm.UtcTime) };
            var targets  = Algorithm.PortfolioConstruction.CreateTargets(Algorithm, insights).ToList();

            Assert.AreEqual(1, targets.Count);

            // Removing SPY should clear the key in the insight collection
            var changes = SecurityChangesTests.RemovedNonInternal(Algorithm.Securities[Symbols.SPY]);

            Algorithm.PortfolioConstruction.OnSecuritiesChanged(Algorithm, changes);

            // Since we have 3 B, 2 T and 1 X, each security in each sector will get
            // B => .166%, T => .25, X => 0% (removed)
            var sectorCount     = 2;
            var groupedBySector = Algorithm.Securities
                                  .Where(pair => pair.Value.Fundamentals?.CompanyReference?.IndustryTemplateCode != null)
                                  .GroupBy(pair => pair.Value.Fundamentals.CompanyReference.IndustryTemplateCode);

            var expectedTargets = new List <PortfolioTarget>();

            foreach (var securities in groupedBySector)
            {
                var list   = securities.ToList();
                var amount = Algorithm.Portfolio.TotalPortfolioValue / list.Count / sectorCount *
                             (1 - Algorithm.Settings.FreePortfolioValuePercentage);

                expectedTargets.AddRange(list
                                         .Select(x => new PortfolioTarget(x.Key, x.Key.Value == "SPY" ? 0
                        : (int)direction * Math.Floor(amount / x.Value.Price))));
            }

            // Do no include SPY in the insights
            insights = Algorithm.Securities.Keys.Where(x => x.Value != "SPY")
                       .Select(x => GetInsight(x, direction, Algorithm.UtcTime)).ToArray();

            // Create target from an empty insights array
            var actualTargets = Algorithm.PortfolioConstruction.CreateTargets(Algorithm, insights);

            Assert.Greater(Algorithm.Securities.Count, expectedTargets.Count);
            AssertTargets(expectedTargets, actualTargets);
        }
        public void DoesNotAddOnEndOfDayEventsIfNotImplemented(Language language)
        {
            Security   security;
            IAlgorithm algorithm;

            if (language == Language.CSharp)
            {
                algorithm = new AlgorithmStub();
                security  = (algorithm as QCAlgorithm).AddEquity("SPY");
            }
            else
            {
                algorithm = new AlgorithmPythonWrapper("Test_CustomDataAlgorithm");
                algorithm.SubscriptionManager.SetDataManager(new DataManagerStub(algorithm));
                security = algorithm.AddSecurity(SecurityType.Equity,
                                                 "SPY",
                                                 Resolution.Daily,
                                                 Market.USA,
                                                 false,
                                                 1,
                                                 false);
            }

            var realTimeHandler = new TestBacktestingRealTimeHandler();

            realTimeHandler.Setup(algorithm,
                                  new AlgorithmNodePacket(PacketType.AlgorithmNode)
            {
                Language = language
            },
                                  _resultHandler,
                                  null,
                                  new TestTimeLimitManager());

            Assert.AreEqual(0, realTimeHandler.GetScheduledEventsCount);

            realTimeHandler.OnSecuritiesChanged(
                SecurityChangesTests.CreateNonInternal(new[] { security }, Enumerable.Empty <Security>()));

            Assert.AreEqual(0, realTimeHandler.GetScheduledEventsCount);

            realTimeHandler.Exit();
        }
        public void AddsOnEndOfDayEventsIfImplemented(Language language)
        {
            Security   security;
            IAlgorithm algorithm;

            if (language == Language.CSharp)
            {
                algorithm = new TestAlgorithmB();
                security  = (algorithm as QCAlgorithm).AddEquity("SPY");
            }
            else
            {
                algorithm = new AlgorithmPythonWrapper("OnEndOfDayRegressionAlgorithm");
                algorithm.SubscriptionManager.SetDataManager(new DataManagerStub(new MockDataFeed(), algorithm));
                security = algorithm.AddSecurity(SecurityType.Equity,
                                                 "SPY",
                                                 Resolution.Daily,
                                                 Market.USA,
                                                 false,
                                                 1,
                                                 false);
            }

            var realTimeHandler = new TestBacktestingRealTimeHandler();

            realTimeHandler.Setup(algorithm,
                                  new AlgorithmNodePacket(PacketType.AlgorithmNode)
            {
                Language = language
            },
                                  _resultHandler,
                                  null,
                                  new TestTimeLimitManager());

            // Because neither implement EOD() deprecated it should be zero
            Assert.AreEqual(0, realTimeHandler.GetScheduledEventsCount);

            realTimeHandler.OnSecuritiesChanged(
                SecurityChangesTests.CreateNonInternal(new[] { security }, Enumerable.Empty <Security>()));

            Assert.AreEqual(1, realTimeHandler.GetScheduledEventsCount);
            realTimeHandler.Exit();
        }
        public void NoRebalanceFunction(Language language)
        {
            TestPortfolioConstructionModel constructionModel;

            if (language == Language.Python)
            {
                constructionModel = new TestPortfolioConstructionModel();
                using (Py.GIL())
                {
                    var func = PythonEngine.ModuleFromString(
                        "RebalanceFunc",
                        @"
from datetime import timedelta

def RebalanceFunc():
    return None"
                        ).GetAttr("RebalanceFunc");
                    constructionModel.SetRebalancingFunc(func.Invoke());
                }
            }
            else
            {
                constructionModel = new TestPortfolioConstructionModel();
            }

            Assert.IsTrue(constructionModel.IsRebalanceDueWrapper(new DateTime(2020, 1, 1), new Insight[0]));
            Assert.IsTrue(constructionModel.IsRebalanceDueWrapper(new DateTime(2020, 1, 2), new Insight[0]));
            Assert.IsTrue(constructionModel.IsRebalanceDueWrapper(new DateTime(2020, 1, 3), new Insight[0]));

            var security = new Security(Symbols.SPY,
                                        SecurityExchangeHours.AlwaysOpen(DateTimeZone.Utc),
                                        new Cash(Currencies.USD, 1, 1),
                                        SymbolProperties.GetDefault(Currencies.USD),
                                        new IdentityCurrencyConverter(Currencies.USD),
                                        new RegisteredSecurityDataTypesProvider(),
                                        new SecurityCache());

            constructionModel.OnSecuritiesChanged(null, SecurityChangesTests.AddedNonInternal(security));
            Assert.IsTrue(constructionModel.IsRebalanceDueWrapper(new DateTime(2020, 1, 1), new Insight[0]));
            constructionModel.OnSecuritiesChanged(null, SecurityChanges.None);
            Assert.IsTrue(constructionModel.IsRebalanceDueWrapper(new DateTime(2020, 1, 1), new Insight[0]));
        }
Esempio n. 23
0
        public void SuspiciousTicksAreNotAddedToConsolidatorUpdateData()
        {
            var symbol = Symbols.SPY;

            var subscriptionDataConfig = new SubscriptionDataConfig(
                typeof(Tick), symbol, Resolution.Tick, TimeZones.Utc, TimeZones.Utc, true, true, false);

            var security = new Security(
                SecurityExchangeHours.AlwaysOpen(TimeZones.Utc),
                subscriptionDataConfig,
                new Cash(Currencies.USD, 0, 1m),
                SymbolProperties.GetDefault(Currencies.USD),
                ErrorCurrencyConverter.Instance,
                RegisteredSecurityDataTypesProvider.Null,
                new SecurityCache()
                );

            var timeSlice = _timeSliceFactory.Create(DateTime.UtcNow,
                                                     new List <DataFeedPacket>
            {
                new DataFeedPacket(security, subscriptionDataConfig, new List <BaseData>
                {
                    new Tick(DateTime.UtcNow, symbol, 280, 0, 0),
                    new Tick(DateTime.UtcNow, symbol, 500, 0, 0)
                    {
                        Suspicious = true
                    },
                    new Tick(DateTime.UtcNow, symbol, 281, 0, 0)
                })
            },
                                                     SecurityChangesTests.CreateNonInternal(Enumerable.Empty <Security>(), Enumerable.Empty <Security>()),
                                                     new Dictionary <Universe, BaseDataCollection>());

            Assert.AreEqual(1, timeSlice.ConsolidatorUpdateData.Count);

            var data = timeSlice.ConsolidatorUpdateData[0].Data;

            Assert.AreEqual(2, data.Count);
            Assert.AreEqual(280, data[0].Value);
            Assert.AreEqual(281, data[1].Value);
        }
Esempio n. 24
0
        public void WarmsUpProperly()
        {
            SetUpHistoryProvider();

            Algorithm.SetStartDate(2013, 10, 08);
            Algorithm.SetUniverseSelection(new ManualUniverseSelectionModel());

            // Create a EmaCrossAlphaModel for the test
            var model = new TestEmaCrossAlphaModel();

            // Set the alpha model
            Algorithm.SetAlpha(model);
            Algorithm.SetUniverseSelection(new ManualUniverseSelectionModel());

            var changes = SecurityChangesTests.CreateNonInternal(AddedSecurities, RemovedSecurities);

            Algorithm.OnFrameworkSecuritiesChanged(changes);

            // Get the dictionary of macd indicators
            var symbolData = model.GetSymbolData();

            // Check the symbolData dictionary is not empty
            Assert.NotZero(symbolData.Count);

            // Check all EmaCross indicators from the alpha are ready and have at least
            // one datapoint
            foreach (var item in symbolData)
            {
                var fast = item.Value.Fast;
                var slow = item.Value.Slow;

                Assert.IsTrue(fast.IsReady);
                Assert.NotZero(fast.Samples);

                Assert.IsTrue(slow.IsReady);
                Assert.NotZero(slow.Samples);
            }

            ZipCacheProvider.DisposeSafely();
        }
        public override void DelistedSecurityEmitsFlatTargetWithNewInsights(Language language, InsightDirection direction)
        {
            SetPortfolioConstruction(language);

            if (PortfolioBias != PortfolioBias.LongShort && (int)direction != (int)PortfolioBias)
            {
                direction = InsightDirection.Flat;
            }

            var insights = new[] { GetInsight(Symbols.SPY, InsightDirection.Down, Algorithm.UtcTime) };
            var targets  = Algorithm.PortfolioConstruction.CreateTargets(Algorithm, insights).ToList();

            Assert.AreEqual(1, targets.Count);

            // Removing SPY should clear the key in the insight collection
            var changes = SecurityChangesTests.RemovedNonInternal(Algorithm.Securities[Symbols.SPY]);

            Algorithm.PortfolioConstruction.OnSecuritiesChanged(Algorithm, changes);

            // Equity will be divided by all securities minus 1, since SPY is already invested and we want to remove it
            var amount = Algorithm.Portfolio.TotalPortfolioValue / (decimal)(1 / Weight - 1) *
                         (1 - Algorithm.Settings.FreePortfolioValuePercentage);

            var expectedTargets = Algorithm.Securities.Select(x =>
            {
                // Expected target quantity for SPY is zero, since it will be removed
                var quantity = x.Key.Value == "SPY" ? 0 : (int)direction * Math.Floor(amount / x.Value.Price);
                return(new PortfolioTarget(x.Key, quantity));
            });

            // Do no include SPY in the insights
            insights = Algorithm.Securities.Keys.Where(x => x.Value != "SPY")
                       .Select(x => GetInsight(x, direction, Algorithm.UtcTime)).ToArray();

            // Create target from an empty insights array
            var actualTargets = Algorithm.PortfolioConstruction.CreateTargets(Algorithm, insights);

            AssertTargets(expectedTargets, actualTargets);
        }
Esempio n. 26
0
        public void DelistedSecurityEmitsFlatTargetWithoutNewInsights(Language language)
        {
            SetPortfolioConstruction(language, _algorithm);

            var insights = new[] { GetInsight(Symbols.SPY, InsightDirection.Down, _algorithm.UtcTime) };
            var targets  = _algorithm.PortfolioConstruction.CreateTargets(_algorithm, insights).ToList();

            Assert.AreEqual(1, targets.Count);

            var changes = SecurityChangesTests.RemovedNonInternal(_algorithm.Securities[Symbols.SPY]);

            _algorithm.PortfolioConstruction.OnSecuritiesChanged(_algorithm, changes);

            var expectedTargets = new List <IPortfolioTarget> {
                new PortfolioTarget(Symbols.SPY, 0)
            };

            // Create target from an empty insights array
            var actualTargets = _algorithm.PortfolioConstruction.CreateTargets(_algorithm, new Insight[0]);

            AssertTargets(expectedTargets, actualTargets);
        }
Esempio n. 27
0
        public void PythonVersionWarmsUpProperly()
        {
            using (Py.GIL())
            {
                SetUpHistoryProvider();
                Algorithm.SetStartDate(2013, 10, 08);
                Algorithm.SetUniverseSelection(new ManualUniverseSelectionModel());

                // Create and set alpha model
                dynamic model    = Py.Import("EmaCrossAlphaModel").GetAttr("EmaCrossAlphaModel");
                var     instance = model();
                Algorithm.SetAlpha(instance);

                var changes = SecurityChangesTests.CreateNonInternal(AddedSecurities, RemovedSecurities);
                Algorithm.OnFrameworkSecuritiesChanged(changes);

                // Get the dictionary of ema cross indicators
                var symbolData = instance.symbolDataBySymbol;

                // Check the dictionary is not empty
                Assert.NotZero(symbolData.Length());

                // Check all Ema Cross indicators from the alpha are ready and have at least
                // one datapoint
                foreach (var item in symbolData)
                {
                    var fast = symbolData[item].Fast;
                    var slow = symbolData[item].Slow;

                    Assert.IsTrue(fast.IsReady.IsTrue());
                    Assert.NotZero(((PyObject)fast.Samples).GetAndDispose <int>());

                    Assert.IsTrue(slow.IsReady.IsTrue());
                    Assert.NotZero(((PyObject)slow.Samples).GetAndDispose <int>());
                }

                ZipCacheProvider.DisposeSafely();
            }
        }
Esempio n. 28
0
        public void DuplicateKeyPortfolioConstructionModelDoesNotThrow()
        {
            var algorithm = new QCAlgorithm();
            var timezone  = algorithm.TimeZone;

            algorithm.SetDateTime(new DateTime(2018, 8, 7).ConvertToUtc(timezone));
            algorithm.SetPortfolioConstruction(new DuplicateKeyPortfolioConstructionModel());

            var symbol = Symbols.SPY;

            var security = new Security(
                SecurityExchangeHours.AlwaysOpen(timezone),
                new SubscriptionDataConfig(
                    typeof(TradeBar),
                    symbol,
                    Resolution.Daily,
                    timezone,
                    timezone,
                    true,
                    false,
                    false
                    ),
                new Cash(Currencies.USD, 0, 1),
                SymbolProperties.GetDefault(Currencies.USD),
                ErrorCurrencyConverter.Instance,
                RegisteredSecurityDataTypesProvider.Null,
                new SecurityCache()
                );

            security.SetMarketPrice(new Tick(algorithm.Time, symbol, 1m, 1m));
            algorithm.Securities.Add(symbol, security);

            algorithm.PortfolioConstruction.OnSecuritiesChanged(algorithm, SecurityChangesTests.AddedNonInternal(security));

            var insights = new[] { Insight.Price(symbol, Time.OneMinute, InsightDirection.Up, .1) };

            Assert.DoesNotThrow(() => algorithm.PortfolioConstruction.CreateTargets(algorithm, insights));
        }
Esempio n. 29
0
        private IEnumerable <Slice> GetSlices(Symbol symbol, int initialVolume)
        {
            var subscriptionDataConfig = new SubscriptionDataConfig(typeof(ZipEntryName), symbol, Resolution.Second, TimeZones.Utc, TimeZones.Utc, true, true, false);
            var security = new Security(
                SecurityExchangeHours.AlwaysOpen(TimeZones.Utc),
                subscriptionDataConfig,
                new Cash(Currencies.USD, 0, 1m),
                SymbolProperties.GetDefault(Currencies.USD),
                ErrorCurrencyConverter.Instance,
                RegisteredSecurityDataTypesProvider.Null,
                new SecurityCache()
                );
            var refTime = DateTime.UtcNow;

            return(Enumerable
                   .Range(0, 10)
                   .Select(i =>
            {
                var time = refTime.AddSeconds(i);
                var bid = new Bar(100, 100, 100, 100);
                var ask = new Bar(110, 110, 110, 110);
                var volume = (i + 1) * initialVolume;

                return _timeSliceFactory.Create(
                    time,
                    new List <DataFeedPacket>
                {
                    new DataFeedPacket(security, subscriptionDataConfig, new List <BaseData>
                    {
                        new QuoteBar(time, symbol, bid, i * 10, ask, (i + 1) * 11),
                        new TradeBar(time, symbol, 100, 100, 110, 106, volume)
                    }),
                },
                    SecurityChangesTests.CreateNonInternal(Enumerable.Empty <Security>(), Enumerable.Empty <Security>()),
                    new Dictionary <Universe, BaseDataCollection>())
                .Slice;
            }));
        }