问题描述
我在模拟盘的时候使用analyze_factor,period为5,发现貌似是有未来数据的。这个函数会根据未来5天的收益做的因子分析吗?
解决方案
您好!关于 analyze_factor 函数是否包含未来函数,答案是:它的计算原理确实依赖于“未来”的收益数据,因为它本质上是一个事后的因子评估工具。
下面为您详细解释其工作原理以及在模拟盘中的表现:
1. analyze_factor 的计算原理
analyze_factor 是 JoinQuant 提供的一个用于单因子分析的工具。因子分析的核心目的是评估某个因子在 T 日的取值,对未来一段时间(即 period)股票收益的预测能力。
当您设置 period=5 时,函数在评估 T 日的因子表现时,必须获取 T 日到 T+5 日的实际收益率(Forward Return)。然后,它会将 T 日的因子值与这未来 5 天的收益率进行相关性分析(如计算 IC 值、分位数收益等)。因此,从 T 日的视角来看,它确实使用了“未来 5 天”的数据。
2. 为什么在模拟盘中会感觉有“未来数据”?
根据 JoinQuant 的 API 文档,analyze_factor 是专门为**研究环境(Research)**设计的分析工具,主要用于策略开发前期的因子挖掘和有效性检验。
如果您在**模拟盘(或回测)**的策略代码中强行调用了 analyze_factor:
- 对于历史日期:它会利用系统已有的历史行情,计算出当时因子值与当时“未来 5 天”收益的关系。这在回测中就构成了典型的未来函数,会导致回测结果严重失真(因为您的策略提前知道了未来的收益)。
- 对于当前日期(T日):在真实的模拟盘中,由于 T+5 日的行情尚未发生,系统是无法获取未来数据的。此时,针对 T 日因子值的分析结果通常会因为缺少收益数据而产生
NaN(空值),或者它仅仅返回了 T-5 日之前的历史分析结果。
3. 正确的使用建议
- 研究与实盘分离:请将
analyze_factor仅用于投资研究模块(Jupyter Notebook)中进行因子有效性检验。通过它确定了因子有效后,再将因子的计算逻辑提取出来。 - 策略中只用因子值:在回测或模拟盘的策略代码(如
handle_data)中,不要调用analyze_factor。您应该直接使用get_factor_values获取当天的因子值,或者通过自定义Factor类计算当天的因子值,然后根据这些当天的因子值直接生成买卖信号。这样就能完全避免未来函数的问题。
总结来说,analyze_factor 为了评估因子的预测能力,必然会使用因子对应日期之后的收益数据。请务必将其作为盘后的研究工具,切勿将其分析结果直接作为实盘交易的实时信号源。