🚀 AI 一键生成 joinquant 策略代码
立即体验
👉 AI 生成代码 👈

JoinQuant 聚宽单因子分析:提取因子收益与 IC 值并存入 List 的方法

joinquant | 发布时间: 2026/5/29
以下内容由 EasyQuant 生成。

问题描述

如何获得多个因子的收益及IC的值?

通过以下步骤,过程中会显示单个或多个因子的收益及IC的值,但是如何把值提取出来,并存到指定的list中?请指教。

使用获取的因子值进行单因子分析
1.far = analyze_factor(factor=factor_data, start_date=start, end_date=end, weight_method='avg', industry='jq_l1', quantiles=quantiles, periods=periods,max_loss=0.2)
2.# 收益能力速览
far.plot_returns_table(demeaned=False, group_adjust=False)

解决方案

在 JoinQuant 聚宽平台中,analyze_factor 函数返回的是一个因子分析对象(通常命名为 far)。你提到的 far.plot_returns_table() 等方法主要用于在研究环境中绘制图表和打印表格。如果想要将具体的数值提取出来并存入 list 中,你需要直接访问 far 对象的数据属性

以下是提取因子收益和 IC 值并存入 list 的具体方法:

1. 提取 IC 值

far 对象提供了多个属性来获取 IC(信息系数)数据,返回的通常是 pandas.DataFrame,你可以很方便地将其转换为 list。

  • 每日 IC 值far.ic
  • 月度 IC 值far.ic_monthly

代码示例:

# 假设你已经运行了 analyze_factor
# far = analyze_factor(...)

# 1. 获取每日 IC 值的 DataFrame
daily_ic_df = far.ic

# 假设你的 periods 包含了 1 (即调仓周期为1天),提取 1 天周期的 IC 值存入 list
if 1 in daily_ic_df.columns:
    daily_ic_list = daily_ic_df[1].tolist()
    print("每日 IC 值前5个:", daily_ic_list[:5])

# 2. 获取月度 IC 值的 DataFrame
monthly_ic_df = far.ic_monthly

# 提取 1 天周期的月度 IC 值存入 list
if 1 in monthly_ic_df.columns:
    monthly_ic_list = monthly_ic_df[1].tolist()
    print("月度 IC 值前5个:", monthly_ic_list[:5])

# 3. 如果你想获取 IC 的均值,可以使用内置的计算函数
# 计算 IC 均值 (返回 Series)
ic_mean_series = far.calc_mean_information_coefficient()
ic_mean_list = ic_mean_series.tolist()
print("各周期 IC 均值:", ic_mean_list)

2. 提取因子收益

因子收益同样可以通过 far 的属性获取,常见的有各分位数的平均收益,以及多空组合(最高分位减最低分位)的收益。

  • 按分位数分组加权平均因子收益far.mean_return_by_quantile
  • 最高分位数减最低分位数收益每日均值(多空收益)far.mean_return_spread_by_quantile

代码示例:

# 1. 获取各分位数的平均收益 DataFrame
# index 是分位数分组,columns 是调仓周期
mean_return_df = far.mean_return_by_quantile

# 假设你想获取调仓周期为 1 天的各分位数收益存入 list
if 1 in mean_return_df.columns:
    quantile_returns_list = mean_return_df[1].tolist()
    print("周期为1天的各分位数平均收益:", quantile_returns_list)

# 2. 获取多空组合(最高分位减最低分位)的每日收益均值 DataFrame
# index 是日期,columns 是调仓周期
spread_return_df = far.mean_return_spread_by_quantile

# 提取调仓周期为 1 天的多空每日收益存入 list
if 1 in spread_return_df.columns:
    spread_return_list = spread_return_df[1].tolist()
    print("周期为1天的多空每日收益前5个:", spread_return_list[:5])

总结

核心思路是:不要使用 plot_xxx 开头的方法来获取数据,而是直接调用 far 对象的属性(如 far.ic, far.mean_return_by_quantile 等)。这些属性返回的是标准的 Pandas 数据结构,你可以使用 Pandas 的 .tolist() 方法轻松将某一列或某一行的数据转换为 Python 的 List 列表 (list)。