金融科技之数据分析:地产股票因子分析

Kamiisa ·
更新时间:2024-11-13
· 998 次阅读

地产股票因子分析 1.课题简介

实习公司和几家地产龙头客户都有合作,希望能通过分析他们的财务数据,来对股价有个分析或者说预测。

图片

2.代码实现

import相关的包

import pandas as pd from sklearn.linear_model import LinearRegression from xgboost import XGBRegressor from xgboost import plot_importance import matplotlib.pyplot as plt import lightgbm as lgb from scipy.stats import pearsonr import numpy as np from sklearn import preprocessing

读取数据与预处理

#min-max规范化方法 min_max_scaler = preprocessing.MinMaxScaler() #读取第一个公司的数据 df=pd.read_excel('地产股.xlsx',sheet_name=0) y=df['股价'].values x=df.drop(['日期','股价'], axis=1) headers=x.columns#这里存储因子的名字,方便结果展示 x=x.values #规范化处理,映射到【0,1】 x=min_max_scaler.fit_transform(x) y=min_max_scaler.fit_transform(np.array([y]).T) #读取其他四个公司的数据,进行标准化处理,并将数据合并在一起 for i in range(1,5): df=pd.read_excel('地产股.xlsx',sheet_name=i) tempy=df['股价'].values tempx=df.drop(['日期','股价'], axis=1) tempx=tempx.values tempx = min_max_scaler.fit_transform(tempx) tempy=min_max_scaler.fit_transform(np.array([tempy]).T) x=np.vstack((x,tempx))#将数据合并 y=np.vstack((y,tempy))

注:这里是将各个公司的数据分别进行标准化处理之后再合并,因为考虑到不同公司的股价的区间不一致,这可能是由上市公司发放股票的策略决定的。而不同公司的股票的价差不是我们关注的重点,我们关注的是股票纵向变化的规律。将各个公司分别标准化可以消除公司间的一些差异。

线性回归版本

线性回归模型各因子的系数可以反映各因子的重要性

regr_ = LinearRegression().fit(x, y)#训练模型 coef_=regr_.coef_[0]#系数 lr_res=[(headers[i],coef_[i]) for i in range(len(coef_))] lr_res=sorted(lr_res,key=lambda x:x[1],reverse=True)#排序 header=[header for header,coef in lr_res] coef=[coef for header,coef in lr_res] lr_res=pd.DataFrame({'factor':header,'coef':coef})

结果:

factor coef
总资产报酬率 0.842764767
总市值(万元) 0.448989966
每股营业收入 0.354270929
PE 0.266525706
市净率PB 0.192295946
每股收益增速% 0.104891241
长期资产负债率 0.092473499
近12个月股息率 0.048185849
市现率 0.041146731
每股净经营现金流净额 0.039554912
资产负债率 0.014880207
销售净利率 -0.023532551
权益乘数 -0.046475972
每股息税前利润 -0.074944096
每股收益EPS -0.08202864
投入资本回报率ROIC -0.110803053
归属于母公司利润增速(扣除非经常性损益) -0.176884016
净资产收益率ROE -0.211790641
市销率PS -0.248624017
存货周转率 -0.555995589

pearsonr相关性系数版本

corr_res=[] for i in range(len(headers)): corr,p=pearsonr(x[:,i],y.ravel())#获取相关性和p-value corr_res.append((headers[i],corr,p)) corr_res=sorted(corr_res,key=lambda x:x[1],reverse=True)#排序 header=[header for header,corr,p in corr_res] corr=[corr for header,corr,p in corr_res] p=[p for header,corr,p in corr_res] corr_res=pd.DataFrame({'factor':header,'corr':corr,'p_value':p})

结果:

