コード例 #1
0
        public void FiltersStrikeRangeWithPositiveMinStrikeOutOfRange(decimal underlyingPrice)
        {
            var expiry     = new DateTime(2016, 03, 04);
            var underlying = new Tick {
                Value = underlyingPrice, Time = new DateTime(2016, 02, 26)
            };

            Func <OptionFilterUniverse, OptionFilterUniverse> universeFunc = universe => universe
                                                                             .Strikes(1, 3)
                                                                             .Expiration(TimeSpan.Zero, TimeSpan.MaxValue);

            Func <IDerivativeSecurityFilterUniverse, IDerivativeSecurityFilterUniverse> func =
                universe => universeFunc(universe as OptionFilterUniverse);

            var filter  = new FuncSecurityDerivativeFilter(func);
            var symbols = new[]
            {
                Symbol.CreateOption("SPY", Market.USA, OptionStyle.American, OptionRight.Put, 15, expiry), // 0
                Symbol.CreateOption("SPY", Market.USA, OptionStyle.American, OptionRight.Put, 20, expiry), // 1
            };

            var filterUniverse = new OptionFilterUniverse(symbols, underlying);
            var filtered       = filter.Filter(filterUniverse).ToList();

            Assert.AreEqual(0, filtered.Count);
            Assert.AreEqual(true, filterUniverse.IsDynamic);
        }
コード例 #2
0
ファイル: QuantBook.cs プロジェクト: lennon33/Lean
        /// <summary>
        /// Gets <see cref="OptionHistory"/> object for a given symbol, date and resolution
        /// </summary>
        /// <param name="symbol">The symbol to retrieve historical option data for</param>
        /// <param name="start">The history request start time</param>
        /// <param name="end">The history request end time. Defaults to 1 day if null</param>
        /// <param name="resolution">The resolution to request</param>
        /// <returns>A <see cref="OptionHistory"/> object that contains historical option data.</returns>
        public OptionHistory GetOptionHistory(Symbol symbol, DateTime start, DateTime?end = null, Resolution?resolution = null)
        {
            if (!end.HasValue || end.Value == start)
            {
                end = start.AddDays(1);
            }

            // Load a canonical option Symbol if the user provides us with an underlying Symbol
            if (symbol.SecurityType != SecurityType.Option && symbol.SecurityType != SecurityType.FutureOption)
            {
                symbol = AddOption(symbol, resolution, symbol.ID.Market).Symbol;
            }

            IEnumerable <Symbol> symbols;

            if (symbol.IsCanonical())
            {
                // canonical symbol, lets find the contracts
                var option = Securities[symbol] as Option;
                var resolutionToUseForUnderlying = resolution ?? SubscriptionManager.SubscriptionDataConfigService
                                                   .GetSubscriptionDataConfigs(symbol)
                                                   .GetHighestResolution();
                if (!Securities.ContainsKey(symbol.Underlying))
                {
                    // only add underlying if not present
                    AddEquity(symbol.Underlying.Value, resolutionToUseForUnderlying);
                }
                var allSymbols = new List <Symbol>();
                for (var date = start; date < end; date = date.AddDays(1))
                {
                    if (option.Exchange.DateIsOpen(date))
                    {
                        allSymbols.AddRange(OptionChainProvider.GetOptionContractList(symbol.Underlying, date));
                    }
                }

                var optionFilterUniverse = new OptionFilterUniverse();
                var distinctSymbols      = allSymbols.Distinct();
                symbols = base.History(symbol.Underlying, start, end.Value, resolution)
                          .SelectMany(x =>
                {
                    // the option chain symbols wont change so we can set 'exchangeDateChange' to false always
                    optionFilterUniverse.Refresh(distinctSymbols, x, exchangeDateChange: false);
                    return(option.ContractFilter.Filter(optionFilterUniverse));
                })
                          .Distinct().Concat(new[] { symbol.Underlying });
            }
            else
            {
                // the symbol is a contract
                symbols = new List <Symbol> {
                    symbol
                };
            }

            return(new OptionHistory(History(symbols, start, end.Value, resolution)));
        }
