Factor Model Summary

Types

PortfolioOptimisers.FactorSummaryResultType
struct FactorSummaryResult{__T_ann_return, __T_ann_volatility, __T_sharpe, __T_autocorr, __T_mean_abs_t, __T_t_rate, __T_mean_vif, __T_stability, __T_coverage, __T_ppy} <: AbstractResult

The headline statistics of every factor of a cross-sectional factor model.

FactorSummaryResult is what factor_model_summary returns. It carries the nine columns plot_factor_model_summary draws, one entry per raw factor, and the annualisation factor that produced the first three, so a summary can be tabulated, compared across fits, asserted on in a test, or read without a plotting package installed.

The five columns that can be absent

mean_abs_t, t_rate and mean_vif read the regression design, and stability and coverage read the exposure history. A block that carries no exposure history has none of them, and all five read back as nothing. A consumer reads that by dispatch rather than by a test of its own.

The raw factor axis

The three Gram columns are computed on the reduced factor axis of the family re-basis, and are written back onto the raw axis by name. A raw factor the re-basis dropped carries NaN in those three columns and a value in the others.

Fields

  • ann_return: Annualised mean of the factor return series, one entry per raw factor.
  • ann_volatility: Annualised volatility of the factor return series, one entry per raw factor.
  • sharpe: Ratio of the annualised mean to the annualised volatility, one entry per raw factor.
  • autocorr: Lag-one autocorrelation of the factor return series, one entry per raw factor.
  • mean_abs_t: Mean absolute cross-sectional t-statistic, one entry per raw factor, or nothing when the block carries no exposure history.
  • t_rate: Fraction of the observations at which the absolute t-statistic passes the threshold, one entry per raw factor, or nothing when the block carries no exposure history.
  • mean_vif: Mean variance inflation factor, one entry per raw factor, or nothing when the block carries no exposure history.
  • stability: Median exposure stability coefficient, one entry per raw factor, or nothing when the block carries no exposure history.
  • coverage: Average fraction of the universe at which the factor exposure is finite, one entry per raw factor, or nothing when the block carries no exposure history.
  • ppy: Annualisation factor. 252 for daily, 52 for weekly, 12 for monthly returns. It defaults to 1, which reports the statistics per period.

Constructors

FactorSummaryResult(    ann_return, ann_volatility, sharpe, autocorr,    mean_abs_t, t_rate, mean_vif, stability, coverage, ppy) -> FactorSummaryResult

Arguments correspond to the struct's fields, in the order they are declared. The type is a Result, so factor_model_summary builds it and a caller reads it; there is no keyword constructor, and the type validates nothing of its own.

Related

source

Functions

PortfolioOptimisers.factor_model_summaryFunction
factor_model_summary(csfm::CrossSectionalFactorModel; ppy::Number = 1,
                     threshold::Number = 2, step::Integer = 21,
                     weighting = BenchmarkWeightMetric(),
                     coverage_weighting = RegressionWeightMetric()) -> FactorSummaryResult

Summarise every factor of a cross-sectional factor model as a FactorSummaryResult.

The summary is the top of the diagnostic hierarchy. It calls one level-2 verb of the regression group and one of the exposure group per column, and it aggregates each series over the observations. It computes no statistic of its own but the factor return statistics and two aggregates: the median of the stability, and the patch that reads a constant exposure as perfectly stable.

The answer is on the raw factor axis. The regression group answers on the reduced axis of the family re-basis, and the summary joins the two by name.

Algorithm

  1. Read the factor return history off csr, refusing a block that carries none.
  2. Take the annualised mean, the annualised volatility and the Sharpe ratio of each series with factor_summary_return_stats, dropping the absent observations.
  3. Take the lag-one autocorrelation of each series with factor_summary_autocorrelation.
  4. Take the mean absolute t-statistic, the exceedance rate and the mean variance inflation factor, and join them onto the raw factor axis. A block with no exposure history gives nothing for all three.
  5. Take the median stability and the coverage. A block with no exposure history gives nothing for both.
  6. Collect the nine columns and ppy into a FactorSummaryResult.

Arguments

  • csfm: A cross-sectional factor model block. A caller who holds a Prior Result writes pr.rr.
  • ppy: Periods per year. 252 annualises a daily fit, and the default of 1 reports the statistics per period.
  • threshold: Absolute t-statistic the exceedance rate counts against.
  • step: Number of observations between the two cross-sections the stability reads.
  • weighting: The AbstractOrthogonalityMetric whose weight history the stability reads.
  • coverage_weighting: The AbstractOrthogonalityMetric whose positive weights are the universe of the coverage. Its default of RegressionWeightMetric is the estimation universe of the fit.

Validation

  • ppy > 0.
  • csfm.csr is not nothing.
  • csfm.nf is not nothing when csfm.fcb is present.

Returns

  • fs::FactorSummaryResult: The computed summary.

Related

source