python多元线性回归
㈠ python量化入门:Fama-French三因子模型
Python量化入门,Fama-French三因子模型是一种改进的金融模型,用于分析投资组合收益的多元影响因素。以下是模型的关键步骤和Python实战应用:
技术讨论,不构成投资建议!
Fama-French三因子模型弥补了CAPM模型的局限,它关注市值、市盈率(PE)、杠杆比例和账面市值比(BM)四个因素。Fama和French的研究发现,单个因子的解释力有限,组合使用时,市值和BM因子对其他因素的影响减弱。模型的核心是市场风险溢酬、市值效应(SMB,小市值优于大市值)和账面市值比效应(HML,高BM优于低BM)三个因子,形成多元线性回归模型。
在Python实战中,首先通过计算SMB和HML来构造投资组合,这可能需要一定时间的数据处理。接着,选择不同市值和PB水平的股票作为样本,对相关数据进行整合和探索。通过收益率时序图和多元线性方程求解,可以估计超额收益率(α)和因子的系数。通常,当p值小于0.05,说明因子对收益率有显着影响。
虽然理论与计算过程看似复杂,但实际应用中,数据处理可以自动化,以便更有效地进行投资策略分析。
㈡ python怎么用线性回归拟合
from sklearn import linear_model#线性回归clf = linear_model.LinearRegression()#训握漏练clf.fit ([[0, 0], [1, 1], [2, 2]], [0, 1, 2])#表达式参竖皮睁数clf.coef_#测试余岁improt numpy as npx = np.array([1,1])y = x.dot(clf.coef_)
㈢ 如何用Python进行线性回归以及误差分析
数据挖掘中的预测问题通常分为2类:回归与分类。
简单的说回归就是预测数值,而分类是给数据打上标签归类。
本文讲述如何用Python进行基本的数据拟合,以及如何对拟合结果的误差进行分析。
本例中使用一个2次函数加上随机的扰动来生成500个点,然后尝试用1、2、100次方的多项式对该数据进行拟合。
拟合的目的是使得根据训练数据能够拟合出一个多项式函数,这个函数能够很好的拟合现有数据,并且能对未知的数据进行预测。
代码如下:
importmatplotlib.pyplot as plt
importnumpy as np
importscipy as sp
fromscipy.statsimportnorm
fromsklearn.pipelineimportPipeline
fromsklearn.linear_modelimportLinearRegression
fromsklearn.
fromsklearnimportlinear_model
''''' 数据生成 '''
x = np.arange(0,1,0.002)
y = norm.rvs(0, size=500, scale=0.1)
y = y + x**2
''''' 均方误差根 '''
defrmse(y_test, y):
returnsp.sqrt(sp.mean((y_test - y) **2))
''''' 与均值相比的优秀程度,介于[0~1]。0表示不如均值。1表示完美预测.这个版本的实现是参考scikit-learn官网文档 '''
defR2(y_test, y_true):
return1- ((y_test - y_true)**2).sum() / ((y_true - y_true.mean())**2).sum()
''''' 这是Conway&White《机器学习使用案例解析》里的版本 '''
defR22(y_test, y_true):
y_mean = np.array(y_true)
y_mean[:] = y_mean.mean()
return1- rmse(y_test, y_true) / rmse(y_mean, y_true)
plt.scatter(x, y, s=5)
degree = [1,2,100]
y_test = []
y_test = np.array(y_test)
fordindegree:
clf = Pipeline([('poly', PolynomialFeatures(degree=d)),
('linear', LinearRegression(fit_intercept=False))])
clf.fit(x[:, np.newaxis], y)
y_test = clf.predict(x[:, np.newaxis])
print(clf.named_steps['linear'].coef_)
print('rmse=%.2f, R2=%.2f, R22=%.2f, clf.score=%.2f'%
(rmse(y_test, y),
R2(y_test, y),
R22(y_test, y),
clf.score(x[:, np.newaxis], y)))
plt.plot(x, y_test, linewidth=2)
plt.grid()
plt.legend(['1','2','100'], loc='upper left')
plt.show()
该程序运行的显示结果如下:
[ 0. 0.75873781]
rmse=0.15, R2=0.78, R22=0.53, clf.score=0.78
[ 0. 0.35936882 0.52392172]
rmse=0.11, R2=0.87, R22=0.64, clf.score=0.87
[ 0.00000000e+00 2.63903249e-01 3.14973328e-01 2.43389461e-01
1.67075328e-01 1.10674280e-01 7.30672237e-02 4.88605804e-02
......
3.70018540e-11 2.93631291e-11 2.32992690e-11 1.84860002e-11
1.46657377e-11]
rmse=0.10, R2=0.90, R22=0.68, clf.score=0.90