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);
}
Example #3
0
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;
}