lhab 必修二 01 基础因子搭建与拟合信号

Cross Validation

K-fold Cross Validation k折交叉验证

数据集被分为k个相似大小的折叠,模型被训练k次,每次使用k-1个折叠进行训练,余下的一个用来验证。最后,将k次训练的指标取平均值。

Leave One Out Cross Validation (LOOCV) 留一法交叉验证

每个样本都作为一个单独的验证集,而其他所有样本用于训练模型。这意味着进行数据点个数次的模型训练和验证,因此计算成本较高。LOOCV在小数据集上很有用,但在大数据集上会比较耗时。

Stratified Cross Validation 分层交叉验证

分层交叉验证用于处理分类问题,它确保每个折叠中的类别分布与整个数据集中的分布相似。这有助于防止某些折叠中某一类别的样本数量太少,从而导致不准确的评估。

时间序列交叉验证

1. 数据分割:

较早的部分用作训练集,较新的部分用作验证集。

2. 滑动窗口:

定义一个固定大小的时间窗口,在每个窗口内进行模型训练和验证。例如,可以按月或按季度滑动窗口。

3. 模型训练与验证:

在每个时间窗口内,使用窗口之前的数据来训练模型,然后使用窗口内的数据进行验证。这样可以确保验证集包含了未来时刻的数据,模拟了模型在未来的性能。

4. 性能评估:

对每个窗口进行验证后,记录模型的性能指标,如均方误差、平均绝对误差、R-squared等。这些指标可以用于衡量模型在不同时间段内的性能表现。

5. 重复:

时间序列交叉验证需要多次重复上述步骤,以获得更稳定的性能评估。每次重复可以获得不同的起始时间点或不同的窗口大小,以保证模型在不同时间段内进行验证。

机器学习因子模型实战应用

线性模型

假设输入特征与输出特征存在线性关系,用于进行预测和分类任务。

线性回归模型

用于解决回归问题。回归问题是指预测一个连续数值的输出,假设输入特征与输出之间存在线性关系,通过拟合一条直线(或高维空间中的超平面)来对数据进行建模。

线性分类模型

用于解决分类模型。学习一个决策边界或决策函数,将不同类别的数据分开。

import numpy as np
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
from sklearn.metrics import r2_score 

np.random.seed(42)
X = np.random.rand(100, 1) * 10
y = 2 * X + 3 + np.random.randn(100,1)

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state = 42)

model = LinearRegression()

model.fit(X_train, y_train)

y_pred = model.predict(X_test)

mse = mean_squared_error(y_test, y_pred)
print('均方误差MSE:', use)
r2 = r2_score(y_test, y_pred)
print("R squared:",r2)
import matplotlib.pyplot as plt

plt.scatter(X_train, y_train, label='Training Data', color='blue', alpha=0.6)

plt.plot(X_test, y_pred, label='Linear Regression', color='green')

plt.xlabel('X')
plt.ylabel('y')
plt.legend()
plt.title('Linear Regression Fit')
plt.show()
import pandas as pd
import numpy as np
from tqdm import tqdm
import os
import time
import glob
import warnings
warnings.filterwarnings('ignore')

#data
path = "./data/data_test"
all_files = glob.glob(path + "/*.csv")

li = []

for filename in all_files:
    df = pd.read_csv(filename, index_col=None, header=0)
    li.append(df)