コード例 #3
0
 /// <summary>
 /// Defines the option chain universe filter
 /// </summary>
 protected override OptionFilterUniverse Filter(OptionFilterUniverse filter)
 {
     return(filter
            .Strikes(+1, +1)
            .Expiration(TimeSpan.Zero, TimeSpan.FromDays(7))
            .WeeklysOnly()
            .PutsOnly()
            .OnlyApplyFilterAtMarketOpen());
 }
コード例 #4
0
ファイル: DynamicAlgorithm.cs プロジェクト: jasonhillier/Lean
 /// <summary>
 /// Defines the option chain universe filter
 /// </summary>
 protected override OptionFilterUniverse Filter(OptionFilterUniverse filter)
 {
     return(filter
            .Strikes(-20, +20)
            .Expiration(TimeSpan.Zero, TimeSpan.FromDays(60)));
     //.WeeklysOnly()
     //.PutsOnly()
     //.OnlyApplyFilterAtMarketOpen();
 }
コード例 #5
0
 /// <summary>
 /// Defines the option chain universe filter
 /// </summary>
 protected override OptionFilterUniverse Filter(OptionFilterUniverse filter)
 {
     return(filter
            .Strikes(+1, +1)
            .Expiration(TimeSpan.Zero, TimeSpan.FromDays(7))
            .WeeklysOnly()
            .Contracts(contracts => contracts.Where(x => x.ID.OptionRight == OptionRight.Put))
            .OnlyApplyFilterAtMarketOpen());
 }
コード例 #6
0
 /// <summary>
 /// Initializes a new instance of the <see cref="OptionChainUniverse"/> class
 /// </summary>
 /// <param name="option">The canonical option chain security</param>
 /// <param name="universeSettings">The universe settings to be used for new subscriptions</param>
 /// <param name="liveMode">True if we're running in live mode, false for backtest mode</param>
 public OptionChainUniverse(Option option,
                            UniverseSettings universeSettings,
                            bool liveMode)
     : base(option.SubscriptionDataConfig)
 {
     Option                = option;
     _underlyingSymbol     = new[] { Option.Symbol.Underlying };
     _universeSettings     = universeSettings;
     _liveMode             = liveMode;
     _optionFilterUniverse = new OptionFilterUniverse();
 }
コード例 #7
0
 /// <summary>
 /// Defines the option chain universe filter
 /// </summary>
 protected override OptionFilterUniverse Filter(OptionFilterUniverse filter)
 {
     return(filter
            .Strikes(+1, +1)
            // Expiration method accepts TimeSpan objects or integer for days.
            // The following statements yield the same filtering criteria
            .Expiration(0, 7)
            //.Expiration(TimeSpan.Zero, TimeSpan.FromDays(7))
            .WeeklysOnly()
            .PutsOnly()
            .OnlyApplyFilterAtMarketOpen());
 }
コード例 #8
0
 public OptionChainUniverse(Option option,
                            UniverseSettings universeSettings,
                            ISecurityInitializer securityInitializer,
                            bool liveMode)
     : base(option.SubscriptionDataConfig, securityInitializer)
 {
     Option            = option;
     _underlyingSymbol = new[] { Option.Symbol.Underlying };
     _universeSettings = new UniverseSettings(universeSettings)
     {
         DataNormalizationMode = DataNormalizationMode.Raw
     };
     _liveMode             = liveMode;
     _optionFilterUniverse = new OptionFilterUniverse();
 }
