Beispiel #1
0
 public EquityOptionGreeks(EquityOption eo)
 {
     Underlying=eo.Underlying;
     OpType=eo.OpType;
     ExpDate=eo.ExpDate;
     Strike = eo.Strike;
 }
        public static IEnumerable <OptionableStock> GetOptionableStocks(IEnumerable <MarketSymbol> marketSymbols)
        {
            var options  = new List <MarketSymbol>();
            var equities = new List <MarketSymbol>();
            var indexes  = new List <MarketSymbol>();

            foreach (var marketSymbol in marketSymbols)
            {
                switch (marketSymbol.SecurityType)
                {
                case MarketSymbolSecurityType.IEOPTION when !string.IsNullOrEmpty(marketSymbol.Description):
                    options.Add(marketSymbol);
                    break;

                case MarketSymbolSecurityType.EQUITY:
                    equities.Add(marketSymbol);
                    break;

                case MarketSymbolSecurityType.INDEX:
                    indexes.Add(marketSymbol);
                    break;
                }
            }

            var equityOptionsBySymbol = options.Select(x => EquityOption.Parse(x.Symbol)).GroupBy(x => x.EquitySymbol);
            var equitiesBySymbol      = equities.Concat(indexes).ToDictionary(x => x.Symbol);

            foreach (var equityOptions in equityOptionsBySymbol)
            {
                if (equitiesBySymbol.TryGetValue(equityOptions.Key, out var equity))
                {
                    yield return(new OptionableStock(equity, equityOptions));
                }
            }
        }
        public override double GetOptionValue(EquityOption option,
                                              DateTime currentDate,
                                              GbmParameters gbmParams,
                                              double discountFactor,
                                              int numberSims)
        ///<summary>
        /// simulate the payoff of the given equity option and
        /// take the average discounted value as the option value
        ///</summary>
        {
            var simulatedValues      = new List <double>();
            var simulationLengthDays = currentDate.GetWorkingDaysTo(option.ExpiryDate) + 1;
            var dailyTimePeriod      = 1.0 / TimePeriods.BusinessDaysInYear;

            for (int i = 0; i < numberSims; i++)
            {
                var rawStockPrices     = GetGeometricBrownianSeries(gbmParams, dailyTimePeriod, simulationLengthDays);
                var rawStockTimeSeries = rawStockPrices.AsBDTimeSeries(currentDate);
                var optionPayoff       = option.GetPayoff(rawStockTimeSeries);
                simulatedValues.Add(optionPayoff);
            }

            var avgPayoff           = simulatedValues.Sum() / numberSims;
            var discountedAvgPayoff = avgPayoff * discountFactor;

            return(discountedAvgPayoff);
        }
Beispiel #4
0
        /// <summary>
        /// Runs the FinancialObjectModel demo.
        /// </summary>
        /// <param name="args">none required</param>
        static void Main(string[] args)
        {
            Console.WriteLine("FinancialObjectModel :: Demo");
            Console.WriteLine();

            if (!FinancialObjectModel.Initialize())
            {
                var tmp = Console.ForegroundColor;
                Console.ForegroundColor = ConsoleColor.Red;
                Console.WriteLine("Failed to initialize!");
                Console.ForegroundColor = tmp;

                return;
            }

            var aapl = FinancialObjectModel.GetSecurity(s => s.Ticker == "AAPL");

            var applOption = new EquityOption(OptionType.American, OptionRights.Call, new Underlying <Equity>(aapl), 100M,
                                              DateTime.Today);

            Console.WriteLine(applOption);

            for (var i = 0; i < 10; i++)
            {
                var securityPrice = FinancialObjectModel.GetSecurityPrice(DateTime.Today, "NYSE", "AAPL");

                Console.WriteLine(securityPrice.Security.Ticker + ", " + securityPrice.Price);
            }

            Console.WriteLine("Press any key to continue ...");
            Console.ReadKey();
        }
