'Beta-Funktion Function beta(a As Double, b As Double) As Double Dim x As Double Dim betaV As Double x = a / (a + b) betaV = Application.WorksheetFunction.Beta_Dist(x, a, b, False) beta = x ^ (a - 1) * (1 - x) ^ (b - 1) / betaV End Function 'BetaBinomialverteilung Function BetaBinomial(k As Long, N As Long, PD As Double, Corr As Double, kumuliert As Boolean) Dim a As Double Dim b As Double BetaBinomial = 0 'Initialisierung a = PD * (1 - Corr) / Corr b = (1 - PD) * (1 - Corr) / Corr If kumuliert Then For i = 0 To k BetaBinomial = BetaBinomial + Application.WorksheetFunction.Combin(N, i) * beta(a + i, b + N - i) / beta(a, b) Next i Else BetaBinomial = Application.WorksheetFunction.Combin(N, k) * beta(a + k, b + N - k) / beta(a, b) End If End Function 'Verbesserte kumulierte Standardnormalverteilung Function Cumnorm(x As Double) As Double XAbs = Abs(x) If XAbs > 37 Then Cumnorm = 0 Else Exponential = Exp(-XAbs ^ 2 / 2) If XAbs < 7.07106781186547 Then Build = 3.52624965998911E-02 * XAbs + 0.700383064443688 Build = Build * XAbs + 6.37396220353165 Build = Build * XAbs + 33.912866078383 Build = Build * XAbs + 112.079291497871 Build = Build * XAbs + 221.213596169931 Build = Build * XAbs + 220.206867912376 Cumnorm = Exponential * Build Build = 8.83883476483184E-02 * XAbs + 1.75566716318264 Build = Build * XAbs + 16.064177579207 Build = Build * XAbs + 86.7807322029461 Build = Build * XAbs + 296.564248779674 Build = Build * XAbs + 637.333633378831 Build = Build * XAbs + 793.826512519948 Build = Build * XAbs + 440.413735824752 Cumnorm = Cumnorm / Build Else Build = XAbs + 0.65 Build = XAbs + 4 / Build Build = XAbs + 3 / Build Build = XAbs + 2 / Build Build = XAbs + 1 / Build Cumnorm = Exponential / Build / 2.506628274631 End If End If If x > 0 Then Cumnorm = 1 - Cumnorm End Function 'Bivariate Normalverteilung Function Bivarcumnorm(a As Double, b As Double, r As Double) As Double Dim i As Integer Dim x As Variant, W As Variant Dim h1 As Double, h2 As Double Dim LH As Double, h12 As Double Dim h3 As Double, h5 As Double, h6 As Double, h7 As Double, h8 As Double Dim r1 As Double, r2 As Double, r3 As Double, rr As Double Dim AA As Double, ab As Double x = Array(0.04691008, 0.23076534, 0.5, 0.76923466, 0.95308992) W = Array(0.018854042, 0.038088059, 0.0452707394, 0.038088059, 0.018854042) h1 = a h2 = b h12 = (h1 * h1 + h2 * h2) / 2 If Abs(r) >= 0.7 Then r2 = 1 - r * r r3 = Sqr(r2) If r < 0 Then h2 = -h2 h3 = h1 * h2 h7 = Exp(-h3 / 2) If Abs(r) < 1 Then h6 = Abs(h1 - h2) h5 = h6 * h6 / 2 h6 = h6 / r3 AA = 0.5 - h3 / 8 ab = 3 - 2 * AA * h5 LH = 0.13298076 * h6 * ab * (1 - Cumnorm(h6)) - Exp(-h5 / r2) * (ab + AA * r2) * 0.053051647 For i = 0 To 4 r1 = r3 * x(i) rr = r1 * r1 r2 = Sqr(1 - rr) If h7 = 0 Then h8 = 0 Else h8 = Exp(-h3 / (1 + r2)) / r2 / h7 End If LH = LH - W(i) * Exp(-h5 / rr) * (h8 - 1 - AA * rr) Next i End If Bivarcumnorm = LH * r3 * h7 + Cumnorm(WorksheetFunction.Min(h1, h2)) If r < 0 Then Bivarcumnorm = Cumnorm(h1) - Bivarcumnorm End If Else h3 = h1 * h2 If r <> 0 Then For i = 0 To 4 r1 = r * x(i) r2 = 1 - r1 * r1 LH = LH + W(i) * Exp((r1 * h3 - h12) / r2) / Sqr(r2) Next i End If Bivarcumnorm = Cumnorm(h1) * Cumnorm(h2) + r * LH End If End Function 'Default-Korrelation aus Asset-Korrelation berechnen Function DCorr(p As Double, korr As Double) As Double Dim a As Double Dim b As Double a = Application.WorksheetFunction.Norm_S_Inv(p) b = Bivarcumnorm(a, a, korr) DCorr = (b - p ^ 2) / (p * (1 - p)) End Function