




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
2025年Python金融风控试卷:量化分析与模型构建实战考试时间:______分钟总分:______分姓名:______注意事项:1.请仔细阅读每一道题,确保理解题意。2.本试卷所有计算均需使用Python语言及相关库(如Pandas,NumPy,Scikit-learn,Statsmodels等)完成,并展示关键代码和结果。3.请将所有代码和输出结果整合在答题纸上,并清晰呈现分析过程和结论。---第一题假设你获得了一份包含以下字段的信贷历史数据集(已预处理):*`Loan_ID`:贷款唯一标识符*`Gender`:客户性别*`Marital_Status`:婚姻状况*`Education`:教育水平*`Occupation`:职业*`Income`:年收入*`Loan_Amount`:贷款金额*`Credit_History`:信用历史评分(0-1,1为良好)*`Default`:是否违约(1为违约,0为未违约)请完成以下任务:1.使用Pandas读取该数据集(假设数据已存储为CSV文件`credit_data.csv`)。2.对数据进行探索性分析,包括:*查看数据集的基本信息(行数、列数、数据类型等)。*计算关键数值型特征(如`Income`,`Loan_Amount`)的描述性统计量(均值、中位数、标准差、最小值、最大值)。*计算二元分类特征`Default`的占比。*分析`Credit_History`与`Default`之间的关系(例如,绘制关系图或计算交叉表,描述信用良好与违约的关联性)。*分析`Income`的分布情况,并绘制直方图。3.进行数据预处理:*处理数据中的缺失值(如有)。*将分类特征`Gender`,`Marital_Status`,`Education`,`Occupation`转换为数值型特征(至少选择一种编码方式,如独热编码或标签编码,并说明理由)。*对数值型特征`Income`和`Loan_Amount`进行标准化处理。4.提取并简要说明至少两个你认为可能对`Default`预测有帮助的特征。---第二题继续使用第一题处理后的数据集。1.假设我们首先要构建一个简单的信用违约预测模型,目标是将违约客户识别出来。请选择一个合适的分类算法(如逻辑回归、决策树),使用Scikit-learn构建该模型。2.将数据集随机划分为训练集(80%)和测试集(20%),确保划分是可重复的(设置随机种子)。3.使用训练集训练所选分类模型。4.在测试集上评估模型性能,计算并报告以下指标:准确率(Accuracy)、精确率(Precision)、召回率(Recall)和F1分数。5.请根据上述指标,简要评价该模型在当前数据上的表现,并说明该表现可能意味着什么(例如,对于风控业务来说,高精确率或高召回率哪个更重要?为什么?)。6.计算并绘制混淆矩阵,进一步可视化模型的分类结果。---第三题在前两题的基础上,进行模型优化和深入分析。1.使用`GridSearchCV`或`RandomizedSearchCV`对之前选择的分类模型进行超参数调优,尝试至少两个关键超参数。报告最佳参数组合和对应的模型评估指标(在测试集上)。2.比较优化前后的模型性能,分析超参数调优对模型效果的影响。3.计算并解释模型对重要特征(至少选择两个在第一题或第二题中识别出的特征)的系数或特征重要性,尝试解释模型做出预测的依据。4.假设银行希望将模型应用于实际信贷审批,但要求违约客户的识别率(Recall)不低于80%。请根据当前模型(优化后),评估是否满足该要求。如果不满足,请提出至少一种可能的解决方案(例如,调整分类阈值、收集更多数据、选择其他模型等),并简要说明其思路。---第四题考虑一个市场风险场景:你获得了一份股票日收益率数据(`StockReturns.csv`),包含多支股票在一段时间内的日收益率。1.使用Pandas读取该数据集。2.计算每支股票的日收益率的标准差,并将其视为该股票的波动率。3.计算任意两支选定股票收益率之间的日收益率相关性。4.假设我们要构建一个投资组合,包含这两支股票,并希望投资组合的波动率最小化。请计算在等权重(各投资50%)的情况下,该投资组合的预期日收益率和波动率。5.接下来,我们希望使用GARCH模型来估计某支股票(例如,选择收益率数据中标准差最大的股票)的条件波动率。请使用Statsmodels库拟合一个GARCH(1,1)模型,并简要描述模型的结果(例如,参数估计值、模型的拟合优度等)。基于模型结果,讨论该股票波动率的一些特性。---试卷答案第一题1.代码示例:```pythonimportpandasaspd#1.读取数据df=pd.read_csv('credit_data.csv')#2.探索性分析#a.基本信息查看print("基本信息:")print(())#b.数值型特征描述性统计print("\n数值型特征描述性统计:")numeric_stats=df[['Income','Loan_Amount']].describe()print(numeric_stats)#c.Default占比default_ratio=df['Default'].mean()print(f"\nDefault占比(违约率):{default_ratio:.4f}")#d.Credit_History与Default关系#方法一:交叉表print("\nCredit_History与Default交叉表:")print(pd.crosstab(df['Credit_History'],df['Default']))#方法二:绘图(示例,无需实际绘制)#importseabornassns#importmatplotlib.pyplotasplt#sns.barplot(x='Credit_History',y='Default',data=df)#plt.title('DefaultRatebyCreditHistory')#plt.show()#描述:信用历史评分高(1)的客户违约率显著低于信用历史评分低(0)的客户。#e.Income分布直方图(示例,无需实际绘制)#plt.figure(figsize=(10,6))#sns.histplot(df['Income'].dropna(),kde=True)#plt.title('IncomeDistribution')#plt.xlabel('Income')#plt.ylabel('Frequency')#plt.show()#3.数据预处理#a.缺失值处理(假设示例,需根据实际数据判断)#ifdf.isnull().any().any():##例如,填充数值型特征均值,分类特征众数#df['Income'].fillna(df['Income'].mean(),inplace=True)#forcolin['Gender','Marital_Status','Education','Occupation']:#df[col].fillna(df[col].mode()[0],inplace=True)#b.分类特征编码(示例:独热编码)#features_to_encode=['Gender','Marital_Status','Education','Occupation']#df_encoded=pd.get_dummies(df,columns=features_to_encode,drop_first=True)##或者标签编码(适用于某类别有层级关系或类别较少时)##fromsklearn.preprocessingimportLabelEncoder##le=LabelEncoder()##df['Gender_encoded']=le.fit_transform(df['Gender'])##...对其他分类特征进行编码#c.数值型特征标准化(使用StandardScaler)#fromsklearn.preprocessingimportStandardScaler#scaler=StandardScaler()#df_encoded[['Income_scaled','Loan_Amount_scaled']]=scaler.fit_transform(df_encoded[['Income','Loan_Amount']])#4.特征选择(示例)#特征1:Credit_History(信用历史与违约强相关)#特征2:Income_scaled(收入水平可能影响还款能力)```2.解析思路:*读取数据:使用Pandas的`read_csv`函数加载CSV数据到DataFrame。*探索性分析:*`info()`函数提供数据概览,包括非空值数量和数据类型。*`describe()`函数对数值列进行统计汇总。*`mean()`函数计算二元目标变量`Default`的比例,即违约率。*`crosstab()`函数或分组聚合计算`Credit_History`不同取值下`Default`的分布,用于分析两者关系。绘制条形图可更直观地比较不同信用历史组的违约率。*`histplot()`函数绘制`Income`的分布图,观察其形状、中心趋势和离散程度。*数据预处理:*缺失值处理:根据特征类型选择合适的填充策略(均值、中位数、众数)或删除。*分类特征编码:将分类变量转换为模型可处理的数值形式。独热编码适用于无序分类,标签编码适用于有序或类别较少的情况。`drop_first=True`防止虚拟变量陷阱。*特征标准化:使用`StandardScaler`将数值特征缩放到均值为0,标准差为1的区间,消除量纲影响,有助于模型收敛和比较。*特征选择:基于探索性分析结果,选择与目标变量`Default`相关性较高或理论上重要的特征。`Credit_History`通常是信用风险的核心特征,`Income`与还款能力直接相关。---第二题1.代码示例:```pythonimportpandasaspdfromsklearn.model_selectionimporttrain_test_splitfromsklearn.linear_modelimportLogisticRegressionfromsklearn.metricsimportaccuracy_score,precision_score,recall_score,f1_score,confusion_matrixfromsklearn.preprocessingimportStandardScaler#确保已对特征进行标准化#假设df_encoded是第一题预处理后的数据#选择特征和目标变量features=['Credit_History','Income_scaled','Loan_Amount_scaled']#示例特征X=df_encoded[features]y=df_encoded['Default']#1.选择模型(逻辑回归)model=LogisticRegression(random_state=42)#2.划分数据集X_train,X_test,y_train,y_test=train_test_split(X,y,test_size=0.2,random_state=42,stratify=y)#3.训练模型model.fit(X_train,y_train)#4.预测与评估y_pred=model.predict(X_test)accuracy=accuracy_score(y_test,y_pred)precision=precision_score(y_test,y_pred)recall=recall_score(y_test,y_pred)f1=f1_score(y_test,y_pred)#打印评估指标print(f"Accuracy:{accuracy:.4f}")print(f"Precision:{precision:.4f}")print(f"Recall:{recall:.4f}")print(f"F1Score:{f1:.4f}")#5.模型评价思路(文字描述)#分析:...(见下方解析)#6.混淆矩阵cm=confusion_matrix(y_test,y_pred)print("\nConfusionMatrix:")print(cm)#可视化(示例)#importseabornassns#importmatplotlib.pyplotasplt#sns.heatmap(cm,annot=True,fmt='d',cmap='Blues',xticklabels=['NotDefault','Default'],yticklabels=['NotDefault','Default'])#plt.xlabel('Predicted')#plt.ylabel('Actual')#plt.title('ConfusionMatrix')#plt.show()```2.解析思路:*选择模型:逻辑回归是处理二分类问题的常用且interpretable的基准模型。*划分数据集:使用`train_test_split`将数据分为训练集和测试集,以便用未见数据评估模型性能。设置`random_state`保证结果可重复。`stratify=y`确保训练集和测试集中目标变量的比例与原始数据一致,特别适用于类别不平衡的数据。*训练模型:将训练集特征`X_train`和目标`y_train`输入到逻辑回归模型中,调用`fit`方法进行训练。*预测与评估:*使用训练好的模型对测试集特征`X_test`进行预测,得到预测结果`y_pred`。*计算评估指标:*准确率(Accuracy):(TruePositives+TrueNegatives)/TotalSamples。衡量模型总体预测正确的比例。*精确率(Precision):TruePositives/(TruePositives+FalsePositives)。衡量预测为正类的样本中,实际为正类的比例。高精确率意味着较少将负类误判为正类(假阳性少)。*召回率(Recall):TruePositives/(TruePositives+FalseNegatives)。衡量实际为正类的样本中,被模型正确预测为正类的比例。高召回率意味着较少将正类误判为负类(假阴性少)。*F1分数(F1Score):2*(Precision*Recall)/(Precision+Recall)。精确率和召回率的调和平均,综合反映模型性能,特别适用于类别不平衡场景。*模型评价:*分析各项指标值。例如,如果Recall很高但Precision很低,说明模型抓准了大部分违约客户,但同时也把很多未违约客户误判为违约。反之亦然。需要结合业务目标(是更看重发现违约客户还是保证预测的准确性)来评价模型。*混淆矩阵提供了更详细的分类结果:[TN,FP;FN,TP],可以直观看到各类错误(假阳性和假阴性)的数量,进一步辅助评价。*特征选择:在第二题中继续使用第一题筛选的特征,或在训练模型前进一步进行特征工程。---第三题1.代码示例:```pythonfromsklearn.model_selectionimportGridSearchCVfromsklearn.ensembleimportRandomForestClassifier#示例:尝试随机森林#或者继续使用LogisticRegression,但增加参数#假设X,y已定义并标准化#1.划分训练集测试集(再次划分或使用上一题的split)#X_train,X_test,y_train,y_test=train_test_split(X,y,test_size=0.2,random_state=42,stratify=y)#2.选择模型和超参数网格(以RandomForest为例)model_to_tune=RandomForestClassifier(random_state=42)param_grid={'n_estimators':[100,200],#树的数量'max_depth':[None,10,20],#树的最大深度'min_samples_split':[2,5]#内部节点分裂所需最小样本数}#3.GridSearchCVgrid_search=GridSearchCV(estimator=model_to_tune,param_grid=param_grid,cv=5,scoring='recall',n_jobs=-1)#使用召回率作为评分标准grid_search.fit(X_train,y_train)#4.报告最佳参数和模型性能best_params=grid_search.best_params_best_model=grid_search.best_estimator_print(f"最佳参数:{best_params}")#在测试集上评估最佳模型y_pred_optimized=best_model.predict(X_test)accuracy_opt=accuracy_score(y_test,y_pred_optimized)precision_opt=precision_score(y_test,y_pred_optimized)recall_opt=recall_score(y_test,y_pred_optimized)f1_opt=f1_score(y_test,y_pred_optimized)print(f"\n优化后模型在测试集上的性能:")print(f"Accuracy:{accuracy_opt:.4f}")print(f"Precision:{precision_opt:.4f}")print(f"Recall:{recall_opt:.4f}")print(f"F1Score:{f1_opt:.4f}")#5.性能比较分析思路(文字描述)#分析:...(见下方解析)#6.特征重要性(以RandomForest为例)#ifhasattr(best_model,'feature_importances_'):#importances=best_model.feature_importances_#feature_names=features#之前定义的特征名#importance_df=pd.DataFrame({'Feature':feature_names,'Importance':importances})#importance_df=importance_df.sort_values(by='Importance',ascending=False)#print("\n特征重要性:")#print(importance_df)#7.Recall评估与解决方案思路(文字描述)#分析:...(见下方解析)```2.解析思路:*选择模型和超参数网格:选择一个复杂的模型(如随机森林)或对现有模型(如逻辑回归)增加超参数进行调优。定义一个包含不同超参数取值的网格`param_grid`。*GridSearchCV:*`GridSearchCV`会遍历`param_grid`中的所有参数组合。*使用交叉验证(`cv=5`)在每一组参数上评估模型性能。*`scoring='recall'`指定使用召回率作为评估和选择最佳参数的标准。*`n_jobs=-1`利用所有CPU核心加速计算。*`fit`方法执行超参数搜索和模型训练。*报告结果:`best_params_`属性给出最佳参数组合,`best_estimator_`属性给出使用最佳参数训练的模型。*评估优化后模型:使用测试集(从未参与训练和调优)评估最佳模型的各项性能指标,判断调优效果。*性能比较分析:对比优化前后的模型性能指标(特别是Recall是否达到要求)。分析调优对模型在测试集上的准确率、精确率、召回率和F1分数的具体影响,判断调优是否带来了期望的改进,或者是否有过拟合风险(训练集性能提升显著,但测试集性能提升不大)。*特征重要性:对于像随机森林这样的模型,`feature_importances_`属性可以提供各特征对模型预测贡献度的量化评估。根据重要性排序,可以了解模型决策的关键因素,并可能用于进一步的特征选择或业务解释。*Recall评估与解决方案:*根据优化后模型在测试集上的Recall值,判断是否满足业务要求(Recall>=80%)。*如果不满足:*调整阈值:对于分类模型,默认通常是0.5的预测阈值。可以尝试降低阈值(将更多预测为正类),以提升召回率,但可能会牺牲精确率。*选择其他模型:尝试对不平衡数据更友好的模型,如XGBoost、LightGBM、SMOTE过采样后的模型等。*收集更多数据:更全面、更多样化的数据可能有助于模型学习区分更困难的样本。*特征工程:构建更能区分正负类的特征。*业务规则结合:将模型结果与业务规则(如客户关系价值、欺诈模式特征)结合进行最终决策。---第四题1.代码示例:```pythonimportpandasaspdimportnumpyasnpfromstatsmodels.tsa.apiimportarch_model#1.读取数据df_returns=pd.read_csv('StockReturns.csv',index_col=0)#假设第一列是股票代码,第二列是日期,其余是收益率#2.计算波动率(标准差)volatility=df_returns.std()print("各股票波动率(日收益率标准差):")print(volatility)#3.计算相关性(示例:股票1与股票2)stock1='Stock_Return_1'stock2='Stock_Return_2'#假设有这两支股票列correlation=df_returns[stock1].corr(df_returns[stock2])print(f"\n{stock1}与{stock2}的日收益率相关性:{correlation:.4f}")#4.计算等权重投资组合预期收益率和波动率expected_return=df_returns.mean().mean()#假设数据为日收益率,直接求均值再求均值近似年化portfolio_weights=np.array([0.5,0.5])#等权重portfolio_return=np.dot(portfolio_weights,df_returns.mean())#近似年化组合收益率covariance_matrix=df_returns.cov()portfolio_volatility=np.sqrt(np.dot(portfolio_weights.T,np.dot(covariance_matrix,portfolio_weights)))print(f"\n等权重投资组合近似年化预期收益率:{portfolio_return:.4f}")print(f"等权重投资组合近似年化波动率:{portfolio_volatility:.4f}")#5.拟合GARCH(1,1)模型(示例:对波动率最大的股票)stock_max_vol=volatility.idxmax()print(f"\n拟合GARCH(1,1)模型于波动率最大的股票:{stock_max_vol}")#使用GARCH(1,1)模型,均值方程使用AR(1)garch_model=arch_model(df_returns[stock_max_vol],vol='Garch',p=1,q=1,dist='Normal',mean='AR',ar_order=1)garch_results=garch_model.fit(disp='off')#disp='off'减少输出信息#打印关键结果print("\nGARCH(1,1)模型结果摘要:")print(garch_results.summary())#讨论波动率特性(示例)#print("\n模型参数解释:")#print("alpha_0(常数项):波动率的基线水平")#print("alpha_1(ARCH项):过去收益率平方对当前波动率的影响")#print("beta_1(GARCH项):过去波动率对当前波动率的影响")#print("gamma_1(均值方程AR系数):过去收益率对当前收益率的影响")##基于参数估计值讨论:##ifgarch_results.params['alpha_1']>0andgarch_results.params['beta_1']>0:##print("模型显示波动率具有集聚效应(GARCH效应)。")##ifgarch_results.params['beta_1']>garch_results.params['alpha_1']:##print("过去波动率对当前波动率的影响大于过去收益率平方的影
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 幼儿园篮球普及课合作协议7篇
- 维修钳工试题库及答案
- 2025-2030工业机器人行业市场调研及产业链投资机会分析报告
- 2025-2030工业机器人应用场景拓展与制造业转型升级关联性研究报告
- 2025-2030工业机器人产业供需结构及未来投资布局战略分析报告
- 2025-2030工业废水零排放处理技术经济可行性报告
- 2025-2030工业废水处理技术升级需求与设备更新周期分析报告
- 2025-2030工业大数据应用与智能制造决策优化研究报告
- 疫情留校申请书500
- 上大专申请书
- 2025年护士资格证真题附答案详解
- 《泌尿系统感染:2025EAU指南》解读
- 2025至2030年中国保障房建设行业市场发展现状及投资方向研究报告
- 《无机化学》第六版 课件 第5章 原子结构与元素周期律
- 美的面包机使用说明书
- 公司内部人员诊断
- 20kV及以下配电网建设项目扩大工程量清单(2025年版)
- 2025-2030年N-甲基苯胺项目投资价值分析报告
- 海上风电关键技术创新
- 二年级上册书法教案全册
- 2025年柳州市城中区人民法院招录聘用人员考试试题
评论
0/150
提交评论