Esempio n. 1
0
        protected internal override QuantileResult expectedShortfall(double level, DoubleArray sample)
        {
            ArgChecker.isTrue(level > 0, "Quantile should be above 0.");
            ArgChecker.isTrue(level < 1, "Quantile should be below 1.");
            int sampleSize = sampleCorrection(sample.size());

            double[] order = createIndexArray(sample.size());
            double[] s     = sample.toArray();
            DoubleArrayMath.sortPairs(s, order);
            double fractionalIndex = level * sampleSize;
            int    index           = (int)checkIndex(this.index(fractionalIndex), sample.size(), true);

            int[]    indices  = new int[index];
            double[] weights  = new double[index];
            double   interval = 1d / (double)sampleSize;
            double   losses   = s[0] * interval *indexShift();

            for (int i = 0; i < index - 1; i++)
            {
                losses    += s[i] * interval;
                indices[i] = (int)order[i];
                weights[i] = interval;
            }
            losses            += s[index - 1] * (fractionalIndex - index + 1 - indexShift()) * interval;
            indices[index - 1] = (int)order[index - 1];
            weights[0]        += interval * indexShift();
            weights[index - 1] = (fractionalIndex - index + 1 - indexShift()) * interval;
            return(QuantileResult.of(losses / level, indices, DoubleArray.ofUnsafe(weights).dividedBy(level)));
        }
        private void check_quantile(double level)
        {
            double[] w         = METHOD.weights(DATA_123.size());
            double   qComputed = METHOD.quantileFromUnsorted(level, DATA_123);
            double   WI1       = 0.0d;
            int      nbW       = 0;

            for (int i = 0; i < DATA_123.size(); i++)
            {
                if (DATA_123.get(i) > qComputed)
                {
                    WI1 += w[i];
                    nbW++;
                }
            }
            assertTrue(WI1 < 1.0d - level, "Weight of tail lower than level");
            double[] w2   = w.Clone();
            double[] data = DATA_123.toArray();
            DoubleArrayMath.sortPairs(data, w2);
            double WI = WI1 + w2[w.Length - 1 - nbW];

            assertTrue(WI > 1.0d - level, "Weight of tail+1 larger than level");
            double alpha     = (WI - (1 - level)) / (WI - WI1);
            double qExpected = (1 - alpha) * data[w.Length - 1 - nbW] + alpha * data[w.Length - 1 - nbW + 1];

            assertEquals(qComputed, qExpected, TOLERANCE_WEIGHT, "Quantile.");
        }
Esempio n. 3
0
        protected internal override QuantileResult quantile(double level, DoubleArray sample, bool isExtrapolated)
        {
            ArgChecker.isTrue(level > 0, "Quantile should be above 0.");
            ArgChecker.isTrue(level < 1, "Quantile should be below 1.");
            int sampleSize = sampleCorrection(sample.size());

            double[] order = createIndexArray(sample.size());
            double[] s     = sample.toArray();
            DoubleArrayMath.sortPairs(s, order);
            int index = (int)checkIndex(this.index(level * sampleSize), sample.size(), isExtrapolated);

            int[] ind = new int[1];
            ind[0] = (int)order[index - 1];
            return(QuantileResult.of(s[index - 1], ind, DoubleArray.of(1)));
        }