Beispiel #5
0
 public ExpiredOption(EquityOption equityOption, int securityType, string title, int exchange, DateTime lastUpdate)
 {
     EquityOption = equityOption;
     SecurityType = securityType;
     Title        = title;
     Exchange     = exchange;
     LastUpdate   = lastUpdate;
 }
Beispiel #6
0
        public void Should_Parse_EquityOptionMessage_Culture_Independant(string cultureName)
        {
            // Arrange
            TestHelper.SetThreadCulture(cultureName);
            var message = "EBAY1803H25,EBAY1803H27.5,EBAY1803H30,EBAY1803H31,EBAY1803H32,EBAY1803H33,EBAY1803H34,EBAY1803H35,EBAY1803H36,EBAY1803H37,EBAY1803H38,EBAY1803H39,EBAY1803H40,EBAY1803H41,EBAY1803H42,EBAY1803H43,EBAY1803H44,EBAY1803H45,EBAY1803H46,EBAY1803H47.5,EBAY1803H50,EBAY1810H25,EBAY1810H27.5,EBAY1810H30,EBAY1810H31,EBAY1810H32,EBAY1810H33,EBAY1810H34,EBAY1810H35,EBAY1810H36,EBAY1810H37,EBAY1810H38,EBAY1810H39,EBAY1810H40,EBAY1810H41,EBAY1810H42,EBAY1810H42.5,EBAY1810H43,EBAY1810H44,EBAY1810H45,EBAY1810H47.5,EBAY1810H50,EBAY1813G25,EBAY1813G27.5,EBAY1813G30,EBAY1813G30.5,EBAY1813G31,EBAY1813G31.5,EBAY1813G32,EBAY1813G32.5,EBAY1813G33,EBAY1813G33.5,EBAY1813G34,EBAY1813G34.5,EBAY1813G35,EBAY1813G35.5,EBAY1813G36,EBAY1813G36.5,EBAY1813G37,EBAY1813G37.5,EBAY1813G38,EBAY1813G38.5,EBAY1813G39,EBAY1813G39.5,EBAY1813G40,EBAY1813G41,EBAY1813G42,EBAY1813G43,EBAY1813G44,EBAY1813G45,EBAY1813G46,EBAY1813G47,EBAY1813G50,EBAY1817H28,EBAY1817H29,EBAY1817H30,EBAY1817H31,EBAY1817H32,EBAY1817H33,EBAY1817H34,EBAY1817H35,EBAY1817H36,EBAY1817H37,EBAY1817H38,EBAY1817H39,EBAY1817H40,EBAY1817H41,EBAY1817H42,EBAY1817H43,EBAY1817H44,EBAY1817H45,EBAY1817H46,EBAY1817H47,EBAY1817H50,EBAY1819J25,EBAY1819J26,EBAY1819J27,EBAY1819J28,EBAY1819J29,EBAY1819J30,EBAY1819J31,EBAY1819J32,EBAY1819J33,EBAY1819J34,EBAY1819J35,EBAY1819J36,EBAY1819J37,EBAY1819J38,EBAY1819J39,EBAY1819J40,EBAY1819J41,EBAY1819J42,EBAY1819J43,EBAY1819J44,EBAY1819J45,EBAY1819J46,EBAY1819J47,EBAY1819J48,EBAY1819J49,EBAY1819J50,EBAY1819J52.5,EBAY1819J55,EBAY1820G23,EBAY1820G24,EBAY1820G25,EBAY1820G26,EBAY1820G27,EBAY1820G28,EBAY1820G29,EBAY1820G30,EBAY1820G31,EBAY1820G32,EBAY1820G33,EBAY1820G33.5,EBAY1820G34,EBAY1820G34.5,EBAY1820G35,EBAY1820G35.5,EBAY1820G36,EBAY1820G36.5,EBAY1820G37,EBAY1820G37.5,EBAY1820G38,EBAY1820G38.5,EBAY1820G39,EBAY1820G39.5,EBAY1820G40,EBAY1820G40.5,EBAY1820G41,EBAY1820G41.5,EBAY1820G42,EBAY1820G42.5,EBAY1820G43,EBAY1820G43.5,EBAY1820G44,EBAY1820G44.5,EBAY1820G45,EBAY1820G46,EBAY1820G47,EBAY1820G48,EBAY1820G49,EBAY1820G50,EBAY1820G52.5,EBAY1820G55,EBAY1821I25,EBAY1821I26,EBAY1821I27,EBAY1821I28,EBAY1821I29,EBAY1821I30,EBAY1821I31,EBAY1821I32,EBAY1821I33,EBAY1821I34,EBAY1821I35,EBAY1821I36,EBAY1821I37,EBAY1821I38,EBAY1821I39,EBAY1821I40,EBAY1821I41,EBAY1821I42,EBAY1821I43,EBAY1821I44,EBAY1821I45,EBAY1821I46,EBAY1821I47,EBAY1821I48,EBAY1821I49,EBAY1821I50,EBAY1824H25,EBAY1824H27.5,EBAY1824H30,EBAY1824H31,EBAY1824H32,EBAY1824H33,EBAY1824H34,EBAY1824H35,EBAY1824H36,EBAY1824H37,EBAY1824H38,EBAY1824H39,EBAY1824H40,EBAY1824H41,EBAY1824H42,EBAY1824H43,EBAY1824H44,EBAY1824H45,EBAY1824H47.5,EBAY1824H50,EBAY1827G25,EBAY1827G27.5,EBAY1827G30,EBAY1827G31,EBAY1827G32,EBAY1827G33,EBAY1827G34,EBAY1827G35,EBAY1827G36,EBAY1827G37,EBAY1827G38,EBAY1827G39,EBAY1827G40,EBAY1827G41,EBAY1827G42,EBAY1827G43,EBAY1827G44,EBAY1827G45,EBAY1827G46,EBAY1827G47,EBAY1827G50,:,EBAY1803T25,EBAY1803T27.5,EBAY1803T30,EBAY1803T31,EBAY1803T32,EBAY1803T33,EBAY1803T34,EBAY1803T35,EBAY1803T36,EBAY1803T37,EBAY1803T38,EBAY1803T39,EBAY1803T40,EBAY1803T41,EBAY1803T42,EBAY1803T43,EBAY1803T44,EBAY1803T45,EBAY1803T46,EBAY1803T47.5,EBAY1803T50,EBAY1810T25,EBAY1810T27.5,EBAY1810T30,EBAY1810T31,EBAY1810T32,EBAY1810T33,EBAY1810T34,EBAY1810T35,EBAY1810T36,EBAY1810T37,EBAY1810T38,EBAY1810T39,EBAY1810T40,EBAY1810T41,EBAY1810T42,EBAY1810T42.5,EBAY1810T43,EBAY1810T44,EBAY1810T45,EBAY1810T47.5,EBAY1810T50,EBAY1813S25,EBAY1813S27.5,EBAY1813S30,EBAY1813S30.5,EBAY1813S31,EBAY1813S31.5,EBAY1813S32,EBAY1813S32.5,EBAY1813S33,EBAY1813S33.5,EBAY1813S34,EBAY1813S34.5,EBAY1813S35,EBAY1813S35.5,EBAY1813S36,EBAY1813S36.5,EBAY1813S37,EBAY1813S37.5,EBAY1813S38,EBAY1813S38.5,EBAY1813S39,EBAY1813S39.5,EBAY1813S40,EBAY1813S41,EBAY1813S42,EBAY1813S43,EBAY1813S44,EBAY1813S45,EBAY1813S46,EBAY1813S47,EBAY1813S50,EBAY1817T28,EBAY1817T29,EBAY1817T30,EBAY1817T31,EBAY1817T32,EBAY1817T33,EBAY1817T34,EBAY1817T35,EBAY1817T36,EBAY1817T37,EBAY1817T38,EBAY1817T39,EBAY1817T40,EBAY1817T41,EBAY1817T42,EBAY1817T43,EBAY1817T44,EBAY1817T45,EBAY1817T46,EBAY1817T47,EBAY1817T50,EBAY1819V25,EBAY1819V26,EBAY1819V27,EBAY1819V28,EBAY1819V29,EBAY1819V30,EBAY1819V31,EBAY1819V32,EBAY1819V33,EBAY1819V34,EBAY1819V35,EBAY1819V36,EBAY1819V37,EBAY1819V38,EBAY1819V39,EBAY1819V40,EBAY1819V41,EBAY1819V42,EBAY1819V43,EBAY1819V44,EBAY1819V45,EBAY1819V46,EBAY1819V47,EBAY1819V48,EBAY1819V49,EBAY1819V50,EBAY1819V52.5,EBAY1819V55,EBAY1820S23,EBAY1820S24,EBAY1820S25,EBAY1820S26,EBAY1820S27,EBAY1820S28,EBAY1820S29,EBAY1820S30,EBAY1820S31,EBAY1820S32,EBAY1820S33,EBAY1820S33.5,EBAY1820S34,EBAY1820S34.5,EBAY1820S35,EBAY1820S35.5,EBAY1820S36,EBAY1820S36.5,EBAY1820S37,EBAY1820S37.5,EBAY1820S38,EBAY1820S38.5,EBAY1820S39,EBAY1820S39.5,EBAY1820S40,EBAY1820S40.5,EBAY1820S41,EBAY1820S41.5,EBAY1820S42,EBAY1820S42.5,EBAY1820S43,EBAY1820S43.5,EBAY1820S44,EBAY1820S44.5,EBAY1820S45,EBAY1820S46,EBAY1820S47,EBAY1820S48,EBAY1820S49,EBAY1820S50,EBAY1820S52.5,EBAY1820S55,EBAY1821U25,EBAY1821U26,EBAY1821U27,EBAY1821U28,EBAY1821U29,EBAY1821U30,EBAY1821U31,EBAY1821U32,EBAY1821U33,EBAY1821U34,EBAY1821U35,EBAY1821U36,EBAY1821U37,EBAY1821U38,EBAY1821U39,EBAY1821U40,EBAY1821U41,EBAY1821U42,EBAY1821U43,EBAY1821U44,EBAY1821U45,EBAY1821U46,EBAY1821U47,EBAY1821U48,EBAY1821U49,EBAY1821U50,EBAY1824T25,EBAY1824T27.5,EBAY1824T30,EBAY1824T31,EBAY1824T32,EBAY1824T33,EBAY1824T34,EBAY1824T35,EBAY1824T36,EBAY1824T37,EBAY1824T38,EBAY1824T39,EBAY1824T40,EBAY1824T41,EBAY1824T42,EBAY1824T43,EBAY1824T44,EBAY1824T45,EBAY1824T47.5,EBAY1824T50,EBAY1827S25,EBAY1827S27.5,EBAY1827S30,EBAY1827S31,EBAY1827S32,EBAY1827S33,EBAY1827S34,EBAY1827S35,EBAY1827S36,EBAY1827S37,EBAY1827S38,EBAY1827S39,EBAY1827S40,EBAY1827S41,EBAY1827S42,EBAY1827S43,EBAY1827S44,EBAY1827S45,EBAY1827S46,EBAY1827S47,EBAY1827S50, ";

            // Act
            var equityOptionMessageParsed = EquityOptionMessage.Parse(message);
            var equityOption = new EquityOption("EBAY1803H25", "EBAY", 25.0f, new DateTime(2018, 08, 03), OptionSide.Call);

            // Assert
            Assert.AreEqual(equityOptionMessageParsed.Chains.First(), equityOption);
        }
