问题描述
解决方案
在聚宽(JoinQuant)的研究环境中,对自定义因子进行单因子有效性分析主要依赖于 jqfactor 库。
你需要完成以下三个步骤:
- 定义因子:继承
Factor类并编写计算逻辑。 - 运行分析:使用
analyze_factor函数进行回测分析。 - 查看结果:通过分析对象的属性获取 IC 值表和分层收益表。
以下是完整的代码示例,演示了如何定义一个简单的“5日乖离率”因子(BIAS5),并对其进行 IC 分析和分层收益分析。
# -*- coding: utf-8 -*-
import pandas as pd
import numpy as np
from jqfactor import Factor, analyze_factor
# 1. 定义自定义因子类
class BIAS5(Factor):
name = 'bias5'
max_window = 5 # 获取过去5天的数据
dependencies = ['close'] # 依赖收盘价
def calc(self, data):
"""
计算公式:(当日收盘价 - 5日均价) / 5日均价
"""
close = data['close']
# 计算5日均价
ma5 = close.mean()
# 获取当日收盘价 (数据的最后一行)
current_close = close.iloc[-1]
# 计算乖离率
bias = (current_close - ma5) / ma5
return bias
# 2. 运行单因子分析
# 设定分析参数
factor_analyzer = analyze_factor(
factor=BIAS5, # 传入自定义的因子类
start_date='2023-01-01', # 分析开始日期
end_date='2023-06-01', # 分析结束日期
universe='000300.XSHG', # 股票池:沪深300
industry='jq_l1', # 行业分类:聚宽一级行业(用于行业中性化)
quantiles=5, # 分层数量:分为5层
periods=(1, 5, 10), # 调仓周期:分别看1天、5天、10天的未来收益
weight_method='mktcap', # 加权方式:按市值加权
max_loss=0.25 # 最大允许缺失值比例
)
# 3. 获取并打印分析结果
# --- 查看 IC 值 ---
print("【IC 分析结果】")
# 获取月度 IC 均值表
print("\n1. 月度 IC 均值 (ic_monthly):")
print(factor_analyzer.ic_monthly)
# 获取每日 IC 序列 (前5行)
print("\n2. 每日 IC 序列 (ic.head()):")
print(factor_analyzer.ic.head())
# 计算 IC 的整体均值 (IR = IC均值 / IC标准差)
ic_mean = factor_analyzer.ic.mean()
print("\n3. IC 整体均值:")
print(ic_mean)
# --- 查看分层收益 ---
print("\n" + "="*50 + "\n")
print("【分层收益分析结果】")
# 获取分层收益表 (mean_return_by_quantile)
# 这里的收益通常是去除了基准收益后的超额收益或行业中性化后的收益
print("\n1. 各分层平均收益 (mean_return_by_quantile):")
print(factor_analyzer.mean_return_by_quantile)
# 如果是在 Notebook 环境中,可以使用以下命令直接绘制所有图表(在纯代码模式下不显示)
# factor_analyzer.create_full_tear_sheet()
代码关键点说明
-
Factor类定义:max_window: 必须设置足够的时间窗口以满足计算需求(例如计算5日均线至少需要5天数据)。dependencies: 声明需要用到的基础数据(如close,volume,market_cap等)。calc方法: 接收的data是一个字典,key 是依赖项名称,value 是 DataFrame(行是时间,列是股票代码)。返回值必须是一个 Series(索引为股票代码)。
-
analyze_factor函数:- 这是核心分析函数,它会自动处理数据获取、去极值、标准化、中性化(通过
industry参数)以及收益计算。 quantiles=5: 表示将股票池按因子值从小到大分为5组。通常第1组是因子值最小的,第5组是因子值最大的。
- 这是核心分析函数,它会自动处理数据获取、去极值、标准化、中性化(通过
-
结果属性:
far.ic: 返回一个 DataFrame,包含每日的 IC 值。far.mean_return_by_quantile: 返回各分层在不同调仓周期下的平均收益率。far.create_full_tear_sheet(): 如果你在聚宽的研究环境(Notebook)中运行,调用此方法可以直接生成包含累积收益图、IC 衰减图、换手率图等完整的可视化报告。
Q&A
Q: 什么是 IC 值 (Information Coefficient)?
A: IC 值用于衡量因子值与下期收益率之间的相关性。IC 的绝对值越大(接近 1 或 -1),说明因子的预测能力越强。通常 IC > 0.02 或 IC < -0.02 被认为具有一定的选股能力。
Q: 分层收益(Layered Returns)怎么看?
A: 分层收益是将股票按因子值排序后分成若干组(如5组),分别计算每组的平均收益。一个有效的因子,其分层收益应该呈现明显的“单调性”,即随着因子值增大,组别收益依次递增(正相关)或递减(负相关)。
Q: analyze_factor 中的 industry 参数有什么作用?
A: 该参数用于行业中性化。不同行业的股票因子值可能存在天然差异(例如银行股的市净率普遍低于科技股)。设置 industry='jq_l1' 后,计算 IC 和分层收益时会剔除行业偏差,使因子在同行业内进行比较,从而评价因子纯粹的选股能力。