factor corr p_value
总市值(万元) 0.744397542 1.0249E-245
每股营业收入 0.600173815 8.7595E-137
每股收益EPS 0.513859816 1.62518E-94
权益乘数 0.504026043 1.95423E-90
市净率PB 0.487645622 6.28211E-84
资产负债率 0.478420179 2.04251E-80
长期资产负债率 0.428756079 2.96606E-63
每股息税前利润 0.353733849 3.08641E-42
市销率PS 0.319607724 2.2237E-34
近12个月股息率 0.25933871 8.46324E-23
净资产收益率ROE 0.249068466 4.23874E-21
投入资本回报率ROIC 0.220798206 8.2545E-17
销售净利率 0.203669717 1.76032E-14
总资产报酬率 0.199825776 5.50691E-14
PE 0.182179083 7.73554E-12
每股净经营现金流净额 0.139141612 1.90617E-07
每股收益增速% 0.110584575 3.59838E-05
存货周转率 0.077161548 0.003995772
市现率 0.006789981 0.800326919
归属于母公司利润增速(扣除非经常性损益) -0.012468487 0.642319104

XGBRegressor模型

model = XGBRegressor(importance_type='weight') model.fit(x, y.ravel())#训练模型 importances_=model.feature_importances_#获取因子重要性 xgb_res=[(i,headers[i],importances_[i]) for i in range(len(model.feature_importances_))] xgb_res=sorted(xgb_res,key=lambda x:x[2],reverse=True)#排序 index=[index for index,header,importance in xgb_res] header=[header for index,header,importance in xgb_res] importances=[importance for index,header,importance in xgb_res] xgb_res=pd.DataFrame({'index':index,'factor':header,'importance':importances})#转换成dataframe plt.figure(figsize=(12,6))#画图 plot_importance(model, max_num_features=8) plt.title("XGB") plt.show() print(xgb_res)

结果:

图片

index即为上方图片中的序号

index factor importance
0 总市值(万元) 0.295882344
1 PE 0.146764711
2 市净率PB 0.113529414
5 近12个月股息率 0.107058823
4 市现率 0.104117647
3 市销率PS 0.084411763
7 每股净经营现金流净额 0.01764706
8 每股营业收入 0.014705882
6 每股收益EPS 0.013529412
9 每股息税前利润 0.013529412
12 销售净利率 0.012058823
14 长期资产负债率 0.012058823
18 每股收益增速% 0.011764706
13 资产负债率 0.010882352
17 投入资本回报率ROIC 0.009705883
10 净资产收益率ROE 0.008529412
16 存货周转率 0.006764706
19 归属于母公司利润增速(扣除非经常性损益) 0.006176471
11 总资产报酬率 0.005588235
15 权益乘数 0.005294118

LGBMRegressor模型

gbm = lgb.LGBMRegressor(objective='regression') gbm.fit(x, y.ravel()) importances_=gbm.feature_importances_ gbm_res=[(i,headers[i],importances_[i]) for i in range(len(importances_))] gbm_res=sorted(gbm_res,key=lambda x:x[2],reverse=True)#排序 index=[index for index,header,importance in gbm_res] header=[header for index,header,importance in gbm_res] importances=[importance for index,header,importance in gbm_res] gbm_res=pd.DataFrame({'index':index,'factor':header,'importance':importances}) lgb.plot_importance(gbm, max_num_features=20) plt.title("GBM") plt.show()

结果:

图片

index factor importance
0 总市值(万元) 561
5 近12个月股息率 428
2 市净率PB 318
1 PE 310
4 市现率 291
3 市销率PS 288
8 每股营业收入 101
6 每股收益EPS 84
14 长期资产负债率 84
7 每股净经营现金流净额 68
17 投入资本回报率ROIC 68
13 资产负债率 59
12 销售净利率 58
9 每股息税前利润 57
18 每股收益增速% 50
11 总资产报酬率 39
19 归属于母公司利润增速(扣除非经常性损益) 39
10 净资产收益率ROE 38
15 权益乘数 32
16 存货周转率 27

保存结果到excel中

with pd.ExcelWriter('res.xlsx') as writer: corr_res.to_excel(writer, 'corr_res', index=False) lr_res.to_excel(writer, 'lr_res', index=False) xgb_res.to_excel(writer,'xgb_res',index=False) gbm_res.to_excel(writer,'gbm_res',index=False) cjh_hit 原创文章 8获赞 14访问量 1543 关注 私信 关注博主即可阅读全文
作者:cjh_hit



因子分析 金融科技 数据 金融 数据分析 股票 科技

需要 登录 后方可回复, 如果你还没有账号请 注册新账号