Each metric’s config property specifies how to compute, summarize, and/or plot recorded data. The formatting specifications are outlined below.

Config Specification

The general config specification is:

{
    "functions": {
        "metrics": function returning all sub_metrics,
        "summary": {
            "sub_metric1": str, list of str, or dict,
            "sub_metric2": str, list of str, or dict,
        },
    },
    "plot": {
        "metrics": {
            "sub_metric1": {
                "title": str,
                "style": str,
                "resample": str,
            },

            "sub_metric2": {
                "title": str,
                "style": str,
                "resample": str,
            },

        "summary":
            "sub_metric1": {
                "title": str,
                "style": str,
            },

            "sub_metric2": {
                "title": str,
                "style": str,
            },
}

Pool Config Specification

For PoolMetric subclasses, a pool_config property must be specified to map pool-types to individual configs in the above format:

{
    PoolClass1: {
        "functions": ...
        "plot": ...
    },

    PoolClass2: {
        "functions": ...
        "plot": ...
    },
}

Functions

Functions used to compute metrics and/or summary statistics. Includes two sub-keys:

  • config["functions"]["metrics"] (required):

    A single function that computes all sub-metrics and returns them in a single DataFrame

  • config["functions"]["summary"] (optional):

    A dict mapping sub-metric names to functions for computing summary statistics. Functions can be specified using either:

    • a string referring to a pandas.DataFrame method (e.g., “sum”, “mean”, “median”)

    • a sub-dict mapping a summary statistic’s name to a function

For example, the ArbMetrics config specifies functions as follows:

"functions": {
            "metrics": self.compute_metrics,
            "summary": {
                "arb_profit": "sum",
                "pool_fees": "sum",
                "pool_volume": "sum",
                "price_error": "median",
            }
}

When summary functions are specified as strings, the string is used to specify both the function and the summary statistic’s name in the results DataFrame. If a summary function is specified with a dict, the key specifies the summary statistic’s name, and the value is the function to compute the statistic:

"pool_value": {"annualized_returns": self._compute_annualized_returns}

Finally, multiple summary statistics can be specified for each sub-metric by using either a list of strings or a dict with multiple items. For example:

"pool_balance": ["median", "min"]

Or, if we sought to rename the summary statistics:

"pool_balance": {"Median": "median", "Minimum": "min"}

Plot (optional)

Plotting specifications for metrics and/or summary statistics.

At minimum, the plot key specifies a title, style, and (for sub-metrics, but not summary statistics) a resampling function. Take for example this sub-section of the ArbMetrics config:

"plot": {
        "metrics": {
            "arb_profit": {
                "title": f"Daily Arbitrageur Profit (in {self.numeraire})",
                "style": "time_series",
                "resample": "sum",
            },
            "pool_fees": {
                "title": f"Daily Pool Fees (in {self.numeraire})",
                "style": "time_series",
                "resample": "sum",
            },

        "summary": {
            "arb_profit": {
                "title": f"Total Arbitrageur Profit (in {self.numeraire})",
                "style": "point_line",
            },
            "pool_fees": {
                "title": f"Total Pool Fees (in {self.numeraire})",
                "style": "point_line",
            },

Plot: Title

The title key specifies the title that will be shown above each plot. Because config is a property, we can use f-strings or other executable code to define this or any other entry.

Plot: Style

The style key indicates the plot style, as defined in plot.styles.

Currently, the following styles are supported:

  • line - a line plot

  • point_line - a line plot with each individual point also marked

  • time_series - a line plot with the x-axis set to the “timestamp” metric

  • histogram - a normalized histogram with “Frequency” as the y-axis

Note that any of the style properties can be overriden by specifying additional properties in the plot config (see Plot: Additional Properties below). For histograms, the metric must be specified as the x-axis variable.

Plot: Resample

The resample key defines what function to apply when the metric time-series are downsampled before plotting. Because the full metric dataset can be very large, we resample each metric to a sampling frequency of 1 day.

Any pandas function that returns a single value per time-bin is supported: sum, mean, std, sem, max, min, median, first, or last.

See pandas resampling docs for more details.

Downsampling can be overriden by specifying "resample": False.

Plot: Additional Properties

Each sub-metric or summary statistic’s plot can be further customized by providing additional keys, which are passed as keyword arguments to altair.Chart.

For example, in the ArbMetrics config["plot"]["metrics"] entry, the encoding for the price_error sub-metric is altered to specify the metric as the x-axis and truncate the x-axis scale:

"price_error": {
    "title": "Price Error",
    "style": "histogram",
    "encoding": {
        "x": {
            "title": "Price Error (binned)",
            "shorthand": "price_error",
            "scale": Scale(domain=[0, 0.05], clamp=True),
        },
    },
},

In the above example, the "encoding" key would be passed to altair.Chart as a keyword argument after the sub-dict "x" was passed to altair.X (i.e., the relevant Altair class constructor).