Beispiel #7
0
        public static ExpiredOption Parse(string line)
        {
            // ZZQ1020B30,2, FEB 10 C 30,,14,20100114
            var values = line.Split(',');

            var equityOption = EquityOption.Parse(values[0]);

            int.TryParse(values[1], out var securityType);
            var title = values[2].Trim();

            // skip values[3]
            int.TryParse(values[4], out var exchange);
            DateTime.TryParseExact(values[5], LastUpdateDateTimeFormat, CultureInfo.InvariantCulture, DateTimeStyles.None, out var lastUpdate);

            return(new ExpiredOption(equityOption, securityType, title, exchange, lastUpdate));
        }
Beispiel #8
0
        public void TestEquityOptionPricing()
        {
            const string expectedName   = "International Business Machines";
            const string expectedTicker = "IBM";

            var ibm = new Underlying <Equity>(new Equity(expectedName, expectedTicker));

            var                expectedExpiration = new DateTime(2015, 01, 01);
            const decimal      expectedStrike     = 100;
            const OptionRights expectedRights     = OptionRights.Call;
            const OptionType   expectedType       = OptionType.American;

            var ibmEquityOption = new EquityOption(expectedType, expectedRights, ibm, expectedStrike, expectedExpiration);

            Assert.IsNotNull(ibmEquityOption);
        }
