人工智能选股之Python实战05

0
回复
7986
查看
[复制链接]

53

主题

8

回帖

836

积分

管理员

积分
836
来源: 2019-12-8 22:08:53 显示全部楼层 |阅读模式
数据读取
本模块的主体是一段 for 循环。作用为将 csv 表格中的数据按月份顺序逐个导入内存,剔 除空值,并做标记取前后部分样本,再将所有月份的数据拼接形成一个大的 DataFrame, 作为最终的样本内数据集。
代码实例

image.jpg[size=1em]561x528 75.3 KB


代码分析
for i_month in para.month_in_sample:
和大部分编程语言一样,Python 中的 for 用来开启循环操作。for 循环的主体以缩进的形式表示。在本例中,i_month 作为循环变量,循环范围为 para 类中的 month_in_sample 列表,即样本内数据集的月份编号,从 82 到 153。
file_name = para.path_data + str(i_month) + ‘.csv’
使用 str 函数将迭代变量的数值转为字符类型,与扩展名’.csv’和 para 类中的 path_data 进 行字符串拼接,得到需要读取的 csv 文件完整路径,赋予 file_name。
data_curr_month = pd.read_csv(file_name, header=0)
使用 pandas 中的 read_csv 函数读取 csv 文件的全部内容,赋予变量 data_curr_month。 其中参数 header=0 的意义是将 csv 文件的第一行作为 DataFrame 的列名。
para.n_stock = data_curr_month.shape[0]
使用 DataFrame 的 shape 方法得到数据集的行数和列数,索引[0]取其第一个值行数,即 股票数,将该数值赋予 para 类的变量 n_stock。
data_curr_month = data_curr_month.dropna(axis=0)
同前一部分所述,使用 dropna(axis=0) 删除缺失值 nan 元 素 所 在 的行 ,确保 data_curr_month 不含缺失值。
data_curr_month = label_data(data_curr_month)
调用之前定义的label_data函数。取data_curr_month矩阵中排名前后各一定比例的股票, 分别标记为 1 和 0。将 label_data 函数处理后的新 DataFrame 替换原 DataFrame。
if i_month == para.month_in_sample[0]: data_in_sample = data_curr_month 使用 if-else 语句进行判断,同样使用缩进的形式表示 if-else 的主体。month_in_sample[0] 表示样本内集合第一个月的编号。If 命令判断当前程序是否为循环中的第一次迭代,是则 新建一个变量 data_in_sample 保存已标记的 data_curr_month。
else: data_in_sample = data_in_sample.append(data_curr_month) 若当前迭代不是循环中的第一次迭代,则将已标记的 data_curr_month 拼接在 data_in_sample 后,得到新的样本内集合。
数据预处理
本模块将样本内集合切分成训练集和交叉验证集,并通过主成分分析进行降维以及去除因 子共线性。最后得到四个数组,其中 X_train 与 y_train 为训练集的特征和标签,X_cv 与 y_cv 为交叉验证集的特征和标签。
代码实例

image.jpg[size=1em]744x467 70 KB


代码分析
X_in_sample = data_in_sample.loc[:, ‘EP’:‘bias’]
本例 SVM 模型的特征为 70 个因子,其中第一列为 EP 因子,最后一列为 bias 因子。我 们使用 loc 函数切取样本内集合从 EP 列到 bias 列的数据作为特征 X。
y_in_sample = data_in_sample.loc[:, ‘return_bin’]
取 DataFrame 中的 return_bin 列作为样本内集合的标签 y。
from sklearn.model_selection import train_test_split
使用 from 导入 sklearn 包中的 train_test_split 函数,该函数将样本内集合随机切分为训练 集和交叉验证集。通常的编程习惯是将模块导入语句放在整个代码的开头部分。此处为了 便于读者理解,将这句命令置于执行相应功能的代码块中。
X_train, X_cv, y_train, y_cv = train_test_split(X_in_sample, y_in_sample, test_size=para.percent_cv, random_state=para.seed)
使用 train_test_split 函数进行数据切分。函数的输入为样本内集合的特征 X 和标签 y;调 用 para 类中的 percent_cv(交叉验证集占样本内集合的比例)赋给函数下参数 test_size; 调用 para 类中的 seed(随机数种子)赋给参数 random_state。该函数按照我们设置的交 叉验证比例随机将特征 X 与标签 y 切分为训练集和交叉验证集两部分。设置随机数种子的 目的是我们希望每次随机切分的结果完全相同,从而保证实验结果可重复。如果无需回溯 比对,也可以不设置种子值。
from sklearn import decomposition
使用 from 从 sklearn 包中导入 decomposition 函数,该函数提供主成份分析(PCA)功能。
pca = decomposition.PCA(n_components=0.95)
使用 decomposition.PCA 函数,将主成分分析的模型赋予模型对象 pca。参数 n_components 可以取 0 到 1 之间的浮点数或者大于等于 1 的整数。当 n_components 为 0 到 1 之间的浮点数时,PCA 模型取相应比例的主成分数量,例如 0.95 代表取累计方差 贡献率大于等于 95%的主成分。当 n_components 为正整数时,PCA 模型取相应数目的 主成分。
pca.fit(X_train)
使用 pca.fit 对训练集的特征 X_train 拟合主成分分析模型。
X_train = pca.transform(X_train) X_cv = pca.transform(X_cv)
使用上一步训练好的 pca 模型,对训练集特征 X_train 和交叉验证集特征 X_cv 进行主成 份分析转换。使用函数 transform 完成该操作,并将降维后的数组替换原数组。
其余变式
特别地,当机器学习模型为回归模型时,通常不使用分类标签作为模型的 y,而是以收益 率本身作为 y,因此我们直接将样本内数据集的 return 列设为 y。特征 X 的取法不变。
本例所使用的 csv 文件已事先经过多项预处理,所以不需要在程序中做额外的数据预处理 操作。若需要在程序内部进行数据预处理,可以使用 sklearn 包中的 preprocessing 函数。 上面的代码展示了对数据进行标准化的过程,将原数据转换为均值为 0,标准差为 1 的新数据。

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 免费注册
关注微信