frame = pd.concat(li, axis=0,, ignore_index=True)
result_df = frame.sort_values(by=['date', 'code'],ascending = True)
result_df['vwap'] = result_df['money'] / result_df['volume']
result_df['target'] = result_df.groupby('code')['1vwap_pct'].shift(-1_.values
df = result_df.reset_index(drop=True)
df = df.fillna(0)

# 划分测试集
df_train = df[(df['date'] >= '2022-11-31') & (df['date'] <= '2022-12-24')]
df_test = df[(df['date'] <= '2022-12-29') & (df['date'] >= '2022-12-25')]

X_train = df_train[['open', 'close', 'low', 'high', 'volume', 'vwap']].values
y_train = df_train[['target']].values
X_test = df_test[['open', 'close', 'low', 'high', 'volume', 'vwap']].values
y_test = df_test[['target']].values

y_train
import pandas as pd
import numpy as np
from sklearn.linear_model import LinearRegression 
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_squared_error, r2_score

# 创建线性回归模型
lr_model = LinearRegression()

# 训练模型
lr_model.fit(X_train, y_train)

# 在测试集上进行预测
y_pred_train = lr_model.predict(X_train)
y_pred_test = lr_model.predict(X_test)

# 输出均方误差和决定系数R^2
mse_test = mean_squared_error(y_test, y_pred_test)
r2_test = r2_score(y_test, y_pred_test)
print("测试集的MSE指标:", mse_test.round(3))
print("测试集的R^2指标", r2_test.round(3))

mse_train = mean_squared_error(y_train, y_pred_train)
r2_train = r2_score(y_train, y_pred_train)
print("训练集的MSE指标:", mse_train.round(3))
print("训练集的R^2指标", r2_train.round(3))

贝叶斯线性回归

贝叶斯线性回归是一种使用贝叶斯统计理论的线性回归模型,它允许在估计模型参数时引入先验分布,并提供了参数的概率分布,从而处理不确定性和噪声。以下是贝叶斯线性回归的主要步骤:

定义先验分布:

        在贝叶斯线性回归中,我们引入先验分布来表示对模型参数的先验信念。先验分布可以是任意的概率分布,通常选择高斯分布(正态分布)作为先验分布。

计算后验分布:

        使用贝叶斯定理,结合观测数据和先验分布,计算模型参数的后验概率分布。后验概率分布表示在观测数据的条件下,模型参数的概率分布。

参数估计

预测

import numpy as np
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
from sklearn.metrics import r2_score 

np.random.seed(42)
X = np.random.rand(100, 1)*10 # 特征矩阵,假设有一个特征
y = 2 * X[:, 0] + np.random.randn(100) # 目标变量 回归目标

# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state = 42)

# 创建并训练线性回归模型
lr = LinearRegression()
lr.fit(X_train, y_train)

# 进行预测
y_pred = model.predict(X_test)

# 计算均方根误差(RMSE)
rmse = np.sqrt(mean_squared_error(y_test, y_pred))
print("预测结果的均方根误差:", rmse)

# 绘制预测结果和实际结果对比图
plt.figure()
plt.scatter(X_train, y_train, color='b', label='real')
plt.plot(X_test, y_pred, color='r', label='pred')
plt.xlabel('feature')
plt.ylabel('y')
plt.title('result')
plt.legend()
plt.show()
import numpy as np
import warnings
warnings.filterwarnings('ignore')
import matplotlib.pyplot as plt

class BayesianLinearRegression:
    def _init_(self, alpha=1.0, beta=1.0):
        self.alpha = alpha #先验概率的超参数
        self.beta = beta    #观测数据的超参数
        self.mean = None
        self.covariance = None

    def fit(self, X, y):
        n_samples, n_features = X.shape
        X_b = np.c_[np.ones((n_samples, 1)), X]
        self.covariance = np.linalg.inv(self.alpha * np.eye(n_features + 1) + self.beta * X_b.T.dot(X_b))
        self.mean = self.beta * self.covariance.dot(X_b.T).dot(y)

    def predict(self, X):
        n_samples, _ = X.shape
        X_b = np.c_[np.ones((n_samples, 1)), X]
        return X_b.dot(self.mean)

# 创建并训练贝叶斯回归模型
br = BayesianLinearRegression(alpha=1.0, beta=1.0)
br.fit(X_train, y_train)

y_pred2 = br.predict(X_test)

rmse = np.sqrt(mean_squared_error(y_test, y_pred2))
print("预测结果的均方根误差", rmse)
# 绘制预测结果和实际结果对比图
plt.figure()
plt.scatter(X_train, y_train, color='b', label='real')
plt.plot(X_test, y_pred2, color='r', label='pred')
plt.xlabel('feature')
plt.ylabel('y')
plt.title('result')
plt.legend()
plt.show()

树模型

树模型是一类常用于分类和回归任务的机器学习算法。它们将输入数据划分成具有层次结构的子集,并在每个子集上进行预测。树模型的主要优势在于易于理解和解释,并且在处理非线性关系和高维数据时表现良好。

决策树是一种基于树状结构的机器学习算法,用于解决分类和回归问题。它通过对输入数据进行递归的二分划分,根据特征的取值来做出决策,并最终给出预测结果。

特征选择:

        决策树的第一步是选择最佳特征用于当前节点的测试。特征选择的目标是找到对于分类或回归任务最具有区分能力的特征。通常,我们会使用信息增益、基尼不纯度或方差等指标来度量特征的重要性。

树的生长:

        选择了最佳特征后,决策树开始递归地将数据划分为子集,直到满足停止条件。停止条件可以是以下几种之一:

        节点重点样本数量小于某个阈值

        树达到了预先设定的最大深度

        节点中的样本属于同一类别或其预测值足够接近(回归问题)

梯度提升决策树 (Gradient Boosting Decision Tree, GBDT)是一种集成学习算法,通过组合多个决策树来构建强大的预测模型。它是一种非常流行且广泛应用于回归和分类问题的机器学习算法。梯度提升决策树的主要思想是通过迭代的方式,逐步构建一系列决策树,每个树都试图纠正前面所有树的预测误差。在每一次迭代中,新的决策树被构建来预测之前模型预测错误的样本。然后,将新树的预测结果与之前模型的预测结果进行加权求和,得到更新后的预测结果。通过不断迭代这个过程,模型逐渐收敛并提升预测性能。

        初始化:用一个简单的模型作为初始模型,用于拟合数据集的目标变量,计算初始模型的预测值与实际目标值之间的残差(即误差),这将成为后续树模型的目标。

        构建决策树:构建一个新的决策树模型,目标是拟合之前步骤中计算的残差。决策树的深度、叶子节点数量和其他超参数可以根据需要进行调整。

        计算梯度:计算新模型的预测值与残差之间的差异,这是当前模型的梯度。

        更新模型:通过使用梯度信息来更新模型的参数(通常是权重和偏置),以减小当前模型的残差。

        迭代:重复上述步骤,直到满足一定的停止条件。

XGboost (Extreme Gradient Boosting)是一种基于梯度提升决策树的集成机器学习算法,被广泛应用于回归和分类问题。它具有高效性、高性能和可扩展性,是许多数据科学竞赛和实际应用中的首选算法之一。

梯度提升集成:

XGBoost是一种梯度提升算法,它以集成的方式组合多个决策树模型来提高性能。它通过不断迭代地训练决策树,每次迭代都试图纠正前一轮模型的错误。

迭代过程中,XGBoost采用了梯度下降的方法来最小化损失函数,以调整模型的权重。

损失函数:

XGBoost的损失函数由两部分组成:一个是用于衡量模型预测值与真实值之间差异的损失项(通常是均方误差或对数似然损失),另一个是用于正则化的惩罚项(防止过拟合)。

总损失函数 = 损失项 + 正则化项

决策树模型:

XGBoost 使用CART (Classification and Regression Trees)决策树作为基础模型,每个决策树都是一个弱学习器,通过多次迭代来构建。

决策树的构建过程会考虑损失函数,以最小化总损失。在每次迭代中,树的深度和叶子节点的数量可以根据超参数进行调整。

正则化:

XGBoost引入了L1和L2正则化项,以限制树模型的复杂性,防止过拟合。这些正则化项分别影响叶子节点的权重和叶子节点的数量。

特征重要性:

XGBoost提供了一种方法来计算特征的重要性分数,以帮助识别对模型预测最具影响力的特征。这可以用于特征选择和数据理解。

多线程支持:

XGboost具有高度优化的实现,支持多线程训练,以提高训练速度。它还可以利用硬件加速(如GPU)来加快模型训练。

缺失值处理:

XGBoost能够自动处理输入数据中的缺失值,无需额外的数据预处理步骤。

  • 4
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值