A6. 统计建模
本章提供从 OLS 回归到机器学习的建模提示词模板。每个提示词框后都有「结果验证追问模板」——因为代码能跑通不代表结果正确,验证中间输出是建模流程中最容易被忽略的一步。
A6.1 生成回归模拟数据
在开始建模之前,先用模拟数据验证代码逻辑,确认模型估计出的系数和设定的真实值接近,再换成真实数据分析。
提示词:生成回归分析模拟数据
请用 numpy 和 pandas 生成一份用于 OLS 回归分析的模拟数据,
随机种子 np.random.seed(42),样本量 1000:
数据设定(金融场景:影响股票月收益率的因素):
- 自变量:
- beta:市场 beta,从 N(1, 0.3) 生成
- size:公司规模对数,从 N(10, 2) 生成
- bm:账面市值比,从 U(0.1, 2) 生成
- momentum:过去 12 个月收益率,从 N(0.05, 0.15) 生成
- 因变量(真实模型):
return = 0.01 + 0.03×beta - 0.005×size + 0.02×bm + 0.1×momentum + ε
其中 ε ~ N(0, 0.05)
输出:
1. 数据框 `df`,打印前 5 行
2. 打印各自变量与 return 的相关系数
3. 用 statsmodels 跑一次 OLS 回归,检验估计系数是否接近真实值
(真实值:截距 0.01,beta 系数 0.03,size 系数 -0.005 等)A6.2 OLS 线性回归
提示词:OLS 回归的完整分析流程
我有一个 pandas 数据框 `df`,包含以下列:
因变量(y):return(月股票收益率,浮点数)
自变量(X):beta、size、bm、momentum
请帮我用 statsmodels 完成完整的 OLS 回归分析:
第一步:运行基准回归
- 用公式 API(smf.ols):return ~ beta + size + bm + momentum
- 自动添加常数项(intercept)
- 打印回归结果摘要(result.summary())
第二步:解读核心统计量
- 在代码注释中说明以下统计量的含义:
系数(coef)、标准误(std err)、t 值、p 值、R²、调整后 R²、F 统计量
第三步:诊断检验
- 残差正态性:绘制残差的 Q-Q 图(一个子图)
- 异方差性:用 White 检验(sm.stats.diagnostic.het_white)
- 多重共线性:计算并打印每个自变量的方差膨胀因子(VIF)
第四步:稳健标准误
- 重新估计模型,使用 HC3 稳健标准误(cov_type='HC3')
- 打印稳健标准误下的系数和 p 值,
与第一步的普通标准误对比,指出哪些变量的显著性发生了变化
第五步:格式化输出回归表格
- 用 pandas DataFrame 整理一个「回归结果表」:
行为变量名,列为「系数」「标准误」「t 值」「p 值」「显著性标注」
显著性标注:*** p<0.01,** p<0.05,* p<0.1
结果验证追问模板
建模之后,最重要的一步是验证结果是否「合理」。
OLS 回归跑完了,但我对以下结果有疑问,请帮我分析:
[从以下情况选择,或自行描述:]
- 【系数符号与预期相反】size 系数为正(+0.012),
但根据小市值效应,size 系数应该是负的。
请帮我检查:① size 列的计算方式是否正确(应该是市值的对数);
② 是否有遗漏变量或多重共线性导致系数偏误;
③ 打印 size 列的描述性统计,确认数值范围是否合理
- 【R² 异常低】调整后 R² 仅为 0.003,几乎为 0。
请帮我判断:这在截面股票收益率回归中是否正常?
还是说因为数据或模型设定有问题?
- 【VIF 过高】beta 变量的 VIF 为 12.5(超过 10),
存在严重多重共线性。
请建议:如何处理这个问题(删除变量 / 主成分回归 / 岭回归)?A6.3 面板数据与双重差分
提示词:双重差分(DID)回归
我有一个企业年度面板数据框 `df`,包含以下列:
- firm_id:企业 ID(字符串)
- year:年份(整数,2010–2020)
- return:年股票收益率(因变量)
- treated:是否受到政策冲击(0/1,处理组 / 控制组)
- post:政策实施后的时期(0/1,2016 年及之后为 1)
- size、leverage、roa:控制变量
请帮我完成以下分析:
第一步:构建 DID 变量和基准回归
- 创建交互项:did = treated × post
- 用 OLS 估计:return ~ did + treated + post + size + leverage + roa
- 核心关注:did 的系数(平均处理效应 ATT),以及 p 值
第二步:加入双向固定效应
- 控制企业固定效应(firm_id)和年份固定效应(year)
- 使用 linearmodels 库的 PanelOLS,或在 statsmodels 中用 C(firm_id) 哑变量
- 标准误聚类到企业层面(cluster by firm_id)
- 对比加入固定效应前后,did 系数的变化
第三步:平行趋势检验(可视化)
- 分别计算处理组(treated=1)和控制组(treated=0)
在政策实施前(2010–2015)每年的平均 return
- 绘制折线图:两条线随年份的变化,用垂直虚线标注政策年(2016)
- 如果两条线在 2016 年前大致平行,说明平行趋势假设成立
请用模拟数据(100 家企业,11 年,真实 ATT=0.05)演示完整代码。
结果验证追问模板
DID 回归结果如下:
- 基准 OLS(不含固定效应):did 系数 = 0.068,p < 0.01
- 双向固定效应:did 系数 = 0.021,p = 0.18(不显著)
我不确定哪个结果更可信,请帮我分析:
1. 加入固定效应后系数从 0.068 降至 0.021,变化幅度很大,
可能的原因是什么?是否说明基准回归存在遗漏变量偏误?
2. 固定效应结果不显著,是否意味着政策没有效果,
还是可能是样本量不足或标准误聚类层级不对?
3. 我的企业数量只有 100 家,聚类标准误在小样本下是否可靠?
有什么替代方案?A6.4 机器学习模型
提示词:Lasso 变量选择
我有一个数据框 `df`,包含因变量 return(月收益率)
和 50 个财务及市场特征(feature_01 到 feature_50)。
目标是用 Lasso 回归筛选出真正有预测力的变量。
请用 scikit-learn 完成以下步骤:
1. 【数据准备】
- 按时间顺序划分训练集(前 80%)和测试集(后 20%),
不使用随机划分(防止数据泄露)
- 对特征做标准化(StandardScaler),
注意:用训练集的均值和标准差对测试集做变换
2. 【交叉验证选择正则化参数】
- 用 LassoCV(5 折交叉验证)在训练集上选择最优 alpha(λ)
- 绘制 alpha 与均方误差(MSE)的关系图,标出最优 alpha
3. 【模型估计与变量筛选】
- 用最优 alpha 在全部训练集上估计 Lasso 模型
- 打印被选中的变量(系数不为 0 的特征)及其系数,按绝对值降序
4. 【测试集评估】
- 在测试集上计算 MSE、RMSE 和样本外 R²(R²_oos)
- 对比 Lasso 和普通 OLS 在测试集上的 R²_oos
5. 使用模拟数据(500 个样本,50 个特征,其中只有 8 个特征真正有效),
随机种子 42,验证 Lasso 是否能正确识别出这 8 个特征。
提示词:随机森林与信用评分模型
我想用随机森林建立企业违约预测模型(信用评分模型)。
数据框 `df` 包含:
- 因变量:default(是否违约,0/1 二分类)
- 自变量:20 个财务指标(流动比率、资产负债率、净利润率、
总资产收益率、营收增速等)
请用 scikit-learn 完成:
1. 【处理类别不平衡】
- 查看违约率(default 的均值),预计约 5–10%
- 在 RandomForestClassifier 中使用 class_weight='balanced'
2. 【模型训练】
- 划分训练集和测试集(80:20),随机种子 42
- 用 GridSearchCV(5 折)调整超参数:
max_depth(5、10、None),min_samples_leaf(1、5、10)
- 打印最优参数组合
3. 【模型评估】
- 输出:混淆矩阵、精确率(Precision)、召回率(Recall)、
F1 分数、AUC-ROC
- 绘制 ROC 曲线(随机森林 vs Logistic 回归 vs 随机猜测基准线),
在图中标注各自的 AUC 值
4. 【特征重要性】
- 提取特征重要性,绘制水平条形图(降序排列,只显示前 15 个特征)
- 解释:特征重要性衡量的是什么?为什么它不等于「因果效应」?
使用模拟数据(1000 个样本,20 个特征,违约率 8%)演示,随机种子 42。
结果验证追问模板
随机森林模型评估完成,但结果有以下疑问:
[从以下情况选择:]
- 【AUC 异常高】测试集 AUC 达到 0.98,怀疑存在数据泄露。
请帮我检查:① 特征中是否包含了因变量本身或与因变量高度相关的变量;
② 训练集和测试集的划分是否有误(时序数据用了随机划分);
③ 打印 5 个重要性最高的特征,看是否存在可疑特征
- 【召回率很低】AUC = 0.78,但违约企业的召回率只有 0.25,
说明模型漏掉了大量实际违约的企业。
在信用风险模型中,召回率更重要(漏判代价大)。
请帮我调整分类阈值(默认 0.5),找到使召回率不低于 0.6 时
对应的最优阈值,并打印该阈值下的完整分类报告。A6.5 Bootstrap 与 Monte Carlo 模拟
提示词:Bootstrap 估计置信区间
我在对一个小样本(约 200 个观测)做 OLS 回归分析:
return ~ beta + size + bm
担心样本量太小时,标准 OLS 的标准误不可靠,
想用 Bootstrap 方法计算更稳健的置信区间。
请帮我写代码:
1. 【Bootstrap 循环】
- 重复 1000 次,每次有放回地抽取与原样本同规模的子样本
- 在子样本上重新估计 OLS,记录每个系数
- 用 tqdm 显示进度,设置随机种子 42
2. 【Bootstrap 置信区间】
- 计算每个系数的 Bootstrap 标准误(1000 次估计的标准差)
- 计算 95% 置信区间(取 2.5% 和 97.5% 分位数)
3. 【对比展示】
- 用 pandas DataFrame 整理:行为变量名,列为
OLS 系数、OLS 标准误、Bootstrap 标准误、Bootstrap 95% CI
- 如果 Bootstrap 标准误明显大于 OLS 标准误,说明什么?
4. 【可视化】
- 绘制各系数的 Bootstrap 分布直方图(2×2 子图,含常数项)
- 在每个子图上用垂直虚线标注 OLS 点估计值和 Bootstrap CI
使用模拟数据(200 个观测,3 个自变量,随机种子 42)演示。
提示词:Monte Carlo 投资组合风险模拟
请用 Python 对投资组合的未来价值进行 Monte Carlo 模拟:
参数设定:
- 初始投资:100 万元
- 投资期限:10 年(120 个月)
- 月收益率:服从正态分布,均值 0.8%,标准差 4%
- 模拟次数:10,000 次
- 随机种子:42
要求:
1. 【高效生成路径】
用 numpy 的向量化运算(禁止使用 Python for 循环)生成所有模拟路径,
结果矩阵形状为 (10000, 120),即 10,000 条路径 × 120 个月
2. 【风险指标计算】
计算最终价值(第 120 个月末)的:
- 均值、中位数、标准差
- 95% VaR:最差 5% 情况下,损失超过多少万元?
- 95% CVaR(Expected Shortfall):最差 5% 情况的平均损失
3. 【可视化(2 个子图)】
- 上图(路径图):随机选取 200 条路径,画为浅灰色折线(透明度 0.1);
叠加均值路径(蓝色实线)和 5%、95% 分位数路径(红色虚线);
x 轴为月份,y 轴为投资组合价值(万元)
- 下图(最终价值分布):最终价值的直方图 + KDE 曲线;
在图中用垂直线标注 VaR 和 CVaR 的位置
4. 结果汇总表格(用 pandas DataFrame 打印,单位万元,保留 2 位小数)