3 分钟快速生成代码
输入想法,AI 即刻生成可运行代码
在多因子量化选股策略的开发过程中,评估因子的有效性(即因子评价)是至关重要的一步。JoinQuant(聚宽)平台提供了强大的 jqfactor 模块,方便量化投资者编写自定义因子并进行 IC(Information Coefficient)及分组收益分析。
本文将手把手带你通过 Python 代码实现自定义因子的编写、计算以及使用 analyze_factor 工具完成单因子分析。
评估一个自定义因子的有效性通常包含以下三个步骤:
Factor 类:定义因子的计算逻辑、依赖数据和滑动窗口。以下示例展示了如何编写一个简单的自定义因子 GROSSPROFITABILITY(毛利率/总资产),并对该因子在沪深300成分股上的 IC 值及分组收益进行评估。
import numpy as np
import pandas as pd
from jqfactor import Factor, analyze_factor
# 1. 定义自定义因子类
class GrossProfitability(Factor):
# 因子名称(不可与基础因子重名)
name = 'gross_profitability'
# 获取数据的最大时间窗口(天)
max_window = 1
# 依赖的基础财务数据或价量数据
dependencies = ['total_operating_revenue', 'total_operating_cost', 'total_assets']
def calc(self, data):
"""
计算因子值的核心函数
"""
# 获取依赖数据(DataFrame 结构:index为日期,columns为股票代码)
total_revenue = data['total_operating_revenue']
total_cost = data['total_operating_cost']
total_assets = data['total_assets']
# 因子计算逻辑:(营业总收入 - 营业总成本) / 总资产
gross_profit = (total_revenue - total_cost) / total_assets
# 由于 max_window=1,返回1行N列的DataFrame,需转为 Series (index为股票代码)
return gross_profit.iloc[0]
# 2. 运行单因子分析
far = analyze_factor(
factor=GrossProfitability, # 传入因子类
universe='000300.XSHG', # 测试股票池:沪深300
start_date='2021-01-01', # 开始日期
end_date='2022-12-31', # 结束日期
quantiles=5, # 分组数:5分位
periods=(1, 5, 20), # 调仓周期:1日、5日、20日
weight_method='mktcap', # 分组收益加权方式:市值加权
industry='jq_l1' # 行业分类:聚宽一级行业
)
# 3. 查看 IC 与收益指标
print("=== 月度 IC 信息 ===")
print(far.ic_monthly)
print("\n=== 按分位数分组的平均收益率 ===")
print(far.mean_return_by_quantile)
# 4. 绘制全套分析图表(包括 IC 时间序列图、分位数累计收益图等)
far.create_full_tear_sheet()
执行 analyze_factor 后,聚宽会自动计算并输出以下关键指标:
Rank IC(秩相关系数)
far.ic 访问每日 IC 值。IC 均值与 IR(信息比率)
IR = Mean(IC) / Std(IC)。far.calc_mean_information_coefficient() 接口获取。分位数分组收益(Quantile Returns)
Factor 类内部已处理好财务数据的披露延迟问题(如在T日只能获取到T日盘前已披露的最新财报),无需手动处理复权或防未来函数问题。jqfactor.winsorize_med(中位数去极值)及 jqfactor.neutralize(行业与市值中性化)进行预处理。