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

地产股票因子分析

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)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章