由于大创项目的需要,在尝试构建一个评分体系,并且使用该评分体系对企业进行评分,最后利用该评分对股票收益率进行预测。在一个指标体系中,需要确定指标的构成和各指标之间的权重。
而这个代码则是尝试着使用LASSO回归的方式确认一个指标体系中各项指标的权重。即通过将上一年的股票收益率对上一年的指标数据进行回归,得到每个指标的系数,再利用该系数作为一个类似权重的方式对当年企业表现进行评分。
代码内容涉及:
- LASSO算法及变量回归系数返回
- 利用LASSOCV确认lambda
- dataframe对面板数据的读写
# -*- coding: utf-8 -*-
"""
Created on Mon Aug 8 13:59:12 2022
@author: liangshanliao
"""
import pandas as pd
import numpy as np
from sklearn.linear_model import Lasso,LassoCV
from sklearn.metrics import mean_squared_error,r2_score
#读入数据(代码实现时记得要修改成自己电脑上对应的文件路径)
data_all=pd.read_excel(r'D:\桌面\大创小组\代码算法\data\ESG.xlsx')
#填补数据中的空值
data_all=data_all.fillna(0)
#输入起始年和终止年
f_year=2010
l_year=2020
#生成年份列表
#预先创建dataframe对数据进行保存
result =pd.DataFrame(columns=('name','year','value'))
#使用循环结构计算年份列表内所有年份数据
for year in list(range(f_year,l_year)):
#提取对应年份的数据
data=data_all.loc[data_all['年份'] == year]
#去除名称和股票代码和年份
data=data.drop(labels=["code","name","年份"],axis=1)
#拆分为训练集和测试集
predictors=data.columns[1:-1]
#print(predictors)
x=data[predictors]
y=data['年收益率']
#构造不同的lambda值
Lambdas=np.logspace(-5,2,200)
#设置交叉验证的参数,使用均方误差评估
lasso_cv=LassoCV(alphas=Lambdas,normalize=True,cv=10,max_iter=10000)
lasso_cv.fit(x,y)
#基于最佳lambda值建模(或者改为手动确认的值也可以)
lasso=Lasso(alpha=lasso_cv.alpha_,normalize=True,max_iter=10000)
#lasso=Lasso(alpha=0.001,normalize=True,max_iter=10000)
lasso.fit(x,y)
#模型评估
lasso_pred=lasso.predict(x)
#均方误差与决定系数
MSE=mean_squared_error(y,lasso_pred)
R2=r2_score(y,lasso_pred)
#输出回归系数与均方误差等模型评估结果
print(str(year)+"年数据如下:")
print(pd.Series(index=['Intercept']+x.columns.tolist(),
data=[lasso.intercept_]+lasso.coef_.tolist()))
print("MSE: "+str(MSE))
print("R2: "+str(R2))
print("lasso_cv.alpha: "+str(lasso_cv.alpha_))
#将结果写入dataframe,方便后续保存
result_year=[year]*38
result=result.append(pd.DataFrame({'year':result_year,'name':x.columns.tolist(),'value':lasso.coef_.tolist()}),ignore_index=True)
#写入文档(注意设置合适的保存路径)
result.to_excel(r'D:\桌面\大创小组\代码算法\data\Result_lamda.xlsx')