public SuggestedStrategyLeg(LegType legType, BuyOrSell buyOrSell, int qty, double?strike = null, DateAndNumberOfDaysUntil expirationDate = null) { LegType = legType; BuyOrSell = buyOrSell; StrikePrice = strike; ExpirationDate = expirationDate; Quantity = qty; }
public OptionChain(IEnumerable <OptionPair> chains, double underlyingCurrentPrice, double riskFreeRate) { RiskFreeRate = riskFreeRate; UnderlyingCurrentPrice = underlyingCurrentPrice; _chainsInternal = chains.Where(chain => chain.PutOption != null && chain.CallOption != null) .OrderBy(x => x.Expiry) .ThenBy(x => x.StrikePrice) .ThenBy(x => x.PremiumMultiplier) .ToList(); DateAndNumberOfDaysUntil prevExpiry = null; foreach (OptionPair c in _chainsInternal) { _optionNumberToOption[c.PutOption.OptionNumber] = c.PutOption; _optionNumberToOption[c.CallOption.OptionNumber] = c.CallOption; // Update _strikePrices if (!_strikePrices.Contains(c.StrikePrice)) { _strikePrices.Add(c.StrikePrice); // this list is already sorted. //List<Double> strikesListForCurrentExpiry; //if (!_strikePricesMap.TryGetValue(c.Expiry, out strikesListForCurrentExpiry)) //{ // _strikePricesMap[c.Expiry] = strikesListForCurrentExpiry = new List<double>(); //} //strikesListForCurrentExpiry.Add(c.StrikePrice); } // Update _strikePricesMap List <Double> strikesListForCurrentExpiry; if (!_strikePricesMap.TryGetValue(c.Expiry, out strikesListForCurrentExpiry)) { _strikePricesMap[c.Expiry] = strikesListForCurrentExpiry = new List <double>(); strikesListForCurrentExpiry.Add(c.StrikePrice); } else { strikesListForCurrentExpiry = _strikePricesMap[c.Expiry]; strikesListForCurrentExpiry.Add(c.StrikePrice); } // Update _expiryDates if (c.Expiry != prevExpiry) { _expiryDates.Add(c.Expiry); prevExpiry = c.Expiry; } } _strikePrices.Sort(); }
/// <summary> /// Get expire dates with days to expire closest to daysInFuture /// </summary> public void GetClosestExpiryDatesToDaysInFeature(double daysInFuture, out DateAndNumberOfDaysUntil low, out DateAndNumberOfDaysUntil highOrEqual) { Tuple <int, DateAndNumberOfDaysUntil> lastSmaler = ExpirationDates.LastAndIndex(e => e.TotalNumberOfDaysUntilExpiry < daysInFuture); Tuple <int, DateAndNumberOfDaysUntil> firstBigger = ExpirationDates.FirstAndIndex(e => e.TotalNumberOfDaysUntilExpiry >= daysInFuture); low = lastSmaler.Item1 == -1 ? ExpirationDates[0] : lastSmaler.Item2; highOrEqual = firstBigger.Item1 == -1 ? ExpirationDates[ExpirationDates.Count - 1] : firstBigger.Item2; }
private double GetVolatilityForPrediction(IReadOnlyList <OptionPair> optionPairs, double daysInFuture) { double volatility; // if there are dates with NumOfDaysUntilExpired == daysInFuture // the volatility is calculated as average impliedVolatility from options with this date DateAndNumberOfDaysUntil futureExpiry = ExpirationDates.FirstOrDefault(date => date.TotalNumberOfDaysUntilExpiry.AlmostEqual(daysInFuture)); if (futureExpiry != null) { List <OptionPair> chainsWithExpiry = optionPairs.Where(chain => chain.Expiry == futureExpiry).ToList(); volatility = GetAverageVolatilityFromAtTheMoneyOption(chainsWithExpiry); return(volatility); } DateAndNumberOfDaysUntil sigma1Date, sigma2Date; GetClosestExpiryDatesToDaysInFeature(daysInFuture, out sigma1Date, out sigma2Date); if (sigma1Date.FutureDate == sigma2Date.FutureDate) { List <OptionPair> chainsWithExpiry = optionPairs.Where(chain => chain.Expiry == sigma1Date).ToList(); volatility = GetAverageVolatilityFromAtTheMoneyOption(chainsWithExpiry); return(volatility); } List <OptionPair> optionChainsSigma1 = optionPairs.Where(chain => chain.Expiry == sigma1Date).ToList(); List <OptionPair> optionChainsSigma2 = optionPairs.Where(chain => chain.Expiry == sigma2Date).ToList(); double sigma1 = GetAverageVolatilityFromAtTheMoneyOption(optionChainsSigma1); double sigma2 = GetAverageVolatilityFromAtTheMoneyOption(optionChainsSigma2); double n1 = sigma1Date.TotalNumberOfDaysUntilExpiry; double n2 = sigma2Date.TotalNumberOfDaysUntilExpiry; volatility = Math.Sqrt(365.0 / daysInFuture * ((n1 / 365.0 * sigma1 * sigma1) * (n2 - daysInFuture) / (n2 - n1) + n2 / 365.0 * sigma2 * sigma2 * (daysInFuture - n1) / (n2 - n1))); return(volatility); }
public IList <double> GetStrikePrices(DateAndNumberOfDaysUntil date) { List <double> result = _strikePricesMap[date]; return(result.AsReadOnly()); }
public PortfolioOption() { Expiry = new DateAndNumberOfDaysUntil(); }