std::complex<double> UnivariateDistribution<T>::CFImpl(double t) const { T leftBound = this->MinValue(), rightBound = this->MaxValue(); if (leftBound == rightBound) return std::complex<double>(std::cos(t * leftBound), std::sin(t * leftBound)); double re = ExpectedValue([this, t] (double x) { return std::cos(t * x); }, leftBound, rightBound); double im = ExpectedValue([this, t] (double x) { return std::sin(t * x); }, leftBound, rightBound); return std::complex<double>(re, im); }
double UnivariateDistribution<T>::Skewness() const { double var = Variance(); if (!std::isfinite(var)) return NAN; double mu = Mean(); /// var is finite, so is mu double sum = ExpectedValue([this, mu] (double x) { double xmmu = x - mu; double skewness = xmmu * xmmu * xmmu; return skewness; }, this->MinValue(), this->MaxValue()); return sum / std::pow(var, 1.5); }
double Black76 :: Value( char put_call, double forward, double strike, double vol, double t, double r) { double value = 0.0; if (t <= 0 || vol <= 0) { value = IntrinsicValue(put_call, forward, strike); } else { value = exp(-(r * t)) * ExpectedValue(put_call, forward, strike, vol, t); } return value; }
double UnivariateDistribution<T>::ExcessKurtosis() const { double var = Variance(); if (!std::isfinite(var)) return NAN; double mu = Mean(); /// var is finite, so is mu double sum = ExpectedValue([this, mu] (double x) { double xmmu = x - mu; double kurtosisSqrt = xmmu * xmmu; double kurtosis = kurtosisSqrt * kurtosisSqrt; return kurtosis; }, this->MinValue(), this->MaxValue()); return sum / (var * var) - 3; }