LASSO算法确定指标权重的一次实践(python dataframe数据结构处理与数据读写 sklearn)

由于大创项目的需要,在尝试构建一个评分体系,并且使用该评分体系对企业进行评分,最后利用该评分对股票收益率进行预测。在一个指标体系中,需要确定指标的构成和各指标之间的权重。

而这个代码则是尝试着使用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')

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值