c:连接为向量或列表 sequence:等差序列 rep:重复
length:求长度 subset:求子集 seq,from:to, NA:缺失值 NULL:空对象 sort,order,unique,rev:排序 unlist:展平列表 attr,attributes:对象属性
mode,typeof:对象存储模式与类型 names:对象的名字属性
character:字符型向量 nchar:字符数 substr:取子串 format,formatC:把对象用格式转换为字符串 paste,strsplit:连接或拆分
charmatch,pmatch:字符串匹配 grep,sub,gsub:模式匹配与替换
complex,Re,Im,Mod,Arg,Conj:复数函数
factor:因子 codes:因子的编码 levels:因子的各水平的名字 nlevels:因子的水平个数 cut:把数值型对象分区间转换为因子
table:交叉频数表 split:按因子分组 aggregate:计算各数据子集的概括统计量 tapply:对“不规则”数组应用函数
+, -, *, /, ^, %%, %/%:四则运算 ceiling,floor,round,signif,trunc,zapsmall:舍入 max,min,pmax,pmin:最大最小值
range:最大值和最小值 sum,prod:向量元素和,积 cumsum,cumprod,cummax,cummin:累加、累乘 sort:排序 approx和approx fun:插值 diff:差分 sign:符号函数
abs,sqrt:绝对值,平方根 log, exp, log10, log2:对数与指数函数 sin,cos,tan,asin,acos,atan,atan2:三角函数
sinh,cosh,tanh,asinh,acosh,atanh:双曲函数
beta,lbeta,gamma,lgamma,digamma,trigamma,tetragamma,pentagamma,choose ,lchoose:与贝塔函数、伽玛函数、组合数有关的特殊函数
fft,mvfft,convolve:富利叶变换及卷积 polyroot:多项式求根 poly:正交多项式 spline,splinefun:样条差值
besselI,besselK,besselJ,besselY,gammaCody:Bessel函数 deriv:简单表达式的符号微分或算法微分
array:建立数组 matrix:生成矩阵 data.matrix:把数据框转换为数值型矩阵 lower.tri:矩阵的下三角部分 mat.or.vec:生成矩阵或向量 t:矩阵转置
cbind:把列合并为矩阵 rbind:把行合并为矩阵 diag:矩阵对角元素向量或生成对角矩阵 aperm:数组转置 nrow, ncol:计算数组的行数和列数 dim:对象的维向量
dimnames:对象的维名 row/colnames:行名或列名 %*%:矩阵乘法 crossprod:矩阵交叉乘积(内积) outer:数组外积 kronecker:数组的Kronecker积
apply:对数组的某些维应用函数 tapply:对“不规则”数组应用函数 sweep:计算数组的概括统计量 aggregate:计算数据子集的概括统计量 scale:矩阵标准化
matplot:对矩阵各列绘图 cor:相关阵或协差阵 Contrast:对照矩阵 row:矩阵的行下标集 col:求列下标集
solve:解线性方程组或求逆 eigen:矩阵的特征值分解 svd:矩阵的奇异值分解 backsolve:解上三角或下三角方程组 chol:Choleski分解
qr:矩阵的QR分解 chol2inv:由Choleski分解求逆
<,>,<=,>=,==,!=:比较运算符 !,&,&&,|,||,xor():逻辑运算符 logical:生成逻辑向量 all,any:逻辑向量都为真或存在真
ifelse():二者择一 match,%in%:查找 unique:找出互不相同的元素 which:找到真值下标集合 duplicated:找到重复元素
optimize,uniroot,polyroot:一维优化与求根
if,else,ifelse,switch:分支 for,while,repeat,break,next:循环 apply,lapply,sapply,tapply,sweep:替代循环的函数。
function:函数定义 source:调用文件 call:函数调用 .C,.Fortran:调用C或者Fortran子程序的动态链接库。 Recall:递归调用
browser,debug,trace,traceback:程序调试 options:指定系统参数 missing:判断虚参是否有对应实参 nargs:参数个数 stop:终止函数执行
on.exit:指定退出时执行 eval,expression:表达式计算 system.time:表达式计算计时 invisible:使变量不显示 menu:选择菜单(字符列表菜单)
其它与函数有关的还有:delay,delete.response,deparse,do.call,dput,environment ,,formals,format.info,interactive,
is.finite,is.function,is.language,is.recursive ,match.arg,match.call,match.fun,model.extract,name,parse,substitute,sys.parent ,warning,machine
cat,print:显示对象 sink:输出转向到指定文件 dump,save,dput,write:输出对象 scan,read.table,load,dget:读入
ls,objects:显示对象列表 rm, remove:删除对象 q,quit:退出系统 .First,.Last:初始运行函数与退出运行函数。
options:系统选项 ?,help,help.start,apropos:帮助功能 data:列出数据集分析
每一种分布有四个函数:d――density(密度函数),p――分布函数,q――分位数函数,r――随机数函数。
比如,正态分布的这四个函数为dnorm,pnorm,qnorm,rnorm。下面我们列出各分布后缀,前面加前缀d、p、q或r就构成函数名:
norm:正态,t:t分布,f:F分布,chisq:卡方(包括非中心) unif:均匀,exp:指数,weibull:威布尔,gamma:伽玛,beta:贝塔
lnorm:对数正态,logis:逻辑分布,cauchy:柯西, binom:二项分布,geom:几何分布,hyper:超几何,nbinom:负二项,pois:泊松 signrank:符号秩,
wilcox:秩和,tukey:学生化极差
sum, mean, var, sd, min, max, range, median, IQR(四分位间距)等为统计量,sort,order,rank与排序有关,其它还有ave,fivenum,mad,quantile,stem等。
R中已实现的有chisq.test,prop.test,t.test。
cor,cov.wt,var:协方差阵及相关阵计算 biplot,biplot.princomp:多元数据biplot图 cancor:典则相关 princomp:主成分分析 hclust:谱系聚类
kmeans:k-均值聚类 cmdscale:经典多维标度 其它有dist,mahalanobis,cov.rob。
ts:时间序列对象 diff:计算差分 time:时间序列的采样时间 window:时间窗
lm,glm,aov:线性模型、广义线性模型、方差
数据科学和机器学习是该时代最需求的技术,这一需求促使每个人都学习不同的库和软件包以实现它们。这篇博客文章将重点介绍用于数据科学和机器学习的Python库。这些是您掌握市场上最被炒作的两项技能的库。
以下是此博客中将涉及的主题列表:
数据科学与机器学习导论为什么要使用Python进行数据科学和机器学习?用于数据科学和机器学习的Python库用于统计的Python库用于可视化的Python库用于机器学习的Python库深度学习的Python库用于自然语言处理的Python库数据科学与机器学习导论
当我开始研究数据科学和机器学习时,总是有这个问题困扰我最大。是什么导致围绕这两个话题的热门话题?
嗡嗡声与我们生成的数据量有很大关系。数据是驱动ML模型所需的燃料,并且由于我们处在大数据时代,因此很清楚为什么将数据科学视为该时代最有希望的工作角色!
我会说数据科学和机器学习是技能,而不仅仅是技术。它们是从数据中获得有用的见解并通过建立预测模型解决问题所需的技能。
从形式上来讲,这就是两者的定义方式。
数据科学是从数据中提取有用信息以解决实际问题的过程。
机器学习是使机器学习如何通过提供大量数据来解决问题的过程。
这两个域是高度互连的。
机器学习是数据科学的一部分,它利用ML算法和其他统计技术来了解数据如何影响和发展业务。
为什么要使用Python?
Python在用于实现机器学习和数据科学的最流行的编程语言中排名第一。让我们了解为什么。
易于学习: Python使用非常简单的语法,可用于实现简单的计算,例如将两个字符串添加到复杂的过程中,例如构建复杂的ML模型。更少的代码:实施数据科学和机器学习涉及无数的算法。得益于Python对预定义包的支持,我们不必编写算法。为了使事情变得更容易,Python提供了一种“在编码时检查”的方法,从而减轻了测试代码的负担。预建库: Python有100多个预建库,用于实现各种ML和深度学习算法。因此,每次您要在数据集上运行算法时,只需要做的就是用单个命令安装和加载必要的程序包。预先构建的库的示例包括NumPy,Keras,Tensorflow,Pytorch等。与平台无关: Python可以在多个平台上运行,包括Windows,macOS,Linux,Unix等。在将代码从一个平台转移到另一个平台时,您可以使用诸如PyInstaller之类的软件包,该软件包将解决所有依赖性问题。大量的社区支持:除拥有大量支持者外,Python还拥有多个社区,团体和论坛,程序员可以在其中发布他们的错误并互相帮助。Python库
Python在AI和ML领域普及的唯一最重要的原因是,Python提供了数千个内置库,这些库具有内置功能和方法,可以轻松地进行数据分析,处理,处理,建模等。 。在下一节中,我们将讨论以下任务的库:
统计分析数据可视化数据建模与机器学习深度学习自然语言处理(NLP)统计分析
统计是数据科学和机器学习的最基本基础之一。所有ML和DL算法,技术等均基于统计的基本原理和概念。
Python附带了大量的库,仅用于统计分析。在此博客中,我们将重点介绍提供内置函数以执行最复杂的统计计算的顶级统计软件包。
这是用于统计分析的顶级Python库的列表:
NumPySciPyPandas统计模型NumPy
NumPy或数值Python是最常用的Python库之一。该库的主要功能是它支持用于数学和逻辑运算的多维数组。NumPy提供的功能可用于索引,分类,整形和传输图像和声波,这些图像和声波是多维实数数组。
以下是NumPy的功能列表:
执行简单到复杂的数学和科学计算对多维数组对象的强大支持以及用于处理数组元素的函数和方法的集合傅里叶变换和数据处理例程执行线性代数计算,这对于机器学习算法(例如线性回归,逻辑回归,朴素贝叶斯等)是必需的。SciPy
SciPy库建立在NumPy之上,是一组子软件包的集合,可帮助解决与统计分析有关的最基本问题。SciPy库用于处理使用NumPy库定义的数组元素,因此它通常用于计算使用NumPy无法完成的数学方程式。
这是SciPy的功能列表:
它与NumPy数组一起使用,提供了一个平台,提供了许多数学方法,例如数值积分和优化。它具有可用于矢量量化,傅立叶变换,积分,插值等子包的集合。提供完整的线性代数函数堆栈,这些函数可用于更高级的计算,例如使用k-means算法的聚类等。提供对信号处理,数据结构和数值算法,创建稀疏矩阵等的支持。Pandas
Pandas是另一个重要的统计库,主要用于统计,金融,经济学,数据分析等广泛领域。该库依赖于NumPy数组来处理Pandas数据对象。NumPy,Pandas和SciPy在执行科学计算,数据处理等方面都严重依赖彼此。
我经常被要求在Pandas,NumPy和SciPy中选择最好的,但是,我更喜欢使用它们,因为它们彼此之间非常依赖。Pandas是处理大量数据的最佳库之一,而NumPy对多维数组具有出色的支持,另一方面,Scipy提供了一组执行大多数统计分析任务的子包。
以下是Pandas的功能列表:
使用预定义和自定义索引创建快速有效的DataFrame对象。它可用于处理大型数据集并执行子集,数据切片,索引等。提供用于创建Excel图表和执行复杂数据分析任务的内置功能,例如描述性统计分析,数据整理,转换,操作,可视化等。提供对处理时间序列数据的支持统计模型
StatsModels Python软件包建立在NumPy和SciPy之上,是创建统计模型,数据处理和模型评估的最佳选择。除了使用SciPy库中的NumPy数组和科学模型外,它还与Pandas集成以进行有效的数据处理。该库以统计计算,统计测试和数据探索而闻名。
以下是StatsModels的功能列表:
NumPy和SciPy库中找不到的执行统计检验和假设检验的最佳库。提供R样式公式的实现,以实现更好的统计分析。它更隶属于统计人员经常使用的R语言。由于它广泛支持统计计算,因此通常用于实现广义线性模型(GLM)和普通最小二乘线性回归(OLM)模型。包括假设检验(零理论)在内的统计检验是使用StatsModels库完成的。因此,它们是用于统计分析的最常用和最有效的Python库。现在让我们进入数据科学和机器学习中的数据可视化部分。
数据可视化
图片说出一千多个单词。我们都听说过关于艺术方面的引用,但是,对于数据科学和机器学习也是如此。
数据可视化就是通过图形表示有效地表达来自数据的关键见解。它包括图形,图表,思维导图,热图,直方图,密度图等的实现,以研究各种数据变量之间的相关性。
在本博客中,我们将重点介绍最好的Python数据可视化软件包,这些软件包提供内置函数来研究各种数据功能之间的依赖关系。
这是用于数据可视化的顶级Python库的列表:
MatplotlibMatplotlibPlotyBokehMatplotlib
Matplotlib是Python中最基本的数据可视化软件包。它支持各种图形,例如直方图,条形图,功率谱,误差图等。它是一个二维图形库,可生成清晰明了的图形,这对于探索性数据分析(EDA)至关重要。
这是Matplotlib的功能列表:
Matplotlib通过提供选择合适的线条样式,字体样式,格式化轴等功能,使绘制图形变得极为容易。创建的图形可帮助您清楚地了解趋势,模式并进行关联。它们通常是推理定量信息的工具。它包含Pyplot模块,该模块提供了与MATLAB用户界面非常相似的界面。这是Matplotlib软件包的最佳功能之一。提供面向对象的API模块,以使用GUI工具(例如Tkinter,wxPython,Qt等)将图形集成到应用程序中。Matplotlib
Matplotlib库构成了Seaborn库的基础。与Matplotlib相比,Seaborn可用于创建更具吸引力和描述性的统计图。除了对数据可视化的广泛支持外,Seaborn还附带一个面向数据集的内置API,用于研究多个变量之间的关系。
以下是Seaborn的功能列表:
提供用于分析和可视化单变量和双变量数据点以及将数据与其他数据子集进行比较的选项。支持针对各种目标变量的线性回归模型的自动统计估计和图形表示。通过提供执行高级抽象的功能,构建用于构造多图网格的复杂可视化。带有许多内置主题,可用于样式设置和创建matplotlib图Ploty
Ploty是最知名的图形Python库之一。它提供了交互式图形,以了解目标变量和预测变量之间的依赖性。它可以用于分析和可视化统计,财务,商业和科学数据,以生成清晰明了的图形,子图,热图,3D图表等。
这是使Ploty成为最佳可视化库之一的功能列表:
它具有30多种图表类型,包括3D图表,科学和统计图,SVG地图等,以实现清晰的可视化。借助Ploty的Python API,您可以创建由图表,图形,文本和Web图像组成的公共/私有仪表板。使用Ploty创建的可视化以JSON格式序列化,因此您可以在R,MATLAB,Julia等不同平台上轻松访问它们。它带有一个称为Plotly Grid的内置API,该API可让您直接将数据导入Ploty环境。Bokeh
Bokeh是Python中交互性最强的库之一,可用于为Web浏览器构建描述性的图形表示形式。它可以轻松处理庞大的数据集并构建通用图,从而有助于执行广泛的EDA。Bokeh提供定义最完善的功能,以构建交互式绘图,仪表板和数据应用程序。
这是Bokeh的功能列表:
使用简单的命令帮助您快速创建复杂的统计图支持HTML,笔记本和服务器形式的输出。它还支持多种语言绑定,包括R,Python,lua,Julia等。Flask和django也与Bokeh集成在一起,因此您也可以在这些应用程序上表达可视化效果它提供了对转换为其他库(如matplotlib,seaborn,ggplot等)中编写的可视化文件的支持因此,这些是用于数据可视化的最有用的Python库。现在,让我们讨论用于实现整个机器学习过程的顶级Python库。
机器学习
创建可以准确预测结果或解决特定问题的机器学习模型是任何数据科学项目中最重要的部分。
实施ML,DL等涉及对数千行代码进行编码,当您要创建通过神经网络解决复杂问题的模型时,这可能变得更加麻烦。但值得庆幸的是,我们无需编写任何算法,因为Python随附了多个软件包,仅用于实现机器学习技术和算法。
在此博客中,我们将重点介绍提供内置函数以实现所有ML算法的顶级ML软件包。
以下是用于机器学习的顶级Python库的列表:
Scikit-learnXGBoostElI5Scikit-learn
Scikit-learn是最有用的Python库之一,是用于数据建模和模型评估的最佳库。它附带了无数功能,其唯一目的是创建模型。它包含所有有监督的和无监督的机器学习算法,并且还具有用于集合学习和促进机器学习的定义明确的功能。
以下是Scikit学习的功能列表:
提供一组标准数据集,以帮助您开始使用机器学习。例如,著名的Iris数据集和Boston House Price数据集是Scikit-learn库的一部分。用于执行有监督和无监督机器学习的内置方法。这包括解决,聚类,分类,回归和异常检测问题。带有用于特征提取和特征选择的内置功能,可帮助识别数据中的重要属性。它提供了执行交叉验证以评估模型性能的方法,还提供了用于优化模型性能的参数调整功能。XGBoost
XGBoost代表“极端梯度增强”,它是执行Boosting Machine Learning的最佳Python软件包之一。诸如LightGBM和CatBoost之类的库也同样配备了定义明确的功能和方法。建立该库的主要目的是实现梯度提升机,该梯度提升机用于提高机器学习模型的性能和准确性。
以下是其一些主要功能:
该库最初是用C ++编写的,被认为是提高机器学习模型性能的最快,有效的库之一。核心的XGBoost算法是可并行化的,并且可以有效地利用多核计算机的功能。这也使该库足够强大,可以处理大量数据集并跨数据集网络工作。提供用于执行交叉验证,参数调整,正则化,处理缺失值的内部参数,还提供scikit-learn兼容的API。该库经常在顶级的数据科学和机器学习竞赛中使用,因为它一直被证明优于其他算法。ElI5
ELI5是另一个Python库,主要致力于改善机器学习模型的性能。该库相对较新,通常与XGBoost,LightGBM,CatBoost等一起使用,以提高机器学习模型的准确性。
以下是其一些主要功能:
提供与Scikit-learn软件包的集成,以表达功能重要性并解释决策树和基于树的集成的预测。它分析并解释了XGBClassifier,XGBRegressor,LGBMClassifier,LGBMRegressor,CatBoostClassifier,CatBoostRegressor和catboost所做的预测。它提供了对实现多种算法的支持,以便检查黑盒模型,其中包括TextExplainer模块,该模块可让您解释由文本分类器做出的预测。它有助于分析包括线性回归器和分类器在内的scikit学习通用线性模型(GLM)的权重和预测。深度学习
机器学习和人工智能的最大进步是通过深度学习。随着深度学习的介绍,现在可以构建复杂的模型并处理庞大的数据集。幸运的是,Python提供了最好的深度学习软件包,可帮助构建有效的神经网络。
在此博客中,我们将专注于提供用于实现复杂的神经网络的内置功能的顶级深度学习软件包。
以下是用于深度学习的顶级Python库的列表:
TensorFlowPytorchKerasTensorFlow
TensorFlow是用于深度学习的最佳Python库之一,是一个用于跨各种任务进行数据流编程的开源库。它是一个符号数学库,用于构建强大而精确的神经网络。它提供了直观的多平台编程界面,可在广阔的领域中实现高度扩展。
以下是TensorFlow的一些关键功能:
它允许您构建和训练多个神经网络,以帮助适应大型项目和数据集。除支持神经网络外,它还提供执行统计分析的功能和方法。例如,它带有用于创建概率模型和贝叶斯网络(例如伯努利,Chi2,Uniform,Gamma等)的内置功能。该库提供了分层的组件,这些组件可以对权重和偏差执行分层的操作,并且还可以通过实施正则化技术(例如批标准化,丢包等)来提高模型的性能。它带有一个称为TensorBoard的可视化程序,该可视化程序创建交互式图形和可视化图形以了解数据功能的依赖性。Pytorch
Pytorch是一个基于Python的开源科学计算软件包,用于在大型数据集上实施深度学习技术和神经网络。Facebook积极地使用此库来开发神经网络,以帮助完成各种任务,例如面部识别和自动标记。
以下是Pytorch的一些主要功能:
提供易于使用的API与其他数据科学和机器学习框架集成。与NumPy一样,Pytorch提供了称为Tensors的多维数组,与NumPy不同,它甚至可以在GPU上使用。它不仅可以用于对大型神经网络进行建模,而且还提供了一个界面,具有200多种用于统计分析的数学运算。创建动态计算图,以在代码执行的每个点建立动态图。这些图有助于时间序列分析,同时实时预测销售量。Keras
Keras被认为是Python中最好的深度学习库之一。它为构建,分析,评估和改进神经网络提供全面支持。Keras基于Theano和TensorFlow Python库构建,该库提供了用于构建复杂的大规模深度学习模型的附加功能。
以下是Keras的一些关键功能:
为构建所有类型的神经网络提供支持,即完全连接,卷积,池化,循环,嵌入等。对于大型数据集和问题,可以将这些模型进一步组合以创建完整的神经网络它具有执行神经网络计算的内置功能,例如定义层,目标,激活功能,优化器和大量工具,使处理图像和文本数据更加容易。它带有一些预处理的数据集和经过训练的模型,包括MNIST,VGG,Inception,SqueezeNet,ResNet等。它易于扩展,并支持添加包括功能和方法的新模块。自然语言处理
您是否曾经想过Google如何恰当地预测您要搜索的内容?Alexa,Siri和其他聊天机器人背后的技术是自然语言处理。NLP在设计基于AI的系统中发挥了巨大作用,该系统有助于描述人类语言与计算机之间的交互。
在此博客中,我们将重点介绍提供内置功能以实现基于高级AI的系统的顶级自然语言处理包。
这是用于自然语言处理的顶级Python库的列表:
NLTKspaCyGensimNLTK(自然语言工具包)
NLTK被认为是分析人类语言和行为的最佳Python软件包。NLTK库是大多数数据科学家的首选,它提供易于使用的界面,其中包含50多种语料库和词汇资源,有助于描述人与人之间的互动以及构建基于AI的系统(例如推荐引擎)。
这是NLTK库的一些关键功能:
提供一套数据和文本处理方法,用于文本分析的分类,标记化,词干,标记,解析和语义推理。包含用于工业级NLP库的包装器,以构建复杂的系统,以帮助进行文本分类并查找人类语音的行为趋势和模式它带有描述计算语言学实现的综合指南和完整的API文档指南,可帮助所有新手开始使用NLP。它拥有庞大的用户和专业人员社区,它们提供全面的教程和快速指南,以学习如何使用Python进行计算语言学。spaCy
spaCy是一个免费的开源Python库,用于实现高级自然语言处理(NLP)技术。当您处理大量文本时,重要的是要了解文本的形态学意义以及如何将其分类以理解人类语言。通过spaCY可以轻松实现这些任务。
这是spaCY库的一些关键功能:
除了语言计算外,spaCy还提供了单独的模块来构建,训练和测试统计模型,从而更好地帮助您理解单词的含义。带有各种内置的语言注释,可帮助您分析句子的语法结构。这不仅有助于理解测试,还有助于查找句子中不同单词之间的关系。它可用于对包含缩写和多个标点符号的复杂嵌套令牌应用令牌化。除了非常强大和快速之外,spaCy还提供对51种以上语言的支持。Gensim
Gensim是另一个开源Python软件包,其建模旨在从大型文档和文本中提取语义主题,以通过统计模型和语言计算来处理,分析和预测人类行为。无论数据是原始数据还是非结构化数据,它都有能力处理庞大的数据。
以下是Genism的一些主要功能:
它可用于构建可通过理解每个单词的统计语义来有效分类文档的模型。它带有诸如Word2Vec,FastText,潜在语义分析之类的文本处理算法,这些算法研究文档中的统计共现模式,以过滤掉不必要的单词并构建仅具有重要功能的模型。提供可以导入并支持各种数据格式的I / O包装器和读取器。它具有简单直观的界面,可供初学者轻松使用。API学习曲线也很低,这解释了为什么许多开发人员喜欢此库。
原文链接:http://tecdat.cn/?p=20015
本文将说明单变量和多变量金融时间序列的不同模型,特别是条件均值和条件协方差矩阵、波动率的模型。
均值模型
本节探讨条件均值模型。
iid模型
我们从简单的iid模型开始。iid模型假定对数收益率xt为N维高斯时间序列:
均值和协方差矩阵的样本估计量分别是样本均值
和样本协方差矩阵
我们从生成数据开始,熟悉该过程并确保估计过程给出正确的结果(即完整性检查)。然后使用真实的市场数据并拟合不同的模型。
让我们生成合成iid数据并估算均值和协方差矩阵:
# 生成综合收益数据X <- rmvnorm(n = T, mean = mu, sigma = Sigma)# 样本估计(样本均值和样本协方差矩阵)mu_sm <- colMeans(X)Sigma_scm <- cov(X)# 误差norm(mu_sm - mu, "2")#>[1] 2.44norm(Sigma_scm - Sigma, "F")#>[1] 70.79
现在,让我们针对不同数量的观测值T再做一次:
# 首先生成所有数据X <- rmvnorm(n = T_max, mean = mu, sigma = Sigma)# 现在遍历样本的子集for (T_ in T_sweep) { # 样本估算 mu_sm <- colMeans(X_) Sigma_scm <- cov(X_) # 计算误差 error_mu_vs_T <- c(error_mu_vs_T, norm(mu_sm - mu, "2")) error_Sigma_vs_T <- c(error_Sigma_vs_T, norm(Sigma_scm - Sigma, "F"))# 绘图plot(T_sweep, error_mu_vs_T, main = "mu估计误差",
plot(T_sweep, error_Sigma_vs_T main = "Sigma估计中的误差", ylab = "误差"
单变量ARMA模型
对数收益率xt上的ARMA(p,q)模型是
其中wt是均值为零且方差为σ2的白噪声序列。模型的参数是系数ϕi,θi和噪声方差σ2。
请注意,ARIMA(p,d,q)模型是时间差分为d阶的ARMA(p,q)模型。因此,如果我们用xt代替对数价格,那么先前的对数收益模型实际上就是ARIMA(p,1,q)模型,因为一旦对数价格差分,我们就获得对数收益。
rugarch生成数据
我们将使用rugarch包 生成单变量ARMA数据,估计参数并进行预测。
首先,我们需要定义模型:
# 指定具有给定系数和参数的AR(1)模型#>#>*----------------------------------*#>* ARFIMA Model Spec *#>*----------------------------------*#>Conditional Mean Dynamics#>------------------------------------#>Mean Model : ARFIMA(1,0,0)#>Include Mean : TRUE #>#>Conditional Distribution#>------------------------------------#>Distribution : norm #>Includes Skew : FALSE #>Includes Shape : FALSE #>Includes Lambda : FALSE#> Level Fixed Include Estimate LB UB#>mu 0.01 1 1 0 NA NA#>ar1 -0.90 1 1 0 NA NA#>ma 0.00 0 0 0 NA NA#>arfima 0.00 0 0 0 NA NA#>archm 0.00 0 0 0 NA NA#>mxreg 0.00 0 0 0 NA NA#>sigma 0.20 1 1 0 NA NA#>alpha 0.00 0 0 0 NA NA#>beta 0.00 0 0 0 NA NA#>gamma 0.00 0 0 0 NA NA#>eta1 0.00 0 0 0 NA NA#>eta2 0.00 0 0 0 NA NA#>delta 0.00 0 0 0 NA NA#>lambda 0.00 0 0 0 NA NA#>vxreg 0.00 0 0 0 NA NA#>skew 0.00 0 0 0 NA NA#>shape 0.00 0 0 0 NA NA#>ghlambda 0.00 0 0 0 NA NA#>xi 0.00 0 0 0 NA NAfixed.pars#>$mu#>[1] 0.01#>#>$ar1#>[1] -0.9#>#>$sigma#>[1] 0.2true_params#> mu ar1 sigma #> 0.01 -0.90 0.20
然后,我们可以生成时间序列:
# 模拟一条路径apath(spec, n.sim = T)# 转换为xts并绘图plot(synth_log_returns, main = "ARMA模型的对数收益率"plot(synth_log_prices, main = "ARMA模型的对数价格"
ARMA模型
现在,我们可以估计参数(我们已经知道):
# 指定AR(1)模型arfimaspec(mean.model = list(armaOrder = c(1,0), include.mean = TRUE))# 估计模型#> mu ar1 sigma #> 0.0083 -0.8887 0.1987#> mu ar1 sigma #> 0.01 -0.90 0.20
我们还可以研究样本数量T对参数估计误差的影响:
# 循环for (T_ in T_sweep) { estim_coeffs_vs_T <- rbind(estim_coeffs_vs_T, coef(arma_fit)) error_coeffs_vs_T <- rbind(error_coeffs_vs_T, abs(coef(arma_fit) - true_params)/true_params)# 绘图matplot(T_sweep, estim_coeffs_vs_T, main = "估计的ARMA系数", xlab = "T", ylab = "值",
matplot(T_sweep, 100*error_coeffs_vs_T, main = "估计ARMA系数的相对误差", xlab = "T", ylab = "误差 (%)",
首先,真正的μ几乎为零,因此相对误差可能显得不稳定。在T = 800个样本之后,其他系数得到了很好的估计。
ARMA预测
为了进行健全性检查,我们现在将比较两个程序包 Forecast 和 rugarch的结果:
# 指定具有给定系数和参数的AR(1)模型spec(mean.model = list(armaOrder = c(1,0), include.mean = TRUE), fixed.pars = list(mu = 0.005, ar1 = -0.9, sigma = 0.1))# 生成长度为1000的序列arfima(arma_fixed_spec, n.sim = 1000)@path$seriesSim# 使用 rugarch包指定和拟合模型spec(mean.model = list(armaOrder = c(1,0), include.mean = TRUE))# 使用包“ forecast”拟合模型#>ARIMA(1,0,0) with non-zero mean #>#>Coefficients:#> ar1 mean#> -0.8982 0.0036#>s.e. 0.0139 0.0017#>#>sigma^2 estimated as 0.01004: log likelihood=881.6#>AIC=-1757.2 AICc=-1757.17 BIC=-1742.47# 比较模型系数#> ar1 intercept sigma #>-0.898181148 0.003574781 0.100222964#> mu ar1 sigma #> 0.003605805 -0.898750138 0.100199956
确实,这两个软件包给出了相同的结果。
ARMA模型选择
在先前的实验中,我们假设我们知道ARMA模型的阶数,即p = 1和q = 0。实际上,阶数是未知的,因此必须尝试不同的阶数组合。阶数越高,拟合越好,但这将不可避免地导致过度拟合。已经开发出许多方法来惩罚复杂性的增加以避免过度拟合,例如AIC,BIC,SIC,HQIC等。
# 尝试不同的组合# 查看排名#> AR MA Mean ARFIMA BIC converged#>1 1 0 1 0 -0.38249098 1#>2 1 1 1 0 -0.37883157 1#>3 2 0 1 0 -0.37736340 1#>4 1 2 1 0 -0.37503980 1#>5 2 1 1 0 -0.37459177 1#>6 3 0 1 0 -0.37164609 1#>7 1 3 1 0 -0.37143480 1#>8 2 2 1 0 -0.37107841 1#>9 3 1 1 0 -0.36795491 1#>10 2 3 1 0 -0.36732669 1#>11 3 2 1 0 -0.36379209 1#>12 3 3 1 0 -0.36058264 1#>13 0 3 1 0 -0.11875575 1#>14 0 2 1 0 0.02957266 1#>15 0 1 1 0 0.39326050 1#>16 0 0 1 0 1.17294875 1#选最好的armaOrder#>AR MA #> 1 0
在这种情况下,由于观察次数T = 1000足够大,因此阶数被正确地检测到。相反,如果尝试使用T = 200,则检测到的阶数为p = 1,q = 3。
ARMA预测
一旦估计了ARMA模型参数ϕi ^ i和θ^j,就可以使用该模型预测未来的值。例如,根据过去的信息对xt的预测是
并且预测误差将为xt-x ^ t = wt(假设参数已被估计),其方差为σ2。软件包 rugarch 使对样本外数据的预测变得简单:
# 估计模型(不包括样本外)coef(arma_fit)#> mu ar1 sigma #> 0.007212069 -0.898745183 0.200400119# 整个样本外的预测对数收益forecast_log_returns <- xts(arma_fore@forecast$seriesFor[1, ], dates_out_of_sample)# 恢复对数价格prev_log_price <- head(tail(synth_log_prices, out_of_sample+1), out_of_sample)# 对数收益图plot(cbind("fitted" = fitted(arma_fit),# 对数价格图plot(cbind("forecast" = forecast_log_prices, main = "对数价格预测", legend.loc = "topleft")
多元VARMA模型
对数收益率xt上的VARMA(p,q)模型是
其中wt是具有零均值和协方差矩阵Σw的白噪声序列。该模型的参数是矢量/矩阵系数ϕ0,Φi,Θj和噪声协方差矩阵Σw。
比较
让我们首先加载S&P500:
# 加载标普500数据head(SP500_index_prices)#> SP500#>2012-01-03 1277.06#>2012-01-04 1277.30#>2012-01-05 1281.06#>2012-01-06 1277.81#>2012-01-09 1280.70#>2012-01-10 1292.08# 准备训练和测试数据logreturns_trn <- logreturns[1:T_trn]logreturns_tst <- logreturns[-c(1:T_trn)]# 绘图{ plot(logreturns, addEventLines(xts("训练"
现在,我们使用训练数据(即,对于t = 1,…,Ttrnt = 1,…,Ttrn)来拟合不同的模型(请注意,通过指示排除了样本外数据 out.sample = T_tst)。特别是,我们将考虑iid模型,AR模型,ARMA模型以及一些ARCH和GARCH模型(稍后将对方差建模进行更详细的研究)。
# 拟合i.i.d.模型coef(iid_fit)#> mu sigma #>0.0005712982 0.0073516993mean(logreturns_trn)#>[1] 0.0005681388sd(logreturns_trn)#>[1] 0.007360208# 拟合AR(1)模型coef(ar_fit)#> mu ar1 sigma #> 0.0005678014 -0.0220185181 0.0073532716# 拟合ARMA(2,2)模型coef(arma_fit)#> mu ar1 ar2 ma1 ma2 sigma #> 0.0007223304 0.0268612636 0.9095552008 -0.0832923604 -0.9328475211 0.0072573570# 拟合ARMA(1,1)+ ARCH(1)模型coef(arch_fit)#> mu ar1 ma1 omega alpha1 #> 6.321441e-04 8.720929e-02 -9.391019e-02 4.898885e-05 9.986975e-02#拟合ARMA(0,0)+ARCH(10)模型coef(long_arch_fit)#> mu omega alpha1 alpha2 alpha3 alpha4 alpha5 #>7.490786e-04 2.452099e-05 6.888561e-02 7.207551e-02 1.419938e-01 1.909541e-02 3.082806e-02 #> alpha6 alpha7 alpha8 alpha9 alpha10 #>4.026539e-02 3.050040e-07 9.260183e-02 1.150128e-01 1.068426e-06# 拟合ARMA(1,1)+GARCH(1,1)模型coef(garch_fit)#> mu ar1 ma1 omega alpha1 beta1 #> 6.660346e-04 9.664597e-01 -1.000000e+00 7.066506e-06 1.257786e-01 7.470725e-01
我们使用不同的模型来预测对数收益率:
# 准备预测样本外周期的对数收益# i.i.d.模型预测forecast(iid_fit, n.ahead = 1, n.roll = T_tst - 1) dates_out_of_sample)# AR(1)模型进行预测forecast(ar_fit, n.ahead = 1, n.roll = T_tst - 1) dates_out_of_sample)# ARMA(2,2)模型进行预测forecast(arma_fit, n.ahead = 1, n.roll = T_tst - 1) dates_out_of_sample)# 使用ARMA(1,1)+ ARCH(1)模型进行预测forecast(arch_fit, n.ahead = 1, n.roll = T_tst - 1) dates_out_of_sample)# ARMA(0,0)+ARCH(10)模型预测forecast(long_arch_fit, n.ahead = 1, n.roll = T_tst - 1) dates_out_of_sample)# ARMA(1,1)+GARCH(1,1)模型预测forecast(garch_fit, n.ahead = 1, n.roll = T_tst - 1) dates_out_of_sample)
我们可以计算不同模型的预测误差(样本内和样本外):
print(error_var)#> in-sample out-of-sample#>iid 5.417266e-05 8.975710e-05#>AR(1) 5.414645e-05 9.006139e-05#>ARMA(2,2) 5.265204e-05 1.353213e-04#>ARMA(1,1) + ARCH(1) 5.415836e-05 8.983266e-05#>ARCH(10) 5.417266e-05 8.975710e-05#>ARMA(1,1) + GARCH(1,1) 5.339071e-05 9.244012e-05
我们可以观察到,随着模型复杂度的增加,样本内误差趋于变小(由于拟合数据的自由度更高),尽管差异可以忽略不计。重要的实际上是样本外误差:我们可以看到,增加模型复杂度可能会得出较差的结果。就预测收益的误差而言,似乎最简单的iid模型已经足够了。
最后,让我们展示一些样本外误差的图表:
plot(error, main = "不同模型收益预测的样本外误差",
请注意,由于我们没有重新拟合模型,因此随着时间的发展,误差越大(对于ARCH建模尤其明显)。
滚动窗口比较
让我们首先通过一个简单的示例比较静态预测与滚动预测的概念:
#ARMA(2,2)模型spec <- spec(mean.model = list(armaOrder = c(2,2), include.mean = TRUE))# 静态拟合和预测ar_static_fit <- fit(spec = spec, data = logreturns, out.sample = T_tst)#滚动拟合和预测modelroll <- aroll(spec = spec, data = logreturns, n.ahead = 1, # 预测图plot(cbind("static forecast" = ar_static_fore_logreturns, main = "使用ARMA(2,2)模型进行预测", legend.loc = "topleft")# 预测误差图plot(error_logreturns, col = c("black", "red"), lwd = 2, main = "ARMA(2,2)模型的预测误差", legend.loc = "topleft")
我们可以清楚地观察到滚动窗口过程对时间序列的影响。
现在,我们可以在滚动窗口的基础上重做所有模型的所有预测:
# 基于i.i.d.模型的滚动预测roll(iid_spec, data = logreturns, n.ahead = 1, forecast.length = T_t# AR(1)模型的滚动预测roll(ar_spec, data = logreturns, n.ahead = 1, forecast.length = T_tst, # ARMA(2,2)模型的滚动预测roll(arma_spec, data = logreturns, n.ahead = 1, forecast.length = T_tst, # ARMA(1,1)+ ARCH(1)模型的滚动预测roll(arch_spec, data = logreturns, n.ahead = 1, forecast.length = T_tst, refit.every = 50, refit.win# ARMA(0,0)+ ARCH(10)模型的滚动预测roll(long_arch_spec, data = logreturns, n.ahead = 1, forecast.length = T_tst, refit.every = 50, # ARMA(1,1)+ GARCH(1,1)模型的滚动预测roll(garch_spec, data = logreturns, n.ahead = 1, forecast.length = T_tst, refit.every = 50, refit.window
让我们看看滚动基准情况下的预测误差:
print(rolling_error_var)#> in-sample out-of-sample#>iid 5.417266e-05 8.974166e-05#>AR(1) 5.414645e-05 9.038057e-05#>ARMA(2,2) 5.265204e-05 8.924223e-05#>ARMA(1,1) + ARCH(1) 5.415836e-05 8.991902e-05#>ARCH(10) 5.417266e-05 8.976736e-05#>ARMA(1,1) + GARCH(1,1) 5.339071e-05 8.895682e-05
和一些图表:
plot(error_logreturns, main = "不同模型的滚动预测误差", legend.loc = "topleft"
我们看到,现在所有模型都拟合了时间序列。此外,我们在模型之间没有发现任何显着差异。
我们最终可以比较静态误差和滚动误差:
barplot(rbind(error_var[, "out-of-sample"], rolling_error_var[, "out-of-sample"]) col = c("darkblue", "darkgoldenrod"), legend = c("静态预测", "滚动预测"),
我们可以看到,滚动预测在某些情况下是必须的。因此,实际上,我们需要定期进行滚动预测改进。
方差模型
ARCH和GARCH模型
对数收益率残差wt的ARCH(m)模型为
其中zt是具有零均值和恒定方差的白噪声序列,而条件方差σ2t建模为
其中,m为模型阶数,ω>0,αi≥0为参数。
GARCH(m,s)模型使用σ2t上的递归项扩展了ARCH模型:
其中参数ω>0,αi≥0,βj≥0需要满足∑mi =1αi+ ∑sj = 1βj≤1的稳定性。
rugarch生成数据
首先,我们需要定义模型:
# 指定具有给定系数和参数的GARCH模型#>#>*---------------------------------*#>* GARCH Model Spec *#>*---------------------------------*#>#>Conditional Variance Dynamics #>------------------------------------#>GARCH Model : sGARCH(1,1)#>Variance Targeting : FALSE #>#>Conditional Mean Dynamics#>------------------------------------#>Mean Model : ARFIMA(1,0,0)#>Include Mean : TRUE #>GARCH-in-Mean : FALSE #>#>Conditional Distribution#>------------------------------------#>Distribution : norm #>Includes Skew : FALSE #>Includes Shape : FALSE #>Includes Lambda : FALSE#> Level Fixed Include Estimate LB UB#>mu 0.005 1 1 0 NA NA#>ar1 -0.900 1 1 0 NA NA#>ma 0.000 0 0 0 NA NA#>arfima 0.000 0 0 0 NA NA#>archm 0.000 0 0 0 NA NA#>mxreg 0.000 0 0 0 NA NA#>omega 0.001 1 1 0 NA NA#>alpha1 0.300 1 1 0 NA NA#>beta1 0.650 1 1 0 NA NA#>gamma 0.000 0 0 0 NA NA#>eta1 0.000 0 0 0 NA NA#>eta2 0.000 0 0 0 NA NA#>delta 0.000 0 0 0 NA NA#>lambda 0.000 0 0 0 NA NA#>vxreg 0.000 0 0 0 NA NA#>skew 0.000 0 0 0 NA NA#>shape 0.000 0 0 0 NA NA#>ghlambda 0.000 0 0 0 NA NA#>xi 0.000 0 0 0 NA NA#>$mu#>[1] 0.005#>#>$ar1#>[1] -0.9#>#>$omega#>[1] 0.001#>#>$alpha1#>[1] 0.3#>#>$beta1#>[1] 0.65true_params#> mu ar1 omega alpha1 beta1 #> 0.005 -0.900 0.001 0.300 0.650
然后,我们可以生成收益率时间序列:
# 模拟一条路径hpath(garch_spec, n.sim = T)#> num [1:2000, 1] 0.167 -0.217 # 绘图对数收益{ plot(synth_log_returns, main = "GARCH模型的对数收益", lwd = 1.5) lines(synth_volatility
GARCH
现在,我们可以估计参数:
# 指定一个GARCH模型ugarchspec(mean.model = list(armaOrder = c(1,0)# 估计模型coef(garch_fit)#> mu ar1 omega alpha1 beta1 #> 0.0036510100 -0.8902333595 0.0008811434 0.2810460728 0.6717486402#> mu ar1 omega alpha1 beta1 #> 0.005 -0.900 0.001 0.300 0.650# 系数误差#> mu ar1 omega alpha1 beta1 #>0.0013489900 0.0097666405 0.0001188566 0.0189539272 0.0217486402
我们还可以研究样本数量T对参数估计误差的影响:
# 循环for (T_ in T_sweep) { garch_fit error_coeffs_vs_T <- rbind(error_coeffs_vs_T, abs((coef(garch_fit) - true_params)/true_params)) estim_coeffs_vs_T <- rbind(estim_coeffs_vs_T, coef(garch_fit))# 绘图matplot(T_sweep, 100*error_coeffs_vs_T, main = "估计GARCH系数的相对误差", xlab = "T", ylab = "误差 (%)",
真实的ω几乎为零,因此误差非常不稳定。至于其他系数,就像在ARMA情况下一样,μ的估计确实很差(相对误差超过50%),而其他系数似乎在T = 800个样本后得到了很好的估计。
GARCH结果比较
作为健全性检查,我们现在将比较两个软件包 fGarch 和 rugarch的结果:
# 指定具有特定参数值的ARMA(0,0)-GARCH(1,1)作为数据生成过程garch_spec #生成长度为1000的数据path(garch_fixed_spec, n.sim = 1000)@path$# 使用“ rugarch”包指定和拟合模型rugarch_fit <- ugarchfit(spec = garch_spec, data = x)# 使用包“ fGarch”拟合模型garchFit(formula = ~ garch(1, 1), data = x, trace = FALSE)# 比较模型系数#> mu omega alpha1 beta1 #>0.09749904 0.01395109 0.13510445 0.73938595#> mu omega alpha1 beta1 #>0.09750394 0.01392648 0.13527024 0.73971658# 比较拟合的标准偏差print(head(fGarch_fi#>[1] 0.3513549 0.3254788 0.3037747 0.2869034 0.2735266 0.2708994print(head(rugar#>[1] 0.3538569 0.3275037 0.3053974 0.2881853 0.2745264 0.2716555
确实,这两个软件包给出了相同的结果。
使用rugarch包进行GARCH预测
一旦估计出GARCH模型的参数,就可以使用该模型预测未来的值。例如,基于过去的信息对条件方差的单步预测为
给定ω^ /(1-∑mi =1α^ i-∑sj =1β^ j)。软件包 rugarch 使对样本外数据的预测变得简单:
# 估计模型,不包括样本外garch_fit coef(garch_fit)#> mu ar1 omega alpha1 beta1 #> 0.0034964331 -0.8996287630 0.0006531088 0.3058756796 0.6815452241# 预测整个样本的对数收益garch_fore@forecast$sigmaFor[1, ]# 对数收益图plot(cbind("fitted" = fitted(garch_fit), main = "合成对数收益预测", legend.loc = "topleft")
#波动率对数收益图plot(cbind("fitted volatility" = sigma(garch_fit), main = "预测合成对数收益率的波动性", legend.loc = "topleft")
不同方法
让我们首先加载S&P500:
# 加载标准普尔500指数数据head(SP500_index_prices)#> SP500#>2008-01-02 1447.16#>2008-01-03 1447.16#>2008-01-04 1411.63#>2008-01-07 1416.18#>2008-01-08 1390.19#>2008-01-09 1409.13# 准备训练和测试数据x_trn <- x[1:T_trn]x_tst <- x[-c(1:T_trn)]# 绘图{ plot(x, main = "收益" addEventLines(xts("训练", in
常数
让我们从常数开始:
plot(cbind(sqrt(var_constant), x_trn) main = "常数")
移动平均值
现在,让我们使用平方收益的移动平均值:
plot(cbind(sqrt(var_t), x_trn), main = "基于简单滚动平方均值的包络线(时间段=20)
EWMA
指数加权移动平均线(EWMA):
请注意,这也可以建模为ETS(A,N,N)状态空间模型:
plot(cbind(std_t, x_trn), main = "基于平方EWMA的包络")
乘法ETS
我们还可以尝试ETS模型的不同变体。例如,具有状态空间模型的乘性噪声版本ETS(M,N,N):