Beispiel #9
0
        public (Instruments.Trade trade, ProductEvent creationEvent) CreateOption(int quantity, int unitPrice,
                                                                                  string counterparty, string portfolio, string underlying, decimal strike, bool isPut, bool cashSettlement,
                                                                                  bool isAmerican, int monthsToMaturity)
        {
            var tid = _connector.GenerateUniqueIds("trade_id", 1);

            var cid = _connector.GenerateUniqueIds("contract_id", 1);

            var eid = _connector.GenerateUniqueIds("event_id", 1);


            var trade = new Instruments.Trade
            {
                ContractId    = "EQD-" + cid[0],
                Id            = tid[0],
                ValueDate     = DateTime.Today.AddDays(1),
                TradeDate     = DateTime.Today,
                Timestamp     = DateTime.Now,
                Counterparty  = counterparty,
                IsDestroyed   = false,
                Portfolio     = portfolio,
                Version       = 1,
                IsLastVersion = true
            };

            var product = new EquityOption
            {
                Exercise     = isAmerican ? EquityOption.ExerciseType.American : EquityOption.ExerciseType.European,
                Type         = isPut ? EquityOption.OptionType.Put : EquityOption.OptionType.Call,
                Settlement   = cashSettlement ? EquityOption.SettlementType.Cash : EquityOption.SettlementType.Physical,
                MaturityDate = DateTime.Today.AddMonths(monthsToMaturity),
                UnitPrice    = unitPrice,
                Quantity     = quantity,
                Underlying   = underlying,
                Strike       = strike
            };

            trade.Product = product;

            var evt = new Create(eid[0], trade.ContractId);

            return(trade, evt);
        }
