作者:老余捞鱼
原创不易,转载请标明出处及原作者。

写在前面的话:投资就像一场刺激的冒险,谁都想在金融市场里大赚一笔。可现实往往很残酷,市场波动大,各种因素错综复杂,一不小心就容易踩坑。今天我挖到了超实用的回归技术干货,必须分享给大家!掌握这些方法,投资之路能少走好多弯路,小白也能逆袭变高手,赶紧来看看!
在金融投资领域,要想精准预测投资收益,离不开各种分析方法。其中有一类方法就像给投资装上了 “稳定器”,能让我们的投资决策更靠谱,这就是咱们今天要说的回归技术。
在普通的多元线性回归模型里,我们的目标是找到最合适的系数,让预测误差最小,也就是让均方误差最小。但在实际的金融投资场景中,这个方法就有点 “水土不服” 了。因为金融数据里有很多因素之间相互关联,还有些因素对投资收益的预测没什么帮助,这些都会让预测结果变得很不稳定。
为了解决这个问题,优化调整方法就派上用场啦!它就像给模型加上了 “紧箍咒”,通过在计算误差的公式里加个惩罚项,来调整那些系数,让模型变得更稳定,预测也更准确。下面就给大家详细介绍几种超实用的回归技术。
一、岭回归:投资组合的 “稳定器”
岭回归(Ridge Regression )的主要目的是通过引入正则化项来减少模型的复杂性,从而防止过拟合。它给模型加上了 L2 惩罚项,这个惩罚项的作用就是不让系数变得太大。

在金融投资里,岭回归的用处可大了去了!而且随着金融数据的不断增长和复杂性增加,岭回归将继续成为金融分析师和研究人员的重要工具。

其在金融领域的应用展现了其强大的数据处理能力和模型稳定性。通过有效地处理多重共线性问题,岭回归不仅提高了模型的预测能力,还在风险管理和投资组合优化中发挥了重要作用。
二、Lasso 回归:精准筛选投资因素的 “神器”
Lasso 回归(Lasso Regression)和岭回归有点不一样,它能直接把一些不太重要的影响因素从模型里 “踢” 出去,只留下那些对投资收益影响大的关键因素。这样一来,模型就变得更简单、更精准了。
在实际投资中,Lasso 回归展现了其强大的特征选择能力和模型优化优势。无论是在设计交易模型、预测经济走势还是投资组合优化中,Lasso 回归都能为金融分析提供有力的支持。
在金融领域的应用-visual-selection.png)
- 在设计交易模型时,它能帮我们从一堆影响资产收益的因素里,快速找出最重要的那些,把没用的因素都去掉。
- 在构建投资组合的时候,Lasso 回归还能让组合里的资产数量变少,这样我们买卖资产时要交的手续费等交易成本也会降低。
- 在预测宏观经济走势,分析各种经济指标对投资的影响时,它也能帮我们选出最关键的经济指标,让预测更准确。
三、弹性网络回归:集大成的投资 “多面手”
弹性网络回归(Elastic Net)就像是把岭回归和 Lasso 回归的优点都集合在一起了。它既能像岭回归一样让模型更稳定,又能像 Lasso 回归那样筛选关键因素。
通过调整一个叫 α 的参数,我们可以控制它更像岭回归还是更像 Lasso 回归。当 α 等于 1 的时候,它就和 Lasso 回归一样;当 α 等于 0 的时候,就和岭回归一样。
在金融投资里,弹性网络回归也有很多用武之地。
在金融领域的应用-visual-selection-1.png)
- 在进行因子投资,挑选对股票涨跌有重要影响的因子组合时,它能发挥大作用。在分析大量股票数据,
- 像分析社交媒体上大家对某个公司的评价这种特殊数据时,它能帮助我们建立更准确的资产定价模型。
- 在预测贷款违约风险,做信用风险建模的时候,它还能防止模型出现过度拟合的情况,让预测结果更可靠。
四、代码实现
光说理论可能有点抽象,接下来咱们用 Python 代码实操一下,看看这些回归方法在实际投资里表现咋样。

