如何用Python循环批量对多支股票执行线性回归分析?
批量执行线性回归分析股票均值回归
完全可以通过for循环遍历所有股票代码,批量完成线性回归分析,高效筛选出均值回归程度最高的股票。以下是完整实现方案:
核心思路
对每只股票动态提取当日收益率(X)和前一日收益率(Y),拟合简单线性回归模型后,收集关键参数(斜率、R²等)。其中负斜率的绝对值越大,说明股票收益率的均值回归倾向越显著。
修正后的完整代码
import yfinance as yf import numpy as np import pandas as pd from datetime import date, timedelta from sklearn.linear_model import LinearRegression # 日期范围设置(修正原代码中未定义的end变量) enddt = date.today() startdt = enddt - timedelta(days=90) # 股票列表(实际使用时替换为标普500完整代码列表) symbols = ['MMM', 'AOS', 'ABT'] # 获取行情数据并计算日收益率 data = yf.download(" ".join(symbols), start=startdt, end=enddt) daily_returns = data['Adj Close'].pct_change() df2 = pd.DataFrame(daily_returns) # 生成每只股票的滞后收益率列 for symbol in symbols: df2[f'{symbol}_lag'] = df2[symbol].shift(1) # 移除包含NaN的前两行数据 df3 = df2.drop(df2.index[[0, 1]]) # 初始化列表存储所有股票的回归结果 regression_results = [] # 批量执行线性回归 for symbol in symbols: # 动态提取当前股票的X和Y变量 x = np.array(df3[symbol]).reshape((-1, 1)) y = np.array(df3[f'{symbol}_lag']) # 拟合线性回归模型 model = LinearRegression().fit(x, y) # 计算R²值(修正原代码中错误的model.score_属性) r_squared = model.score(x, y) # 收集当前股票的回归参数 regression_results.append({ '股票代码': symbol, '截距': model.intercept_, '斜率': model.coef_[0], 'R²': r_squared }) # 将结果转换为DataFrame,方便排序和查看 results_df = pd.DataFrame(regression_results) # 按斜率升序排序——负斜率绝对值越大,均值回归程度越高 results_df_sorted = results_df.sort_values(by='斜率', ascending=True) # 输出排序后的结果 print("批量回归结果(按均值回归程度从高到低排序):") display(results_df_sorted)
关键说明
- 动态变量提取:通过
df3[symbol]和df3[f'{symbol}_lag']实现循环中自动切换不同股票的X、Y变量,无需手动编写单支股票的回归代码。 - 结果整理:用字典列表收集每只股票的参数,最终转为DataFrame后可直接排序筛选,快速定位均值回归最强的股票。
- 均值回归判断逻辑:当回归斜率为负时,说明当日收益率会反向修正前一日的偏离(即向均值回归),斜率绝对值越大,回归力度越强。
内容的提问来源于stack exchange,提问作者Ean Bigelow
相关产品推荐
相关产品推荐

