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); }
/// <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))); }
/// <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()); }
/// <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(); }
/// <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()); }
/// <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(); }
/// <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()); }
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(); }
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); }
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); }
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); }
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); }
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); }
/// <summary> /// Defines the option chain universe filter /// </summary> protected virtual OptionFilterUniverse Filter(OptionFilterUniverse filter) { // NOP return(filter); }
/// <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))); }
public OptionFilterUniverse UniverseFunc(OptionFilterUniverse universe) { return(universe.IncludeWeeklys().Strikes(-this._no_K, this._no_K).Expiration(Util.timedelta(1), Util.timedelta(this.MAX_EXPIRY))); }
protected override OptionFilterUniverse Filter(OptionFilterUniverse filter) { return(filter.BackMonth().Contracts(filter.Take(15))); }