コード例 #9
0
        public void FiltersStrikeRange(decimal underlyingPrice)
        {
            var expiry     = new DateTime(2016, 03, 04);
            var underlying = new Tick {
                Value = underlyingPrice, Time = new DateTime(2016, 02, 26)
            };

            Func <OptionFilterUniverse, OptionFilterUniverse> universeFunc = universe => universe
                                                                             .Strikes(-2, 3)
                                                                             .Expiration(TimeSpan.Zero, TimeSpan.MaxValue);

            Func <IDerivativeSecurityFilterUniverse, IDerivativeSecurityFilterUniverse> func =
                universe => universeFunc(universe as OptionFilterUniverse);

            var filter  = new FuncSecurityDerivativeFilter(func);
            var symbols = new[]
            {
                Symbol.CreateOption("SPY", Market.USA, OptionStyle.American, OptionRight.Put, 2, expiry),  // 0
                Symbol.CreateOption("SPY", Market.USA, OptionStyle.American, OptionRight.Put, 5, expiry),  // 1
                Symbol.CreateOption("SPY", Market.USA, OptionStyle.American, OptionRight.Put, 7, expiry),  // 2
                Symbol.CreateOption("SPY", Market.USA, OptionStyle.American, OptionRight.Put, 8, expiry),  // 3
                Symbol.CreateOption("SPY", Market.USA, OptionStyle.American, OptionRight.Put, 9, expiry),  // 4
                Symbol.CreateOption("SPY", Market.USA, OptionStyle.American, OptionRight.Put, 10, expiry), // 5
                Symbol.CreateOption("SPY", Market.USA, OptionStyle.American, OptionRight.Put, 11, expiry), // 6
                Symbol.CreateOption("SPY", Market.USA, OptionStyle.American, OptionRight.Put, 12, expiry), // 7
                Symbol.CreateOption("SPY", Market.USA, OptionStyle.American, OptionRight.Put, 15, expiry), // 8
                Symbol.CreateOption("SPY", Market.USA, OptionStyle.American, OptionRight.Put, 20, expiry), // 9
            };

            var filterUniverse = new OptionFilterUniverse(symbols, underlying);
            var filtered       = filter.Filter(filterUniverse).ToList();

            Assert.AreEqual(underlyingPrice == 10 ? 6 : 5, filtered.Count);
            Assert.AreEqual(symbols[3], filtered[0]);
            Assert.AreEqual(symbols[4], filtered[1]);
            Assert.AreEqual(symbols[5], filtered[2]);
            Assert.AreEqual(symbols[6], filtered[3]);
            Assert.AreEqual(symbols[7], filtered[4]);
            if (underlyingPrice == 10)
            {
                Assert.AreEqual(symbols[8], filtered[5]);
            }
            Assert.AreEqual(true, filterUniverse.IsDynamic);
        }
コード例 #10
0
        public void FiltersStrikeRangeWhenEmpty()
        {
            var underlying = new Tick {
                Value = 7.5m, Time = new DateTime(2016, 02, 26)
            };

            Func <OptionFilterUniverse, OptionFilterUniverse> universeFunc = universe => universe
                                                                             .Strikes(-2, 2)
                                                                             .Expiration(TimeSpan.Zero, TimeSpan.MaxValue);

            Func <IDerivativeSecurityFilterUniverse, IDerivativeSecurityFilterUniverse> func =
                universe => universeFunc(universe as OptionFilterUniverse);

            var filter  = new FuncSecurityDerivativeFilter(func);
            var symbols = new Symbol[] { };

            var filterUniverse = new OptionFilterUniverse(symbols, underlying);
            var filtered       = filter.Filter(filterUniverse).ToList();

            Assert.AreEqual(0, filtered.Count);
            Assert.AreEqual(true, filterUniverse.IsDynamic);
        }
