🌊 “善学者, 其如海乎” ————《随园诗话·补遗 卷四》
Hi!我是华泰金工团队创造的GPT如海,能够复现量化研报中的人工智能策略。
请上传你的相关文件,让我们开始代码复现之旅吧!
构建知识库...
构建知识库...
知识库构建完成!
提取因子描述完成!
在量化投资领域,因子的构建通常涉及对财务数据的处理和分析。以下是从提供的信息中提取的因子构建步骤和公式:
-
投资现金流相关因子:
- TTM投资现金流的环比增长率:
- 过去8个季度TTM投资现金流标准差与均值的比值:
- TTM投资现金流环比增长率的标准差:
-
自由现金流相关因子:
- 简化自由现金流的环比增长率:
- 简化自由现金流的标准差与均值的比值:
- 简化自由现金流环比增长率的标准差:
-
税务支出相关因子:
- 税金及附加环比增长率:
- 过去8个季度税金及附加标准差与均值的比值:
- 税金及附加环比增长率的标准差:
这些公式通过对财务数据的增长率、稳定性等维度进行分析,帮助构建出能够反映公司财务健康状况和潜在投资价值的因子。
Sources:
- 20240603_中金公司_古翔_上市公司质量评估新视角.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 = "investment_cash_flow_factors" # 读取数据(数据格式为pkl文件) self.cash_flow = pd.read_pickle(data_path + "cash_flow.pkl") # 因子存储文件夹路径 self.directory = directory os.makedirs(self.directory, exist_ok=True) def _preprocess(self): """ 预处理数据,对数据进行清洗、过滤等操作。 return : """ # 去除缺失值 self.cash_flow = self.cash_flow.dropna() def _generate(self): """ 生成因子 return : """ # 计算TTM投资现金流的环比增长率 self.cf_p_qoq = (self.cash_flow - self.cash_flow.shift(1)) / self.cash_flow.shift(1) # 计算过去8个季度TTM投资现金流标准差与均值的比值 self.cf_p_std = self.cash_flow.rolling(window=8).std() / self.cash_flow.rolling(window=8).mean() # 计算TTM投资现金流环比增长率的标准差 self.cf_p_qoq_std = self.cf_p_qoq / self.cf_p_qoq.rolling(window=8).std() # 将生成的因子合并为一个DataFrame self.factor = pd.DataFrame({ 'cf_p_qoq': self.cf_p_qoq, 'cf_p_std': self.cf_p_std, 'cf_p_qoq_std': self.cf_p_qoq_std }) 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/cash_flow.pkl") # 计算因子 factor = Factor(data_path="data/", directory="factor/") factor.run()
因子1代码下载: Download
因子2代码已完成:
# -*- 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 = "fcff1_factors" # 读取数据(数据格式为pkl文件) self.operating_cash_flow = pd.read_pickle(data_path + "operating_cash_flow.pkl") self.capital_expenditure = pd.read_pickle(data_path + "capital_expenditure.pkl") # 因子存储文件夹路径 self.directory = directory os.makedirs(self.directory, exist_ok=True) def _preprocess(self): """ 预处理数据,对数据进行清洗、过滤等操作。 return : """ # 去除缺失值 self.operating_cash_flow = self.operating_cash_flow.dropna() self.capital_expenditure = self.capital_expenditure.dropna() def _generate(self): """ 生成因子(在注释中详细写明因子的生成逻辑) return : """ # 计算简化自由现金流 fcff1 = self.operating_cash_flow - self.capital_expenditure # 计算简化自由现金流的环比增长率 fcff1_qoq = fcff1 / fcff1.shift(1) # 计算简化自由现金流的标准差与均值的比值 fcff1_std = fcff1.rolling(window=8).std() / fcff1.rolling(window=8).mean() # 计算简化自由现金流环比增长率的标准差 fcff1_qoq_std = fcff1_qoq / fcff1_qoq.rolling(window=8).std() # 将计算的因子存储在一个字典中 self.factor = { "fcff1_qoq": fcff1_qoq, "fcff1_std": fcff1_std, "fcff1_qoq_std": fcff1_qoq_std } def _postprocess(self): """ 后处理因子,保存因子。 param data: 数据,pandas.DataFrame格式。 return: 无。 """ # 将量价因子的结果保存为对应的pkl文件 for key, value in self.factor.items(): pd.to_pickle(value, os.path.join(self.directory, f"{key}.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)] # 示例: 生成经营性现金流量净额数据 operating_cash_flow_data = np.random.randn(100, 10) operating_cash_flow_data = pd.DataFrame(operating_cash_flow_data, index=dates, columns=stocks) operating_cash_flow_data.to_pickle("data/operating_cash_flow.pkl") # 示例: 生成购建固定无形和长期资产支付的现金数据 capital_expenditure_data = np.random.randn(100, 10) capital_expenditure_data = pd.DataFrame(capital_expenditure_data, index=dates, columns=stocks) capital_expenditure_data.to_pickle("data/capital_expenditure.pkl") # 计算因子 factor = Factor(data_path="data/", directory="factor/") factor.run()
因子2代码下载: Download
因子3代码已完成:
# -*- 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 = "tax_related_factor" # 读取数据(数据格式为pkl文件) self.tax_data = pd.read_pickle(data_path + "tax_data.pkl") # 因子存储文件夹路径 self.directory = directory os.makedirs(self.directory, exist_ok=True) def _preprocess(self): """ 预处理数据,对数据进行清洗、过滤等操作。 return : """ # 去除缺失值 self.tax_data = self.tax_data.dropna() def _generate(self): """ 生成因子 return : """ # 计算税金及附加环比增长率 self.tax_data['ot_qoq'] = self.tax_data.pct_change() # 计算过去8个季度税金及附加标准差与均值的比值 self.tax_data['ot_std'] = self.tax_data.rolling(window=8).std() / self.tax_data.rolling(window=8).mean() # 计算税金及附加环比增长率的标准差 self.tax_data['ot_qoq_std'] = self.tax_data['ot_qoq'] / self.tax_data['ot_qoq'].rolling(window=8).std() # 将生成的因子存储到类属性中 self.factor = self.tax_data 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) companies = [f"company_{i}" for i in range(10)] # 示例: 生成税金及附加数据 data = np.random.randn(100, 10) data = pd.DataFrame(data, index=dates, columns=companies) data.to_pickle("data/tax_data.pkl") # 计算因子 factor = Factor(data_path="data/", directory="factor/") factor.run()
因子3代码下载: Download