高斯核函数回归

假设自变量为X,因变量为Y。X中含有n个样本,并且与Y中的值一一对应。对于自变量样本的任意取值x,它有个一唯一对应的y。为了计算y,利用其他自变量样本对应的y取加权平均值,权重为其他自变量样本距离该x的样本距离。距离x越远的样本,则对应的y的权重越小。这种回归方式称为高斯核函数回归。依据不同形式的核函数,可以计算出不同的自变量样本权重。
期权的隐含波动率与期权的在值程度和期权剩余到期时间具有函数关系。本文用高斯核函数回归的方式,选取2020年12月30日上证50ETF期权的数据,建立隐含波动率模型。样本数据见:

1.导入模块和不同的核函数

from sklearn.datasets import make_friedman2
from sklearn.gaussian_process import GaussianProcessRegressor
"""用于引入核的形式https://scikit-learn.org/stable/modules/gaussian_process.html#rw2006
ConstantKernel:修改高斯过程的均值
WhiteKernel:修改高斯过程的标准差
Sum:将两核求和
Product:将两核求积
Exponentiation:将核求指数
RBF:径向基函数(RBF)核
Matern:Matern内核
RationalQuadratic:二次有理核
ExpSineSquared:指数sin平方核
DotProduct:点乘核
"""
from sklearn.gaussian_process.kernels import *
import pandas as pd
from sklearn import preprocessing
from sklearn.model_selection import train_test_split
from sklearn.metrics import *#模型评估指标

2.处理样本数据

#读取数据
data=pd.read_excel('隐含波动率样本数据.xlsx')
X=data[['times', 'm']]
y=data['implied']

#将自变量做标准化处理
X=preprocessing.scale(X)

#将数据划分为训练集和测试集
x_train,x_test,y_train,y_test=train_test_split(X,y,test_size=0.2,random_state=12)

3.拟合模型

kernel = Matern(length_scale=0.484,nu=1.5) + WhiteKernel()#构造核函数形式

model= GaussianProcessRegressor(kernel=kernel,#指定GP协方差函数的内核
                                alpha=1e-10,#拟合时核矩阵对角线上增加的值.通过确保计算值形成一个正定矩阵,可以防止在拟合过程中出现潜在的数值问题
                                optimizer='fmin_l_bfgs_b',#用于优化内核参数的内部支持的优化器
                                n_restarts_optimizer=0,#优化器重新启动的次数,用于寻找最大化对数边际可能性的内核参数
                                normalize_y=False,#不管目标值y是否归一化,目标值的均值和方差分别设为0和1
                                copy_X_train=True,
                                random_state=None)
model=model.fit(X, y)#拟合高斯过程回归模型

4.观察模型

model.get_params()#获取这个估计量的参数
model.log_marginal_likelihood()#为训练数据返回theta的对数边际可能性
model.score(X, y)#返回拟合优度
model.sample_y([[-0.63252516,  0.8778663 ]])#从高斯过程中抽取样本,在X处求值
model.predict(X, return_std=True)#使用高斯过程回归模型进行预测

5.评估模型拟合效果

y_pred=model.predict(x_test)#测试集数据的预测值
explained_variance_score(y_true=y_test,y_pred=y_pred)#解释方差分数
mean_absolute_error(y_true=y_test,y_pred=y_pred)#绝对误差均值
mean_absolute_percentage_error(y_true=y_test,y_pred=y_pred)#绝对误差百分比
mean_squared_error(y_true=y_test,y_pred=y_pred)#均方误差
mean_squared_log_error(y_true=y_test,y_pred=y_pred)#均方对数误差
r2_score(y_true=y_test,y_pred=y_pred)#拟合优度

你可能感兴趣的:(机器学习)