コード例 #11
0
        public void LinqExpressionsImmediatelyMakeUniverseDynamic()
        {
            var expiry1 = new DateTime(2016, 12, 02);
            var expiry2 = new DateTime(2016, 12, 09);
            var expiry3 = new DateTime(2016, 12, 16); // standard
            var expiry4 = new DateTime(2016, 12, 23);

            var underlying = new Tick {
                Value = 10m, Time = new DateTime(2016, 02, 26)
            };

            Func <OptionFilterUniverse, OptionFilterUniverse> universeFunc = universe => from x in universe
                                                                             where x.ID.Date > new DateTime(2016, 12, 15)
                                                                             select x;

            Func <IDerivativeSecurityFilterUniverse, IDerivativeSecurityFilterUniverse> func =
                universe => universeFunc(universe as OptionFilterUniverse);

            var filter  = new FuncSecurityDerivativeFilter(func);
            var symbols = new[]
            {
                Symbol.CreateOption("SPY", Market.USA, OptionStyle.American, OptionRight.Put, 2, expiry1),  // 0
                Symbol.CreateOption("SPY", Market.USA, OptionStyle.American, OptionRight.Put, 5, expiry1),  // 1
                Symbol.CreateOption("SPY", Market.USA, OptionStyle.American, OptionRight.Put, 7, expiry1),  // 2
                Symbol.CreateOption("SPY", Market.USA, OptionStyle.American, OptionRight.Put, 8, expiry1),  // 3
                Symbol.CreateOption("SPY", Market.USA, OptionStyle.American, OptionRight.Put, 9, expiry2),  // 4
                Symbol.CreateOption("SPY", Market.USA, OptionStyle.American, OptionRight.Put, 10, expiry2), // 5
                Symbol.CreateOption("SPY", Market.USA, OptionStyle.American, OptionRight.Put, 11, expiry2), // 6
                Symbol.CreateOption("SPY", Market.USA, OptionStyle.American, OptionRight.Put, 12, expiry3), // 7
                Symbol.CreateOption("SPY", Market.USA, OptionStyle.American, OptionRight.Put, 15, expiry4), // 8
                Symbol.CreateOption("SPY", Market.USA, OptionStyle.American, OptionRight.Put, 20, expiry4), // 9
            };

            var u        = new OptionFilterUniverse(symbols, underlying);
            var filtered = filter.Filter(u).ToList();

            Assert.AreEqual(3, filtered.Count);
            Assert.AreEqual(true, u.IsDynamic);
        }
コード例 #12
0
        public void FiltersExpiryRange()
        {
            var time       = new DateTime(2016, 02, 26);
            var underlying = new Tick {
                Value = 10m, Time = time
            };

            Func <OptionFilterUniverse, OptionFilterUniverse> universeFunc = universe => universe
                                                                             .Strikes(-10, 10)
                                                                             .Expiration(TimeSpan.FromDays(3), TimeSpan.FromDays(7));

            Func <IDerivativeSecurityFilterUniverse, IDerivativeSecurityFilterUniverse> func =
                universe => universeFunc(universe as OptionFilterUniverse);

            var filter  = new FuncSecurityDerivativeFilter(func);
            var symbols = new[]
            {
                Symbol.CreateOption("SPY", Market.USA, OptionStyle.American, OptionRight.Put, 10, time.AddDays(0)), // 0
                Symbol.CreateOption("SPY", Market.USA, OptionStyle.American, OptionRight.Put, 10, time.AddDays(1)), // 1
                Symbol.CreateOption("SPY", Market.USA, OptionStyle.American, OptionRight.Put, 10, time.AddDays(2)), // 2
                Symbol.CreateOption("SPY", Market.USA, OptionStyle.American, OptionRight.Put, 10, time.AddDays(3)), // 3
                Symbol.CreateOption("SPY", Market.USA, OptionStyle.American, OptionRight.Put, 10, time.AddDays(4)), // 4
                Symbol.CreateOption("SPY", Market.USA, OptionStyle.American, OptionRight.Put, 10, time.AddDays(5)), // 5
                Symbol.CreateOption("SPY", Market.USA, OptionStyle.American, OptionRight.Put, 10, time.AddDays(6)), // 6
                Symbol.CreateOption("SPY", Market.USA, OptionStyle.American, OptionRight.Put, 10, time.AddDays(7)), // 7
                Symbol.CreateOption("SPY", Market.USA, OptionStyle.American, OptionRight.Put, 10, time.AddDays(8)), // 8
                Symbol.CreateOption("SPY", Market.USA, OptionStyle.American, OptionRight.Put, 10, time.AddDays(9)), // 9
            };
            var filterUniverse = new OptionFilterUniverse(symbols, underlying);
            var filtered       = filter.Filter(filterUniverse).ToList();

            Assert.AreEqual(5, filtered.Count);
            Assert.AreEqual(symbols[3], filtered[0]);
            Assert.AreEqual(symbols[4], filtered[1]);
            Assert.AreEqual(symbols[5], filtered[2]);
            Assert.AreEqual(symbols[6], filtered[3]);
            Assert.AreEqual(symbols[7], filtered[4]);
            Assert.AreEqual(true, filterUniverse.IsDynamic);
        }
