概述
在多因子中, 我们希望通过多个因子的叠加来提高模型整体对于未来收益率的预测能力. 我们会把相关性高 (低) 的一些因子合成成一个因子.
PCA 方法
PAC (Principal Component Analysis) 是一种数学降维方法. 通过利用正交变换把一系列可能线性的变量转换为一组不相关的新变量.
PCA 的用法:
from sklearn.decomposition import PCA
sklearn.decomposition.PCA(n_components=None, copy=True, whiten=False)
n_components:
- 意义: PCA 算法中所要保留的主成分个数 n
- 类型: int 或者 string. 缺失时默认为 None, 所有成分被保留
- 赋值为 int, 比如
n_components=1
, 将把原始数据降到一个维度 - 赋值为 string, 比如
n_compents="mle"
, 将自动选取特征个数 n, 使得满足所需求的方差百分比
代码实现
分析
在之前的文章中我们发现资产回报率和资本回报率这两个因子相关性较高, 所以我们将这两个因子进行合成.
- 获取因子数据
- 应用 PCA 进行合成
代码
# 因子合成
# 分析的区间2020-01-01到2021-01-01
import numpy as np
import pandas as pd
import datetime
from alphalens import performance
from alphalens import plotting
from alphalens import tears
from alphalens import utils
from sklearn.decomposition import PCA
factor_1 = "return_on_asset_net_profit"
factor_2 = "return_on_invested_capital"
# ----------------1. 获取因子数据----------------
# 获取这一年的交易日期
date_data = get_trading_dates(start_date="2020-01-01", end_date="2021-01-01")
# 定义df数据集
all_data = pd.DataFrame()
for date in date_data:
# 获取当天因子数据
q = query(
fundamentals.financial_indicator.return_on_asset_net_profit,
fundamentals.financial_indicator.return_on_invested_capital
)
# 获取截面数据
fund = get_fundamentals(q, entry_date=date).iloc[:, 0, :]
# 创建日期列
fund["date"] = date
# 拼接
all_data = pd.concat([all_data, fund])
# ----------------2. 合成因子---------------
# 填充缺失值
all_data[factor_1] = all_data[factor_1].fillna(all_data[factor_1].mean())
all_data[factor_2] = all_data[factor_2].fillna(all_data[factor_2].mean())
# 实例化
pca = PCA(n_components=1)
compound_factor = pca.fit_transform(all_data[[factor_1, factor_2]])
print(compound_factor)