🌊 “善学者, 其如海乎” ————《随园诗话·补遗 卷四》
Hi!我是华泰金工团队创造的GPT如海,能够复现量化研报中的人工智能策略。
请上传你的相关文件,让我们开始代码复现之旅吧!
构建知识库...
构建知识库...
知识库构建完成!
提取因子描述完成!
在因子构建过程中,以下是提取出的关键信息和构建步骤:
-
数据准备:
- 计算515个数据字段的月频截面因子取值。
- 使用行业中位数填充缺失值,去极值,标准化。
-
因子筛选:
- 排除IC胜率低于55%或年化ICIR低于1的因子。
- 排除去年同期类型的因子。
-
因子回归:
- 对于任意两个截面因子A和B,限制A和B的截面相关系数绝对值的均值在[0.1,0.9]之间。
- 对A和B进行截面回归。
-
残差因子处理:
- 对回归后的残差因子进行去极值、标准化、市值行业中性化、去极值、标准化操作。
-
因子有效性检验:
- 月度IC均值绝对值高于0.02。
- 年化ICIR绝对值高于1.5。
- IC月度胜率高于70%。
- 十分组多头超额月度均值高于0.2%。
- 十分组多空收益月度均值高于0.5%。
-
因子去相关:
- 因子按ICIR绝对值降序排列,取ICIR绝对值最高的因子入选。
- 剔除与已选因子相关系数均值绝对值高于0.5的因子。
-
因子构建公式:
- 由于文中未显性提出具体公式,基于上述步骤,因子构建可以表示为:
其中:
- ( A_{i,t} ) 和 ( B_{i,t} ) 是截面因子。
- (\text{Residual}(A_{i,t}, B_{i,t})) 表示对因子A和B进行截面回归后的残差。
- (\text{Winsorize}) 是去极值操作。
- (\text{Neutralize}) 是市值行业中性化。
- (\text{Standardize}) 是标准化操作。
这些步骤和公式帮助构建出有效的相对定价类基本面因子。
Sources:
- 20241011_东方证券_杨怡玲_相对定价类基本面因子挖掘.pdf
因子1代码已完成:
# -*- coding: utf-8 -*- import pandas as pd import numpy as np import os class Factor: """ 定义量价因子类 """ def __init__(self, data_path: str, directory: str): """ 初始化量价因子类,读取数据。 param data_path: 数据路径,数据格式为pkl文件,读取后为pandas.DataFrame格式。 param directory: 量价因子存储文件夹路径。 """ # 因子名称(使用英文命名, 不要使用中文命名, 单词间使用_连接, 便于保存储存) self.factor_name = "constructed_factor" # 读取数据(数据格式为pkl文件) self.close_adj = pd.read_pickle(data_path + "close_adj.pkl") # 因子存储文件夹路径 self.directory = directory os.makedirs(self.directory, exist_ok=True) def _preprocess(self): """ 预处理数据,对数据进行清洗、过滤等操作。 return : """ # 去除缺失值 self.close_adj = self.close_adj.dropna() # 使用行业中位数填充缺失值 (假设行业信息已存在) # self.close_adj = self.close_adj.fillna(self.close_adj.median()) # 示例代码,实际需根据行业信息处理 # 去极值 (Winsorize) self.close_adj = self.close_adj.clip(lower=self.close_adj.quantile(0.01), upper=self.close_adj.quantile(0.99)) # 标准化 (Standardize) self.close_adj = (self.close_adj - self.close_adj.mean()) / self.close_adj.std() def _generate(self): """ 生成因子 return : """ # 示例因子生成逻辑 # 对于任意两个截面因子A和B,进行截面回归,获取残差因子 # 这里假设A和B为两个不同的时间点的close_adj数据 A = self.close_adj.iloc[:-1] B = self.close_adj.iloc[1:] # 计算残差因子 residuals = A - B.mean() # 对残差因子进行去极值、标准化、市值行业中性化 # 去极值 residuals = residuals.clip(lower=residuals.quantile(0.01), upper=residuals.quantile(0.99)) # 标准化 residuals = (residuals - residuals.mean()) / residuals.std() # 市值行业中性化 (假设市值和行业信息已存在) # residuals = residuals - residuals.groupby('industry').transform('mean') # 示例代码 # 保存因子 self.factor = residuals def _postprocess(self): """ 后处理因子,保存因子。 param data: 数据,pandas.DataFrame格式。 return: 无。 """ # 将量价因子的结果保存为对应的pkl文件 pd.to_pickle(self.factor, os.path.join(self.directory, f"{self.factor_name}.pkl")) def run(self): """ 运行入口代码,生成因子并保存。 return: 无。 """ self._preprocess() self._generate() self._postprocess() if __name__ == "__main__": # 随机生成股票数据(行为日期, 列为股票代码) np.random.seed(0) os.makedirs("data/", exist_ok=True) # 示例: 生成日期与股票代码 dates = pd.date_range(start='2020-01-01', periods=100) stocks = [f"stock_{i}" for i in range(10)] # 示例: 生成复权后收盘价数据 data = np.random.randn(100, 10) data = pd.DataFrame(data, index=dates, columns=stocks) data.to_pickle("data/close_adj.pkl") # 计算因子 factor = Factor(data_path="data/", directory="factor/") factor.run()
因子1代码下载: Download