コード例 #13
0
        public void FiltersBackMonth()
        {
            var expiry1 = new DateTime(2016, 12, 02);
            var expiry2 = new DateTime(2016, 12, 09);
            var expiry3 = new DateTime(2016, 12, 16); // standard
            var expiry4 = new DateTime(2016, 12, 23);

            var underlying = new Tick {
                Value = 10m, Time = new DateTime(2016, 02, 26)
            };

            Func <OptionFilterUniverse, OptionFilterUniverse> universeFunc = universe => universe.BackMonth();

            Func <IDerivativeSecurityFilterUniverse, IDerivativeSecurityFilterUniverse> func =
                universe => universeFunc(universe as OptionFilterUniverse);

            var filter  = new FuncSecurityDerivativeFilter(func);
            var symbols = new[]
            {
                Symbol.CreateOption("SPY", Market.USA, OptionStyle.American, OptionRight.Put, 2, expiry1),  // 0
                Symbol.CreateOption("SPY", Market.USA, OptionStyle.American, OptionRight.Put, 5, expiry1),  // 1
                Symbol.CreateOption("SPY", Market.USA, OptionStyle.American, OptionRight.Put, 7, expiry1),  // 2
                Symbol.CreateOption("SPY", Market.USA, OptionStyle.American, OptionRight.Put, 8, expiry1),  // 3
                Symbol.CreateOption("SPY", Market.USA, OptionStyle.American, OptionRight.Put, 9, expiry2),  // 4
                Symbol.CreateOption("SPY", Market.USA, OptionStyle.American, OptionRight.Put, 10, expiry2), // 5
                Symbol.CreateOption("SPY", Market.USA, OptionStyle.American, OptionRight.Put, 11, expiry2), // 6
                Symbol.CreateOption("SPY", Market.USA, OptionStyle.American, OptionRight.Put, 12, expiry3), // 7
                Symbol.CreateOption("SPY", Market.USA, OptionStyle.American, OptionRight.Put, 15, expiry4), // 8
                Symbol.CreateOption("SPY", Market.USA, OptionStyle.American, OptionRight.Put, 20, expiry4), // 9
            };

            var filterUniverse = new OptionFilterUniverse(symbols, underlying);
            var filtered       = filter.Filter(filterUniverse).ToList();

            Assert.AreEqual(3, filtered.Count);
            Assert.AreEqual(false, filterUniverse.IsDynamic);
        }
コード例 #14
0
 /// <summary>
 /// Defines the option chain universe filter
 /// </summary>
 protected virtual OptionFilterUniverse Filter(OptionFilterUniverse filter)
 {
     // NOP
     return(filter);
 }