Beispiel #10
0
        public void DemonstrateCreationOfEquityOption()
        {
            // CREATE an exotic instrument (that can then be upserted into LUSID)
            var equityOption = new EquityOption(
                startDate: new DateTimeOffset(2020, 2, 7, 0, 0, 0, TimeSpan.Zero),
                optionMaturityDate: new DateTimeOffset(2020, 9, 18, 0, 0, 0, TimeSpan.Zero),
                optionSettlementDate: new DateTimeOffset(2020, 9, 20, 0, 0, 0, TimeSpan.Zero),
                deliveryType: EquityOption.DeliveryTypeEnum.Physical,
                optionType: EquityOption.OptionTypeEnum.Call,
                strike: 100m,
                domCcy: "GBP",
                underlyingIdentifier: EquityOption.UnderlyingIdentifierEnum.Isin,
                code: "code",
                instrumentType: LusidInstrument.InstrumentTypeEnum.EquityOption
                );

            // ASSERT that it was created
            Assert.That(equityOption, Is.Not.Null);

            // CAN NOW UPSERT TO LUSID
            string uniqueId = "id-equityOption-1";

            UpsertOtcToLusid(equityOption, "some-name-for-this-equityOption", uniqueId);

            // CAN NOW QUERY FROM LUSID
            var retrieved = QueryOtcFromLusid(uniqueId);

            Assert.That(retrieved.InstrumentType == LusidInstrument.InstrumentTypeEnum.EquityOption);
            var roundTripEquityOption = retrieved as EquityOption;

            Assert.That(roundTripEquityOption, Is.Not.Null);
            Assert.That(roundTripEquityOption.Code, Is.EqualTo(roundTripEquityOption.Code));
            Assert.That(roundTripEquityOption.Strike, Is.EqualTo(roundTripEquityOption.Strike));
            Assert.That(roundTripEquityOption.DeliveryType, Is.EqualTo(roundTripEquityOption.DeliveryType));
            Assert.That(roundTripEquityOption.DomCcy, Is.EqualTo(roundTripEquityOption.DomCcy));
            Assert.That(roundTripEquityOption.OptionType, Is.EqualTo(roundTripEquityOption.OptionType));
            Assert.That(roundTripEquityOption.StartDate, Is.EqualTo(roundTripEquityOption.StartDate));
            Assert.That(roundTripEquityOption.OptionMaturityDate, Is.EqualTo(roundTripEquityOption.OptionMaturityDate));
            Assert.That(roundTripEquityOption.OptionSettlementDate, Is.EqualTo(roundTripEquityOption.OptionSettlementDate));
            Assert.That(roundTripEquityOption.UnderlyingIdentifier, Is.EqualTo(roundTripEquityOption.UnderlyingIdentifier));
        }
