Skip to content

Feature Request: Erweiterung der Risikokennzahlen um Beta und Alpha #5002

@DiaryDE

Description

@DiaryDE

Inhalt (Deutsch + Englisch)

Deutsch
Im Widget „Risikokennzahlen“ werden bisher angezeigt:

  • Maximaler Drawdown

  • Aktueller Drawdown

  • Maximale Drawdown Duration

  • Volatilität

  • Semivolatilität

  • Sharpe Ratio

Ich möchte vorschlagen, die klassischen Kennzahlen Beta und Alpha zu ergänzen.

Fachliche Begründung:

Beta misst die Sensitivität des Portfolios im Vergleich zu einem Benchmark (z. B. MSCI World).

Beta > 1: Portfolio schwankt stärker als der Markt

Beta < 1: Portfolio schwankt schwächer als der Markt

Alpha zeigt die Über- oder Unterperformance gegenüber der Benchmark.

Formeln:

Beta = Cov(R_p, R_m) / Var(R_m)
Alpha (vereinfachte) = avg(R_p) - Beta * avg(R_m)
Alpha (CAPM) = (avg(R_p) - rf) - Beta * (avg(R_m) - rf)

Technische Skizze:
Analog zu Risk.Volatility könnten neue Klassen Risk.Beta und Risk.Alpha implementiert werden, die zwei Rendite-Zeitreihen (Portfolio und Benchmark) verarbeiten und einen Wert zurückgeben.

Beispiel (vereinfacht):

public static class Beta {
private final double beta;

public Beta(double[] returnsP, double[] returnsM) {
    if (returnsP.length != returnsM.length)
        throw new IllegalArgumentException("Time series must have same length");

    int n = returnsP.length;
    if (n < 2) {
        this.beta = 0.0;
        return;
    }

    double avgP = 0.0;
    double avgM = 0.0;
    for (int i = 0; i < n; i++) {
        avgP += returnsP[i];
        avgM += returnsM[i];
    }
    avgP /= n;
    avgM /= n;

    double covSum = 0.0;
    double varMSum = 0.0;
    for (int i = 0; i < n; i++) {
        double dP = returnsP[i] - avgP;
        double dM = returnsM[i] - avgM;
        covSum += dP * dM;
        varMSum += dM * dM;
    }

    double cov = covSum / (n - 1);
    double varM = varMSum / (n - 1);

    this.beta = (varM == 0.0) ? 0.0 : cov / varM;
}

public double getBeta() {
    return beta;
}

}

public static class Alpha {
private final double alpha;

// rf can be null -> use simple alpha (no risk-free adjustment)
public Alpha(double[] returnsP, double[] returnsM, Double rf) {
    // compute averages
    int n = returnsP.length;
    double avgP = 0.0, avgM = 0.0;
    for (int i = 0; i < n; i++) { avgP += returnsP[i]; avgM += returnsM[i]; }
    avgP /= n; avgM /= n;

    Beta b = new Beta(returnsP, returnsM);
    double beta = b.getBeta();

    if (rf == null) {
        this.alpha = avgP - beta * avgM;
    } else {
        this.alpha = (avgP - rf) - beta * (avgM - rf);
    }
}

public double getAlpha() {
    return alpha;
}

}

UI-Vorschlag:
Im bestehenden „Risikokennzahlen“-Widget zwei zusätzliche Widgets:

Beta

Alpha (%)

Der Benchmark ist bereits in PP auswählbar (Wertpapier/Index), Zeitraum ergibt sich aus den Dashboard-Filtern.

English (short summary for international users)

In the “Risk Metrics” widget, please consider adding the classic measures Beta and Alpha in addition to the existing ones (Drawdown, Volatility, Sharpe Ratio, etc.).

Beta: sensitivity of the portfolio vs. a selected benchmark

Alpha: out- or underperformance compared to the benchmark

Formulas:

Beta = Cov(R_p, R_m) / Var(R_m)
Alpha (vereinfachte) = avg(R_p) - Beta * avg(R_m)
Alpha (CAPM) = (avg(R_p) - rf) - Beta * (avg(R_m) - rf)

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions