public SuggestedStrategyLeg(LegType legType, BuyOrSell buyOrSell, int qty, double?strike = null, DateAndNumberOfDaysUntil expirationDate = null)
 {
     LegType        = legType;
     BuyOrSell      = buyOrSell;
     StrikePrice    = strike;
     ExpirationDate = expirationDate;
     Quantity       = qty;
 }
Esempio n. 2
0
        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();
        }
Esempio n. 3
0
        /// <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;
        }
Esempio n. 4
0
        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);
        }
Esempio n. 5
0
        public IList <double> GetStrikePrices(DateAndNumberOfDaysUntil date)
        {
            List <double> result = _strikePricesMap[date];

            return(result.AsReadOnly());
        }
 public PortfolioOption()
 {
     Expiry = new DateAndNumberOfDaysUntil();
 }