课程  因子投资  机器学习  Python  Poetry  ppw  tools  programming  Numpy  Pandas  pandas  算法  hdbscan  聚类  选股  Algo  minimum  numpy  algo  FFT  模式识别  配对交易  GBDT  LightGBM  XGBoost  statistics  CDF  KS-Test  monte-carlo  VaR  回测  过拟合  algorithms  machine learning  strategy  python  sklearn  pdf  概率  数学  面试题  量化交易  策略分类  风险管理  Info  interview  career  xgboost  PCA  wavelet  时序事件归因  SHAP  Figures  Behavioral Economics  graduate  arma  garch  人物  职场  Quantopian  figure  Banz  金融行业  买方  卖方  story  量化传奇  rsi  zigzag  穹顶压力  因子  ESG  因子策略  投资  策略  pe  ORB  Xgboost  Alligator  Indicator  factor  alpha101  alpha  技术指标  wave  quant  algorithm  pearson  spearman  tushare  因子分析  Alphalens  涨停板  herd-behaviour  momentum  因子评估  review  SMC  聪明钱  trade  history  indicators  zscore  波动率  强化学习  顶背离  freshman  resources  others  AI  DeepSeek  network  量子计算  金融交易  IBM  weekly  LLT  backtest  backtrader  研报  papers  UBL  quantlib  jupyter-notebook  scikit-learn  pypinyin  qmt  xtquant  blog  static-site  duckdb  工具  colors  free resources  barra  world quant  Alpha  openbb  数据  risk-management  llm  prompt  CANSLIM  Augment  arsenal  copilot  vscode  code  量化数据存储  hdf5  h5py  cursor  augment  trae  Jupyter  jupysql  pyarrow  parquet  数据源  quantstats  实盘  clickhouse  notebook  redis  remote-agent  AI-tools  Moonshot  回测,研报,tushare 

strategy »

因子分析(3)- 都是坑!这么简单的Alpha计算,竟然错了?!


Table of Content

我们继续 Alphalens 因子分析报告的解读。在过去的两篇笔记中,我们都提到,运用 Alphalens 进行因子分析步骤很简单,但是如果不了解它背后的机制与逻辑,很容易得到似是而非的结论。

Alphalens 提供了alpha和beta分析。方法是factor_alpha_beta:

1
2
3
from alphalens.performance import factor_alpha_beta

alpha, beta = factor_alpha_beta(factor_data)

我们将得到以下输出:


看上去很完美。

这个结果表明,该因子的年化alpha是2.7%,风险暴露为35%,一定程度上受到市场影响。我们按照 Alphalens 的要求,通过 get_clean_factor_and_forward_returns 方法获得了 factor_data, 然后用它来计算 alpha 和 beta。过程简单明了,似乎不可能出任何错误。

但实际上,如此得到的 alpha 和 beta,在我们这个示例中并没有任何意义。

Warning

在做量化研究时,我们需要对得到的任何数值都进行仔细的研究,不能轻信任何一个结果,因为有结果和结果正确完全是两回事。

在Alphalens中,alpha和beta是通过因子组合收益对市场组合收益的最小二乘回归(OLS)来求得的。

Info

Alphalens在这里借用了statsmodels中的OLS方法。

其中,市场组合的收益是对各标的收益的简单平均。假设我们的组合共有4个标的,某一日它们各自的收益分别为: 0.01189, 0.01102, -0.01241和-0.01898,则当日市场组合的收益为

\[ (0.01189 + 0.01102 -0.01241 -0.01898)/4= -0.00212 \]

而因子组合收益的计算,涉及到因子权重的分配问题。因子分配权重\(W\)一旦确定,则则因子组合的收益就可由下列公式求出:

\[ r_p = \sum{r_i * W_i} \]

关键在于权重\(W\)的计算。

Alphalens是这样计算的:它将factor_data按天进行分组,然后对将每个asset的因子除以因该组因子之和,这样得到的结果,其和为1。此外,它还提供一个参数,以进行零均值中心化,即将因子值减去中位数,再除以该组因子之和,这样得到的因子权重之和将为零。

假若我们有以下factor_data(左图),如果我们对上述factor_data,用Alphalens的方法求各因子的权重,我们将得到右图:

R50

R50

这里有两个问题:

  1. 缺省地,Alphalens计算出的因子权重和为零,这适用于可以同时做多做空的市场。如果因为种种原因,你只能选择单边做多的话,那么我们调用factor_alpha_beta时,就必须将demeaned参数传值为False,以改变factor weights的计算。

  1. 如果factor是换手率,则按照Alphalens分配的权重,该因子组合的收益率(假设demeaned = False)是这样计算得来的:给换手率最大的,分配最多的做多权重,给换手率最小的,分配最小的权重,而整个权重和为0。这样刚好和低换手率因子的作用相反!

所以,我们在构造因子时,需要考虑将factor进行转换,使之与因子收益率呈正相关关系。

现在看起来,这个结论似乎是那么显然易见,但是,alphalens并没有文档提示这一点,而且,我们在前面的其它分析中,由于使用了分层法,其分析结果并不受影响,所以这个问题,也就一直没有暴露。

现在,我们改造一下factor,重新运行:

1
2
3
4
5
6
7
from alphalens.utils import get_clean_factor_and_forward_returns

factor_data = get_clean_factor_and_forward_returns(factor, prices, bins=None, quantiles=10)

# 我们将换手率因子取倒数,从而使得因子逆序
factor_data.factor = 1 / factor_data.factor
factor_alpha_beta(factor_data,demeaned=False)

这一次,我们得到的年化alpha是4.48%。市场暴露风险为80%,这也与我们在累积收益图中看到的相一致。

现在,我们再做一次 mean_return_by_quantile 分析,看看有什么不同:


这个结果在视觉上,是昨天笔记中对应结果的水平翻转。这一次,表现最好的是第10组因子,最差的是第二组因子。除此之外,并没有其它的不同。

Tip

  1. 默认地, alphalens计算收益是,会构建多空组合,即做多组号最大的分层,做空组号最小的分层。
  2. 尽管文档没有要求,但经过代码分析,alphalens实际上要求因子值与收益呈正相关关系。
  3. 如果因子值与收益刚好呈负相关关系,我们可以通过求倒数的方法,将因子值重新逆序。
  4. 如果因子值与收益之间没有单调递增(递减)的关系 ,则因子检验失败,但需要我们自己去分析得出这个结论。
  5. alphalens中,计算因子的alpha和beta是通过因子组合收益对市场组合的收益做OLS线性回归得到的。