实习公司和几家地产龙头客户都有合作,希望能通过分析他们的财务数据,来对股价有个分析或者说预测。
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
关注
私信
关注博主即可阅读全文