我们还是以美股“七巨头” 股票 “Magnificent Seven”的等权重投资组合的数据为例来分析,对比岭回归、Lasso 回归、弹性网络回归和分层风险平价(HRP)策略。
4.1 数据与投资组合构建
先安装需要的工具包,代码是:
pip install yfinance PyPortfolioOpt scikit - learn matplotlib
。
为了方便中国人使用,安装中文字体:
!apt-get -qq install -y fonts-wqy-zenhei fonts-noto-cjk
!fc-cache -fv # 刷新字体缓存
然后,导入要用的各种库:
import numpy as np
import pandas as pd
import yfinance as yf
import matplotlib.pyplot as plt
import seaborn as sns
from datetime import datetime, timedelta
from sklearn.linear_model import Ridge, Lasso, ElasticNet
from sklearn.preprocessing import StandardScaler
from sklearn.model_selection import TimeSeriesSplit
from pypfopt.hierarchical_portfolio import HRPOpt
from pypfopt import risk_models, expected_returns
import warnings
warnings.filterwarnings('ignore')
设置一下图表的风格:
plt.style.use('seaborn-v0_8-darkgrid')
sns.set_palette("Set2")
确定一下获取数据的时间范围,过去 5 年的数据:
end_date = datetime.now()
start_date = end_date - timedelta(days=5*365)
选好要分析的股票代码,“Magnificent Seven” 是['AAPL', 'MSFT', 'AMZN', 'GOOGL', 'META', 'TSLA', 'NVDA']
,再加上一个基准['QQQ']
。
4.2 数据计算及分类
下载历史数据,计算日收益率:
tickers = mag_seven + benchmark
data = yf.download(tickers, start=start_date, end=end_date)['Close']
returns = data.pct_change().dropna()
把数据分成训练集(70%)和测试集(30%):
train_size = int(len(returns) * 0.7)
returns_train = returns.iloc[:train_size]
returns_test = returns.iloc[train_size:]
print(f"训练集时间范围: {returns_train.index[0]} 到 {returns_train.index[-1]}")
print(f"测试集时间范围: {returns_test.index[0]} 到 {returns_test.index[-1]}")
4.3 策略实现
接下来,分别实现不同的策略。先看分层风险平价(HRP)策略:
hrp_opt = HRPOpt(returns_train[mag_seven])
hrp_weights = hrp_opt.optimize()
再准备回归模型的数据,并且进行标准化处理:
X_train = returns_train[mag_seven].values
y_train = returns_train['QQQ'].values
scaler = StandardScaler()
X_train_scaled = scaler.fit_transform(X_train)
写个函数,用来训练模型并得到投资组合的权重:
def get_reg_weights(model, X, y, assets):
model.fit(X, y)
coefs = np.abs(model.coef_)
if np.sum(coefs) == 0:
weights = np.ones(len(assets)) / len(assets)
else:
weights = coefs / np.sum(coefs)
return pd.Series(weights, index=assets)
创建岭回归、Lasso 回归和弹性网络回归的模型实例:
ridge = Ridge(alpha=1.0)
lasso = Lasso(alpha=0.01)
elastic = ElasticNet(alpha=0.01, l1_ratio=0.5)
得到每个模型的投资组合权重:
ridge_weights = get_reg_weights(ridge, X_train_scaled, y_train, mag_seven)
lasso_weights = get_reg_weights(lasso, X_train_scaled, y_train, mag_seven)
elastic_weights = get_reg_weights(elastic, X_train_scaled, y_train, mag_seven)
把三种回归模型的结果组合起来,形成一个新的投资组合。先计算每个模型在训练集上的表现:
def calculate_portfolio_performance(returns, weights):
portfolio_returns = (returns * weights).sum(axis=1)
cumulative_returns = (1 + portfolio_returns).cumprod()
sharpe_ratio = portfolio_returns.mean() / portfolio_returns.std() * np.sqrt(252)
volatility = portfolio_returns.std() * np.sqrt(252)
return portfolio_returns, cumulative_returns, sharpe_ratio, volatility
根据夏普比率给每个模型分配权重,形成投资组合:
model_names = ['岭回归', 'Lasso回归', '弹性网络回归']
model_weights = [ridge_weights, lasso_weights, elastic_weights]
model_sharpes = []
# 篇幅原因,此处缩写,完整版到colab申请下载
print("\n根据夏普比率的模型权重:")
for name, importance in zip(model_names, model_importance):
print(f"{name}: {importance:.4f}")
combined_weights = pd.Series(0, index=mag_seven)
for i, weights in enumerate(model_weights):
combined_weights += weights * model_importance[i]
combined_weights = combined_weights / combined_weights.sum()