コード例 #15
0
ファイル: QuantBook.cs プロジェクト: 1jeremy/Lean
        /// <summary>
        /// Gets <see cref="OptionHistory"/> object for a given symbol, date and resolution
        /// </summary>
        /// <param name="symbol">The symbol to retrieve historical option data for</param>
        /// <param name="start">The history request start time</param>
        /// <param name="end">The history request end time. Defaults to 1 day if null</param>
        /// <param name="resolution">The resolution to request</param>
        /// <returns>A <see cref="OptionHistory"/> object that contains historical option data.</returns>
        public OptionHistory GetOptionHistory(Symbol symbol, DateTime start, DateTime?end = null, Resolution?resolution = null)
        {
            if (!end.HasValue || end.Value == start)
            {
                end = start.AddDays(1);
            }

            // Load a canonical option Symbol if the user provides us with an underlying Symbol
            if (!symbol.SecurityType.IsOption())
            {
                var option = AddOption(symbol, resolution, symbol.ID.Market);

                // Allow 20 strikes from the money for futures. No expiry filter is applied
                // so that any future contract provided will have data returned.
                if (symbol.SecurityType == SecurityType.Future && symbol.IsCanonical())
                {
                    throw new ArgumentException("The Future Symbol provided is a canonical Symbol (i.e. a Symbol representing all Futures), which is not supported at this time. " +
                                                "If you are using the Symbol accessible from `AddFuture(...)`, use the Symbol from `AddFutureContract(...)` instead. " +
                                                "You can use `qb.FutureOptionChainProvider(canonicalFuture, datetime)` to get a list of futures contracts for a given date, and add them to your algorithm with `AddFutureContract(symbol, Resolution)`.");
                }
                if (symbol.SecurityType == SecurityType.Future && !symbol.IsCanonical())
                {
                    option.SetFilter(universe => universe.Strikes(-10, +10));
                }

                symbol = option.Symbol;
            }

            IEnumerable <Symbol> symbols;

            if (symbol.IsCanonical())
            {
                // canonical symbol, lets find the contracts
                var option = Securities[symbol] as Option;
                var resolutionToUseForUnderlying = resolution ?? SubscriptionManager.SubscriptionDataConfigService
                                                   .GetSubscriptionDataConfigs(symbol)
                                                   .GetHighestResolution();
                if (!Securities.ContainsKey(symbol.Underlying))
                {
                    if (symbol.Underlying.SecurityType == SecurityType.Equity)
                    {
                        // only add underlying if not present
                        AddEquity(symbol.Underlying.Value, resolutionToUseForUnderlying);
                    }
                    if (symbol.Underlying.SecurityType == SecurityType.Future && symbol.Underlying.IsCanonical())
                    {
                        AddFuture(symbol.Underlying.ID.Symbol, resolutionToUseForUnderlying);
                    }
                    else if (symbol.Underlying.SecurityType == SecurityType.Future)
                    {
                        AddFutureContract(symbol.Underlying, resolutionToUseForUnderlying);
                    }
                }
                var allSymbols = new List <Symbol>();
                for (var date = start; date < end; date = date.AddDays(1))
                {
                    if (option.Exchange.DateIsOpen(date))
                    {
                        allSymbols.AddRange(OptionChainProvider.GetOptionContractList(symbol.Underlying, date));
                    }
                }

                var optionFilterUniverse = new OptionFilterUniverse();
                var distinctSymbols      = allSymbols.Distinct();
                symbols = base.History(symbol.Underlying, start, end.Value, resolution)
                          .SelectMany(x =>
                {
                    // the option chain symbols wont change so we can set 'exchangeDateChange' to false always
                    optionFilterUniverse.Refresh(distinctSymbols, x, exchangeDateChange: false);
                    return(option.ContractFilter.Filter(optionFilterUniverse));
                })
                          .Distinct().Concat(new[] { symbol.Underlying });
            }
            else
            {
                // the symbol is a contract
                symbols = new List <Symbol> {
                    symbol
                };
            }

            return(new OptionHistory(History(symbols, start, end.Value, resolution)));
        }
コード例 #16
0
 public OptionFilterUniverse UniverseFunc(OptionFilterUniverse universe)
 {
     return(universe.IncludeWeeklys().Strikes(-this._no_K, this._no_K).Expiration(Util.timedelta(1), Util.timedelta(this.MAX_EXPIRY)));
 }
コード例 #17
0
 protected override OptionFilterUniverse Filter(OptionFilterUniverse filter)
 {
     return(filter.BackMonth().Contracts(filter.Take(15)));
 }