问题描述
根据文档说明:
去极值函数 winsorize_med()
axis = 0 为对每列做缩尾,axis =1 为对每行做缩尾
标准化函数 standardlize()
axis = 0 为对每列做标准化,axis =1 为对每行做标准化
在因子处理的时候如果数据如下图所示的话
去极值应该按列(纵的方向)处理 axis = 0
标准化应该按行(横的方向)处理 axis = 1
处理方向刚好相反,请问我的做法对吗??
解决方案
您的做法通常是不对的。在常规的多因子量化模型中,去极值(Winsorize)和标准化(Standardize)的处理方向应该是相同的,通常都是在**截面(Cross-Section)**上进行处理。
为什么方向应该相同?
在多因子模型中,我们通常需要消除不同股票在同一时间点上的量纲差异和极端值影响,以便横向比较股票的好坏。因此,无论是去极值还是标准化,都是针对同一时间点、所有股票的因子值进行的(即截面处理)。
如果您将去极值设为 axis=0(按列),而标准化设为 axis=1(按行),这意味着您对一个操作进行了时间序列处理,对另一个操作进行了截面处理,这在逻辑上是矛盾的。
如何正确选择 axis?
axis 的选择完全取决于您的 DataFrame 的数据结构:
情况一:Index 为日期,Columns 为股票代码(最常见)
如果您使用 get_factor_values 获取单个因子的数据,默认返回的 DataFrame 结构是:
- 行(Index):日期(Date)
- 列(Columns):股票代码(Stock Code)
在这种结构下,每一行代表某一天所有股票的因子值。因为我们需要在同一天对所有股票进行截面处理,所以应该按行处理。
- 去极值:
winsorize_med(data, axis=1) - 标准化:
standardlize(data, axis=1)
情况二:Index 为股票代码,Columns 为因子名称(单日多因子)
如果您提取了某一天的数据,并将多个因子合并成一个 DataFrame,结构可能是:
- 行(Index):股票代码(Stock Code)
- 列(Columns):因子名称(Factor Name)
在这种结构下,每一列代表某一个因子在所有股票上的值。因为我们需要对同一个因子在所有股票上进行截面处理,所以应该按列处理。
- 去极值:
winsorize_med(data, axis=0) - 标准化:
standardlize(data, axis=0)
总结
请检查您的 DataFrame 结构:
- 确定哪一个维度代表了**“同一时间点的不同股票”**。
- 确保去极值和标准化都在这个维度上进行(即
axis参数保持一致)。 - 绝大多数情况下,因子处理不应该在时间序列(同一股票的不同时间点)上进行去极值或标准化,除非您在构建特定的时序动量/反转因子。