4.4 结果展示与分析
最后,在测试集上评估所有投资组合的表现,包括 HRP、三种回归模型以及投资组合,还有基准QQQ
:
all_weights = {
'HRP': hrp_weights,
'岭回归': ridge_weights,
'Lasso回归': lasso_weights,
'弹性网络回归': elastic_weights,
'组合投资组合': combined_weights,
}
print("\n每个投资组合的权重分布:")
weights_df = pd.DataFrame(all_weights)
# 篇幅原因,此处缩写,完整版到colab申请下载
results['QQQ'] = {
'returns': benchmark_returns,
'cumulative': benchmark_cum_returns,
'sharpe': benchmark_sharpe,
'volatility': benchmark_vol,
'weights': pd.Series(1.0, index=['QQQ'])
}
为了更直观地看到结果,我们还做了很多可视化图表。
累计收益率图:

实现代码示例:
plt.figure(figsize=(12, 6))
for name, result in results.items():
plt.plot(result['cumulative'], label=name)
plt.title('测试期内投资组合与QQQ的累计收益率')
plt.xlabel('日期')
plt.ylabel('累计收益率')
plt.legend()
plt.tight_layout()
plt.savefig('cumulative_returns_test.png')
plt.show()
绩效指标对比表格:
各投资组合的权重分布:
HRP Ridge Lasso ElasticNet Combinada
AAPL 0.192454 0.209846 0.320533 0.287006 0.269942
AMZN 0.178445 0.115885 0.000000 0.094346 0.073031
GOOGL 0.163813 0.120615 0.000000 0.120223 0.083471
META 0.113203 0.086448 0.000000 0.000000 0.030644
MSFT 0.190025 0.186661 0.665312 0.307939 0.374608
NVDA 0.067490 0.174206 0.014155 0.190487 0.130608
TSLA 0.094570 0.106339 0.000000 0.000000 0.037696
实现代码示例:
metrics = pd.DataFrame({
'夏普比率': [results[model]['sharpe'] for model in results],
'年化波动幅度(%)': [results[model]['volatility'] * 100 for model in results],
'最终收益率(%)': [(results[model]['cumulative'].iloc[-1] - 1) * 100 for model in results]
}, index=results.keys())
print("\n测试期内绩效指标对比:")
print(metrics)
投资组合权重分布柱状图:

实现代码示例:
metrics = pd.DataFrame({
'夏普比率': [results[model]['sharpe'] for model in results],
'年化波动幅度(%)': [results[model]['volatility'] * 100 for model in results],
'最终收益率(%)': [(results[model]['cumulative'].iloc[-1] - 1) * 100 for model in results]
}, index=results.keys())
print("\n测试期内绩效指标对比:")
print(metrics)
投资组合收益率相关性热力图:

