qis.estimate_ic_ir

qis.estimate_ic_ir(result, method='spearman', return_col='r_norm_univ', periods_per_year=None, min_obs_per_date=5)[source]

IC information ratio per horizon — the time-series counterpart to the pooled IC in pooled_universe.

For each horizon the per-date cross-sectional IC series is summarised:

IC_IR     = mean(IC) / std(IC)               (per IC period)
IC_IR_an  = IC_IR * sqrt(AN_h)               (annualised)
t_stat    = IC_IR * sqrt(n_dates)            (significance of mean IC)
hit_rate  = mean(IC > 0)

IC_IR measures the stability of the IC over time: it rewards an IC that is consistently the right sign, not merely large on average. It does not adjust for breadth; the number of names enters only through the sampling noise of each per-date IC. It is the honest stability number the pooled t_stat is not — the pooled regression in estimate_signal_diagnostics treats every (asset, date) pair as independent and so overstates significance when the cross-section is correlated within a date; this collapses each date to one observation.

AN_h is the number of IC periods per year. A string horizon uses qis.get_annualization_factor(label) (1 for ‘YE’). An integer horizon h samples every h-th native period, so AN_h = AN / h with AN the qis annualisation factor of the finest native frequency in the pairs (12 for ‘ME’, 4 for ‘QE’, 252 for ‘B’), or periods_per_year when given.

Parameters:
  • result (SignalDiagnosticsResult) – SignalDiagnosticsResult from estimate_signal_diagnostics.

  • method (str) – ‘spearman’ (default) or ‘pearson’ for the per-date IC.

  • return_col (str) – ‘r_norm_univ’ (universe cross-section, default) or ‘r_norm_group’ (within-group — pass group_data to estimate_signal_diagnostics to populate it).

  • periods_per_year (float | None) – Periods per year of the native grid (the h = 1 grid), divided by h for an integer horizon h; not used for string horizons. Inferred from the pairs’ native frequencies when None.

  • min_obs_per_date (int) – Minimum cross-section per date.

Returns:

DataFrame indexed by horizon label, columns _IC_IR_COLS.

Raises:

ValueError – if method is neither ‘spearman’ nor ‘pearson’.

Return type:

DataFrame