/usr/include/ql/math/statistics/incrementalstatistics.hpp is in libquantlib0-dev 1.4-2.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 | /* -*- mode: c++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
/*
Copyright (C) 2003 Ferdinando Ametrano
Copyright (C) 2000, 2001, 2002, 2003 RiskMap srl
This file is part of QuantLib, a free-software/open-source library
for financial quantitative analysts and developers - http://quantlib.org/
QuantLib is free software: you can redistribute it and/or modify it
under the terms of the QuantLib license. You should have received a
copy of the license along with this program; if not, please email
<quantlib-dev@lists.sf.net>. The license is also available online at
<http://quantlib.org/license.shtml>.
This program is distributed in the hope that it will be useful, but WITHOUT
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
FOR A PARTICULAR PURPOSE. See the license for more details.
*/
/*! \file incrementalstatistics.hpp
\brief statistics tool based on incremental accumulation
*/
#ifndef quantlib_incremental_statistics_hpp
#define quantlib_incremental_statistics_hpp
#include <ql/utilities/null.hpp>
#include <ql/errors.hpp>
namespace QuantLib {
//! Statistics tool based on incremental accumulation
/*! It can accumulate a set of data and return statistics (e.g: mean,
variance, skewness, kurtosis, error estimation, etc.)
\warning high moments are numerically unstable for high
average/standardDeviation ratios.
*/
class IncrementalStatistics {
public:
typedef Real value_type;
IncrementalStatistics();
//! \name Inspectors
//@{
//! number of samples collected
Size samples() const;
//! sum of data weights
Real weightSum() const;
/*! returns the mean, defined as
\f[ \langle x \rangle = \frac{\sum w_i x_i}{\sum w_i}. \f]
*/
Real mean() const;
/*! returns the variance, defined as
\f[ \frac{N}{N-1} \left\langle \left(
x-\langle x \rangle \right)^2 \right\rangle. \f]
*/
Real variance() const;
/*! returns the standard deviation \f$ \sigma \f$, defined as the
square root of the variance.
*/
Real standardDeviation() const;
/*! returns the error estimate \f$ \epsilon \f$, defined as the
square root of the ratio of the variance to the number of
samples.
*/
Real errorEstimate() const;
/*! returns the skewness, defined as
\f[ \frac{N^2}{(N-1)(N-2)} \frac{\left\langle \left(
x-\langle x \rangle \right)^3 \right\rangle}{\sigma^3}. \f]
The above evaluates to 0 for a Gaussian distribution.
*/
Real skewness() const;
/*! returns the excess kurtosis, defined as
\f[ \frac{N^2(N+1)}{(N-1)(N-2)(N-3)}
\frac{\left\langle \left(x-\langle x \rangle \right)^4
\right\rangle}{\sigma^4} - \frac{3(N-1)^2}{(N-2)(N-3)}. \f]
The above evaluates to 0 for a Gaussian distribution.
*/
Real kurtosis() const;
/*! returns the minimum sample value */
Real min() const;
/*! returns the maximum sample value */
Real max() const;
/*! returns the downside variance, defined as
\f[ \frac{N}{N-1} \times \frac{ \sum_{i=1}^{N}
\theta \times x_i^{2}}{ \sum_{i=1}^{N} w_i} \f],
where \f$ \theta \f$ = 0 if x > 0 and
\f$ \theta \f$ =1 if x <0
*/
Real downsideVariance() const;
/*! returns the downside deviation, defined as the
square root of the downside variance.
*/
Real downsideDeviation() const;
//@}
//! \name Modifiers
//@{
//! adds a datum to the set, possibly with a weight
/*! \pre weight must be positive or null */
void add(Real value, Real weight = 1.0);
//! adds a sequence of data to the set, with default weight
template <class DataIterator>
void addSequence(DataIterator begin, DataIterator end) {
for (;begin!=end;++begin)
add(*begin);
}
//! adds a sequence of data to the set, each with its weight
/*! \pre weights must be positive or null */
template <class DataIterator, class WeightIterator>
void addSequence(DataIterator begin, DataIterator end,
WeightIterator wbegin) {
for (;begin!=end;++begin,++wbegin)
add(*begin, *wbegin);
}
//! resets the data to a null set
void reset();
//@}
protected:
Size sampleNumber_, downsideSampleNumber_;
Real sampleWeight_, downsideSampleWeight_;
Real sum_, quadraticSum_, downsideQuadraticSum_,
cubicSum_, fourthPowerSum_;
Real min_, max_;
};
}
#endif
|