Esempio n. 1
0
        private double MoneyAtStroke(PriceModel model, double startPrice, double strike, OptionType type, int optSide, int periods, int volume)
        {
            var price = startPrice;

            for (var i = 0; i < periods; i++)
            {
                var delta = model.GetRandomDelta();
                var sign  = rand.Next(2) > 0 ? 1 : -1;
                price += delta * sign;
                if (type == OptionType.Touch)
                {
                    if (optSide > 0 && price >= strike)
                    {
                        return(volume);
                    }
                    if (optSide < 0 && price <= strike)
                    {
                        return(volume);
                    }
                }
            }
            if (optSide > 0 && price >= strike)
            {
                return(volume * (price - strike));
            }
            if (optSide < 0 && price <= strike)
            {
                return(volume * (strike - price));
            }
            return(0);
        }
        private double TestTotalProfit(double lastDayMultiplier)
        {
            var price = (double)VanillaPrice;

            for (var i = 0; i < timeframesTotal; i++)
            {
                price += model.GetRandomDelta();
            }
            if (lastDayMultiplier > 0)
            {
                price += lastDayMultiplier * model.GetRandomDelta();
            }
            var delta = Side == OptionSide.Call
                ? price - (double)Strike
                : (double)Strike - price;

            return(delta > 0 ? delta : 0);
        }
Esempio n. 3
0
        public void TestDeltaGeneration()
        {
            var candles = new List <CandleData>();

            for (var i = 0; i < 10000; i++)
            {
                var delta = Gaussian.BoxMuller(0, 1);
                candles.Add(new CandleData(100, 100,
                                           99, 100 + (float)delta, new DateTime(), new DateTime()));
            }
            // небольшой процент больших смещений
            for (var i = 0; i < 10; i++)
            {
                var delta = 5 * (i % 2 == 0 ? 1 : -1);
                candles.Add(new CandleData(100, 100,
                                           99, 100 + 1f * (float)delta, new DateTime(), new DateTime()));
            }
            var listOc = candles.Select(c => (double)(c.close - c.open)).OrderBy(c => c).ToList();
            var model  = new PriceModel(listOc);

            const int checksCount = 5000;
            var       deltas      = new double[checksCount];

            for (var i = 0; i < checksCount; i++)
            {
                deltas[i] = model.GetRandomDelta();
            }

            var meanDelta = deltas.Average();
            var maxDelta  = deltas.Max(d => Math.Abs(d));
            var vl        = deltas.Sum(d => (d - meanDelta) * (d - meanDelta));

            vl = Math.Sqrt(vl / checksCount);

            Assert.Less(Math.Abs(meanDelta), 0.3, "Mean value should be around 0");
            Assert.Less(Math.Abs(vl - 1), 0.3, "AD should be around 1");
            Assert.Greater(maxDelta, 1, "max delta should be greater than 1");
        }
 public double CalculateDelta()
 {
     return(model.GetRandomDelta());
 }