Beispiel #11
0
        private void SetViewModel()
        {
            EquityOption option = OptionDefinition.GetOption();

            (OptionPricingData pricingData, bool fixedData) = MarketDataDefinition.GetMarketData();

            var strategies = new List <HedgingStrategy>()
            {
                new HedgingStrategy(new DeltaHedgedPortfolio(option, 1), "Delta hedging"),
                new HedgingStrategy(new StopLossPortfolio(option, 1), "Stop-loss hedging")
            };

            if (fixedData)
            {
                ViewModel.PlotDailyPnL(new DateTime(2020, 1, 1), pricingData, strategies, Seed);
            }
            else
            {
                ViewModel.PlotDailyPnL(new DateTime(2020, 1, 1), pricingData, strategies);
            }
        }
Beispiel #12
0
        public void EquityOptionSecurityCtorTest()
        {
            const string expectedName   = "International Business Machines";
            const string expectedTicker = "IBM";

            // create the underlying equity
            var ibm = new Underlying <Equity>(new Equity(expectedName, expectedTicker));

            var                expectedExpiration = new DateTime(2015, 01, 01);
            const decimal      expectedStrike     = 100;
            const OptionRights expectedRights     = OptionRights.Call;
            const OptionType   expectedType       = OptionType.American;

            var ibmEquityOption = new EquityOption(expectedType, expectedRights, ibm, expectedStrike, expectedExpiration);

            Assert.AreEqual(expectedName, ibmEquityOption.Underlying.Security.Name);
            Assert.AreEqual(expectedTicker, ibmEquityOption.Underlying.Security.Ticker);
            Assert.AreEqual(expectedRights, ibmEquityOption.Rights);
            Assert.AreEqual(expectedStrike, ibmEquityOption.StrikePrice);
            Assert.AreEqual(expectedType, ibmEquityOption.Type);
        }
Beispiel #13
0
 public DeltaHedgedPortfolio(EquityOption option,
                             int contracts) : base(option, contracts)
 {
 }
Beispiel #14
0
 public abstract double GetOptionValue(EquityOption option, DateTime currentDate,
                                       GbmParameters gbmParams, double interestRate,
                                       int numberSims);
 public HedgedPortfolio(EquityOption option,
                        int numberOfContracts)
 {
     Option             = option;
     _numberOfContracts = numberOfContracts;
 }
 public StopLossPortfolio(EquityOption option,
                          int numberOfContracts) : base(option, numberOfContracts)
 {
 }
        public IPriceable BuildPriceable()
        {
            IPriceable priceable = new EquityOption(this);

            return priceable;
        }
Beispiel #18
0
        public IPriceable BuildPriceable()
        {
            IPriceable priceable = new EquityOption(this);

            return(priceable);
        }