实现代码示例:
correlation_matrix = pd.DataFrame({
name: result['returns'] for name, result in results.items()
}).corr()
plt.figure(figsize=(10, 8))
sns.heatmap(correlation_matrix, annot=True, cmap='coolwarm', vmin=-1, vmax=1)
plt.title('投资组合收益率之间的相关性')
plt.tight_layout()
plt.savefig('correlation_heatmap.png')
plt.show()
回撤分析图:

实现代码示例:
def calculate_drawdowns(returns):
cum_returns = (1 + returns).cumprod()
running_max = cum_returns.cummax()
drawdowns = (cum_returns / running_max) - 1
return drawdowns
plt.figure(figsize=(12, 6))
for name, result in results.items():
drawdowns = calculate_drawdowns(result['returns'])
plt.plot(drawdowns, label=name)
plt.title('测试期内各策略的回撤情况')
plt.xlabel('日期')
plt.ylabel('回撤(%)')
plt.legend(loc='upper center', bbox_to_anchor=(0.5, -0.1), ncol=3)
plt.tight_layout()
plt.savefig('drawdowns.png')
plt.show()
滚动波动率分析图:

实现代码示例:
window = 30
rolling_vol = pd.DataFrame({
name: result['returns'].rolling(window=window).std() * np.sqrt(252) for name, result in results.items()
})
plt.figure(figsize=(12, 6))
rolling_vol[['HRP', '组合投资组合', 'QQQ']].plot()
plt.title(f'{window}天滚动波动率: HRP、组合投资组合与QQQ对比')
plt.xlabel('日期')
plt.ylabel('年化波动幅度')
plt.legend()
plt.tight_layout()
plt.savefig('rolling_volatility_comparison.png')
plt.show()
最后总结一下结果:

实现代码示例:
print("\n最终总结:")
print(f"测试期: {returns_test.index[0].strftime('%Y-%m-%d')} 到 {returns_test.index[-1].strftime('%Y-%m-%d')}")
print(f"最高夏普比率: {metrics['夏普比率'].idxmax()} ({metrics['夏普比率'].max():.2f})")
print(f"最低波动幅度: {metrics['年化波动幅度(%)'].idxmin()} ({metrics['年化波动幅度(%)'].min():.2f}%)")
print(f"最高收益率: {metrics['最终收益率(%)'].idxmax()} ({metrics['最终收益率(%)']")
4.5 源代码下载
以上的源代码请在我的Google Colab中申请下载,内附中文构建说明。

如觉得对您有所帮助,请留言给我索要,同时请我喝杯咖啡就好。
五、观点总结
家人们,看完这些是不是收获满满!投资的门道很多,岭回归、Lasso 回归和弹性网络回归三种回归技术只是其中一部分。但掌握了它们,你就比别人多了几分胜算。大家赶紧动手实践一下,把这些方法用起来。
- 回归技术原理:为解决金融数据中因素关联和无用因素干扰问题,通过在计算误差公式里添加惩罚项调整系数,让模型更稳定、预测更准确。岭回归控制系数大小,Lasso 回归筛选关键因素,弹性网络回归兼具两者优势。
- Python 实操过程:以 美股7雄股票数据为例,经安装工具包、导入库、确定数据时间范围、获取数据、计算收益率、划分数据集、实现不同策略、训练模型、组合模型结果等步骤,得到各投资组合权重。
- 结果展示与分析:通过累计收益率图表、绩效指标对比表格、权重分布柱状图等多种可视化方式,分析不同投资组合在测试集中的表现,评估各策略优劣,如最高夏普比率、最低波动幅度和最高收益率等指标情况。
感谢您阅读到最后,希望这篇文章为您带来了新的启发和实用的知识!如果觉得有帮助,请不吝点赞和分享,您的支持是我持续创作的动力。祝您投资顺利,收益长虹!如果对文中内容有任何疑问,欢迎留言,我会尽快回复!
本文内容仅限技术探讨和学习,不构成任何投资建议。
Be First to Comment