3 分钟快速生成代码
输入想法,AI 即刻生成可运行代码
在 JoinQuant(聚宽)平台上进行因子分析时,发现 analyze_factor 生成的累计收益图与因子看板(Factor Kanban)的图表在坐标轴或曲线上存在不一致,是一个非常常见的现象。这并不一定意味着其中一个是错误的,而是因为两者在底层计算逻辑、默认参数设置以及展示细节上存在差异。
以下是导致这种不一致的几个核心原因:
这是最常见的原因。
get_factor_kanban_values)或查看看板 UI 时,通常会包含 commision_slippage(手续费及滑点)参数。看板默认可能会扣除一定的交易成本(例如 3‱佣金 + 1‰印花税 + 滑点)。analyze_factor:这是一个纯粹的统计学单因子分析工具,它计算的是纯因子收益(理论收益),默认不包含任何手续费和滑点。因此,analyze_factor 的累计收益通常会比因子看板看起来更高,坐标轴的绝对数值也会更大。plot_cumulative_returns_by_quantile():该函数有 demeaned 和 group_adjust 参数。如果 demeaned=False(默认值),它绘制的是各分位数的绝对累计收益。如果设置为 True,则是减去基准后的超额收益。analyze_factor 时的参数不完全一致。请检查你在调用绘图函数时是否对齐了 demeaned 参数。虽然两者都使用了对数轴,但底层的绘图库处理方式可能微有不同:
analyze_factor 底层基于开源的 Alphalens 库,其对数轴通常是直接对累计净值(Cumulative Returns + 1)取对数。因子看板的前端展示组件可能在刻度标签(Tick Labels)的格式化上做了不同的映射(例如显示百分比 vs 显示净值)。analyze_factor:默认假设在获取因子值的当天(T日)收盘后计算,并在下一期(通常是 T+1 日的收盘价或开盘价,取决于内部实现,通常为 close-to-close)进行调仓计算收益。analyze_factor 中,有 max_loss 参数(默认 0.25),并且在预处理时会剔除 NaN 值。skip_paused 参数)以及行业缺失值的填充逻辑可能有一套固定的标准化流程。如果你在 analyze_factor 中没有完全复刻这套清洗流程(例如行业中性化时的权重处理),分位数的成分股就会有微小差异。两者都没有“错”,只是评估维度不同。analyze_factor 偏向于理论因子的预测能力(IC/IR)和纯收益,而因子看板更偏向于贴近实盘约束(扣除费率、严格延迟)的策略表现。
如何验证?
commision_slippage 设置为 0(无手续费无滑点)。analyze_factor 的绘图函数中,明确设置 demeaned=False 和 group_adjust=False。skip_paused 参数完全一致。far.mean_return_by_quantile),直接对比第一天的收益率数值,看差异是出在第一天的计算上,还是长期复利累积上。