《python金融大数据分析》课件-第三章 数值特征及其应用_第1页
《python金融大数据分析》课件-第三章 数值特征及其应用_第2页
《python金融大数据分析》课件-第三章 数值特征及其应用_第3页
《python金融大数据分析》课件-第三章 数值特征及其应用_第4页
《python金融大数据分析》课件-第三章 数值特征及其应用_第5页
已阅读5页,还剩64页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第三章数值特征及其应用知识目标1.掌握均值、方差、峰度、偏度和分布特征的含义2.熟悉收益率数据的各统计量代表的经济含义。技能目标能够利用软件进行收益率时间序列的描述性统计分析,并判断收益率序列的特征、分布类型以及进行区间估计。学习目标目

录CONTENTS任务要求1必备知识2任务实施3任务小结41

任务要求 任务要求利用软件,对左表上证50指数的收益率数据进行描述性统计分析,并对均值进行区间估计?交易日期指数回报率2019-01-03-1.32172019-01-040.28512019-01-072.00082019-01-08-0.0142......2

必备知识 期望收益(均值)1风险(方差)2峰度和偏度3收益率的统计特征一均值是统计中用于描述数据集中位置的统计量,是描述集中趋势统计特征中最具代表性的数值。若收益率序列为则期望收益率的计算公式为:r

r1,r2

,.

.,rt

,1期望收益(均值)

期望收益(均值)在Python的pandas库中,求均值的函数为mean,用法是:DataFrame.mean(axis=0/1)其中参数axis=0或缺省,表示对各列求均值;如果axis=1,表示对各行求均值。以沪深300指数(CSI300)的收益率数据为例,计算收益率的均值,代码如下:#导入pandas库importpandasaspd#导入沪深300日收益率数据csi300=pd.read_excel('文件路径’,sheet_name=2)

csi300_means=csi300.mean() #计算日收益率print("日平均收益率:",csi300_means)输出结果如下,可以看出2018年到2021年四年沪深300指数平均日收益率约为0.0281%日平均收益率:0.000280568859863107341期望收益(均值)1如何才能知道每一年的沪深300指数回报率呢?年份平均回报率2018年2019年2020年2021年期望收益(均值)以沪深300指数(CSI300)的收益率数据为例,计算每年收益率的均值,代码如下:#导入所需库importpandasaspdimportdatetimeasdt#导入数据csi300=pd.read_excel(‘路径/沪深300收益率.xlsx',sheet_name=2)pandas.read_excel(io,sheet_name,header,names=None,index_col=None,usecols=None,squeeze=False,dtype=None,...),从Excel中读入数据框,其中:io:文件路径;sheet_name:获取的数据表;names:要使用的列名列表index_col:指定列为索引列,默认None列(0索引)用作DataFrame的行标签。usecols:int或list,默认为None。如果为None则解析所有列,如果为int则表示要解析的最后一列,如果为int列表则表示要解析的列号列表,如果字符串则表示以逗号分隔的Excel列字母和列范围列表(例如“A:E”或“A,C,E:F”)。1期望收益(均值)1以沪深300指数(CSI300)的收益率数据为例,计算每年收益率的均值,代码如下:#查看csi300的数据信息print(())():查看数据框的策略基本信息输出结果:<class‘pandas.core.frame.DataFrame’>数据类型:数据框RangeIndex:972entries,0to971索引行数:972行Datacolumns(total2columns):列数:2列#ColumnNon-NullCountDtype表格的列名,是否为空值和列字段类型----------------------------0日期972non-nulldatetime64[ns]1收益率972non-nullfloat64dtypes:datetime64[ns](1),float64(1)数据框包含的字段类型及数量memoryusage:15.3KB表格所占空间期望收益(均值)1以沪深300指数(CSI300)的收益率数据为例,计算每年收益率的均值,代码如下:#查看csi300的数据print(csi300.head(5))df.head():查看数据框df数据前几行df.tail():查看数据框df数据后几行输出结果:日期收益率02018-01-030.00586912018-01-040.00423722018-01-050.00240732018-01-080.00517342018-01-090.00700552018-01-100.004418期望收益(均值)以沪深300指数(CSI300)的收益率数据为例,计算2018-2021年沪深300指数平均收益率,代码和结果如下:#计算过去几年平均收益率csi300_mean=csi300['收益率'].mean()#将结果打印在屏幕上print(‘2018-2021年沪深300平均收益率为:',csi300_mean)输出结果:2018-2021年沪深300平均收益率为:0.000280568859863107341期望收益(均值)以沪深300指数(CSI300)的收益率数据为例,计算每年收益率的均值,代码和结果如下:##首先使用dt模块获取日期中的年,在csi300数据框中生产一个新列‘年’csi300['年']=csi300['日期'].dt.year##查看csi300数据框变化print(csi300.head(5))日期收益率年02018-01-030.005869201812018-01-040.004237201822018-01-050.002407201832018-01-080.005173201842018-01-090.00700520181期望收益(均值)以沪深300指数(CSI300)的收益率数据为例,计算每年收益率的均值,代码和结果如下:##按年进行分组csi300_year=csi300.groupby(‘年’)##查看每组的数据量print('每年的数据量分别为:',csi300_year.size())输出结果:每年的数据量分别为:2018242201924420202432021243dtype:int641期望收益(均值)以沪深300指数(CSI300)的收益率数据为例,计算每年收益率的均值,代码和结果如下:##查看每组的信息print(csi300_year.get_group(2021).head())输出结果:日期收益率年7292021-01-040.01082820217302021-01-050.01913220217312021-01-060.00915920217322021-01-070.01771820217332021-01-08-0.00330620211期望收益(均值)以沪深300指数(CSI300)的收益率数据为例,计算每年收益率的均值,代码和结果如下:#计算每一年的收益率csi300_year_mean=csi300_year['收益率'].mean()print('2018-2021年每年沪深300的平均收益率:',csi300_year_mean)输出结果:2018-2021年每年沪深300的平均收益率:2018-0.00117220190.00134120200.0010942021-0.000151Name:收益率,dtype:float641期望收益(均值)也可以使用Excel软件完成前面的分析,步骤如下:打开csi300收益率表一、计算2018-2021年沪深300的平均收益率有三种方法:1.鼠标点取‘收益率’这一列数据,Excel右下方即可出现数据序列相关统计指标。2.利用函数average()3.使用数据分析工具(1)调取数据分析工具文件-选项-加载项-分析工具库-转到-勾选‘分析工具库’(2)使用数据分析工具数据-数据分析-描述统计1期望收益(均值)也可以使用Excel软件完成前面的分析,步骤如下:打开csi300收益率表二、计算2018-2021年每年的沪深300的平均收益率1.生成分组变量‘年’在C1单元格输入变量名称‘年’,C2单元格输入公式”=year(A2)”,用此公式向下填充,提取出每一个‘日期’中的‘年份’。2.分类汇总选中‘收益率’和‘年’两列数据,点击“分类汇总”,设置“分类字段”为‘年’,‘汇总方式为“平均值”,“选定汇总项”勾选‘收益率’,继续勾选“替换当前分类汇总”、“每组数据分页”和“汇总结果显示在下方”,点击“确定”。3.查看结果点击Excel左上角生成的层级标签,1级为总平均数,2级为分组平均数。1Python代码实现DataFrame.var(axis=None,skipna=

None)axis:axis=0或缺省,对列求方差;

axis=1,对行求方差。skipna:排除空值。方差在统计学中是用于衡量一组数据离散程度的统计量,它描述了一组数据对其均值的偏离程度。

风险(方差)

2风险(方差)##计算计算过去几年的总方差csi300_var=csi300['收益率'].var()print('2018-2021年沪深300收益率的方差为:',csi300_var)输出结果:2018-2021年沪深300收益率的方差为:0.00017076871994312025例如:对沪深300指数的日收益率数据计算方差,编辑如下代码:可见沪深300指数的日收益率偏离期望收益的幅度约为0.000171,波动不大。2风险(方差)##计算每年的方差csi300_year_vars=csi300_year['收益率'].var()print('2018-2021年每年沪深300收益率的方差如下:',csi300_year_var)输出结果:2018-2021年每年沪深300收益率的方差如下:20180.00018220190.00015620200.00020620210.000137Name:收益率,dtype:float64例如:计算2018-2021年每年沪深300指数的日收益率方差,代码和结果如下:2偏度和峰度峰度偏度分布特征分析正态性检验数据的分布形状3数学公式:偏度又称偏态或偏态系数,是用于衡量数据分布非对称性的数字特征。求均值一组序列r

的均值r

的标准差Erμ

偏度和峰度3

偏度(1)偏度Skew<0:呈现左偏偏度Skew=0:分布相对均匀偏度Skew>0:呈现右偏偏度和峰度3偏度(1)##计算过去几年总偏度csi300_skew=csi300['收益率'].skew()print('2018-2021年沪深300收益率的偏度为:',csi300_skew)例如:使用沪深300指数的日收益率数据计算偏度,编辑如下代码:输出结果如下:2018-2021年沪深300收益率的偏度为:-0.3310587332573665skipna:排除空值。如果整个行/列均为空值,则结果为NA。0或缺省:对各列求偏度1:对各行求偏度偏度的P

y

t

h

o

n

实现DataFrame.skew(axis=None,skipna=None)偏度和峰度3偏度(1)##计算过去几年总偏度csi300_year_skew=csi300_year['收益率'].skew()print(‘2018-2021年每年沪深300收益率的偏度为\n:',csi300_year_skew)例如:使用沪深300指数的日收益率数据计算每年的偏度,编辑如下代码:2018-2021年每年沪深300收益率的偏度为:年2018-01699522020-0.8433382021-0.335569Name:收益率,dtype:float64偏度的P

y

t

h

o

n

实现偏度和峰度3偏度(1)Kurt=3,此时是正态分布,也称为常峰态。Kurt>3,尖峰态,相较于正态分布而言具有

较高的峰部和更长的尾部。Kurt<3,低峰态,相较于正态分布而言具有

较平坦的峰部和更短更细的尾部。峰度(

Kur

tosis)是衡量数据离群度的指标,也是对概率分布形状的刻画。数学公式是:

偏度和峰度3峰度(2)

DataFrame.kurt(axis=None,skipna=None)skipna:排除空值。如果整个行/列均为空值,则结果为NA。0或缺省:对各列求峰度1:对各行求峰度偏度和峰度3峰度(2)峰度的Python实现##计算峰度csi300_kurt=csi300['收益率’].kurt()print(‘2018-2021年沪深300收益率的峰度为:',csi300_kurt)输出结果如下:2018-2021年沪深300收益率的峰度为:3.052222865645297例如:使用沪深300指数的日收益率数据计算峰度,代码和结果如下:1.偏度和峰度的联系与区别:偏度和峰度都是用于描述分布形状特征的变量,差别在于偏度刻画的是分布的对称性,而峰度刻画的是分布的峰峭性。2.峰度和方差之间的关系紧密,区别微妙。峰度和方差的不同在于,方差衡量了随机变量偏离均值的分布状况,而峰度衡量了随机变量大幅偏离均值的可能性。方差较大,意味着随机变量分布较为分散,并没有聚集在均值附近。在给定方差情况下,峰度值较大意味着方差贡献主要是来自少数的极值,而不是偏离程度较为温和的数值。偏度和峰度3正态分布1二正态分布的统计检验2收益率的分布特征t

分布31正态分布其中,μ,σ2(σ>0)分别为X的均值和方差。称X服从参数为μ,σ2的正态分布,记为X~N(μ,σ2)。[μ-σ,μ+σ]68.3%[μ-2σ,μ+2σ]95.4%[μ-3σ,μ+3σ]99.7%对称轴:均值μ1正态分布智商误差身高体重工资当均值μ=0,方差σ=1时,正态分布称为标准正态分布。公式如下:

正态分布具有很多良好的特性,许多概率分布可以用它来近似:Seaborn.distplot(a,hist=True,kde=True,label=None)a:是待分析的一维数组变量。hist:

默认为True,代表显示为条形图kde:默认为True,代表直方图高度显示为密度而非计数。label:控制图像中的图例标签显示内容,只能显示英文形式。参数说明如下:直方图/

概率密度图的P

y

t

h

o

n

实现1正态分布import

seaborn

as

snsimportmatplotlib.pyplot

as

pltplt.rcParams[‘axes.unicode_minus’]=False

sns.set(font=‘SimHei’,style=‘white’

)

sns.distplot(csi300[‘收益率’])plt.xlabel("收益率")

plt.ylabel("概率密度")plt.show()例如:对沪深300指数的日收益率数据(csi300)绘制直方图,代码如下:1正态分布输出结果:1正态分布可以看到,沪深300指数的收益率序列近似于均值为

0

的正态分布。但图形观察过于主观,

因此还需要使用统计检验方法判断数据是否服从正态分布。偏度峰度尖峰厚尾K-S检验偏度=-

0.

331059峰度=3.

0522233

σ区间外仍分布了许多数据可能不服从正态分布,

用K-

S统计检验的方式进一步验证1正态分布根据计算出的沪深300指数的日收益率数据为例,通过偏度和峰度来检验正态性,可以得到:2正态分布的统计检验样本数据的分布函数样本数据的理想分布函数样本数据分布与指定分布之间的最大距离K-S检验用以检验一个分布与其理想分布是否相同D<临界值,分布相近D>临界值,分布不接近原假设p

-

v

a

l

u

e

<

5

%

,不成立p

-

v

a

l

u

e

>

5

%

,成立样本数据的分布与理想分布无显著差异。K-S原假设原假设为真时样本观察结果出现的概率p-value2正态分布的统计检验scipy.stats库中的kstest函数:1.rvs:指定要统计的数据(随机变量样本)。2.cdf:指定利用哪个概率分布对数据/变量进行分布拟合优度检验。当cdf=“norm”时,要检验的是正态分布;cdf=“chi2”时,检验卡方分布;当cdf=“t”时,检验t分布;当cdf=“f”时,检验F分布等。3.args:输入当rvs或cdf是字符串或引用对象时使用,输入形式为元组、序列。当cdf=“norm”时,args=(rvs.mean(),rvs.std()),即待检验数据的均值和方差。该函数会返回两个值[KStest

statistic,p],一个是KS检验统计量,另一个是p-value值。K

-

S

正态检验的P

y

t

h

o

n

实现kstest(rvs,cdf,args)参数说明如下:2正态分布的统计检验例:沪深300指数的日收益率数据(csi300)进行K-S检验,代码如下:#导入库包from

scipy.stats

importkstest ks_results

=

kstest(csi300_returns['收益率'],

"norm",(csi300_mean,csi300[收益率].std()))

print(ks_results)输出结果如下,可见K—S检验的p-value值小于0.05,可以拒绝原假设。statistic=0.051351784709457615,

pvalue=0.0114554958010557532正态分布的统计检验不服从正态分布拒绝原假设p-value<0.052t分布t分布χ2分布正态分布t服从自由度为n的t分布Y

服从自由度为n的卡方分布X

服从正态分布XY

/

nt

t分布与正态分布主要区别在于,t分布用小样本来估计呈正态分布且方差未知的分布。2t分布t分布的形态主要与自由度相关t分布曲线越平坦自由度越小t分布曲线越接近正态分布曲线自由度越大t分布曲线为标准正态分布曲线自由度n→∞2t分布scipy

库中提供了用于拟合t分布的函数stats.t.fitstats.t.fit(样本数据)kstest(rvs,“t”,(df,loc,scale)):kstest可对数据进行K-St分布检验待检验的样本数据t分布检验t分布拟合时获取的自由度、位置、尺度参数自由度(df)位置(loc)尺度(scale)结果2t分布fromscipy

import

stats#对收益率进行t分布拟合,以获取kstest-T检验的参数ks

=

stats.t.fit(csi300

['收益率'])

print(ks)

输出结果如下:(4.396340919043949,0.00044715260547665246,0.009816190534862565)例:对沪深300指数的日收益率数据(csi300)进行KS检验,检验其分布是否符合t分布。代码如下:自由度(df)位置(loc)尺度(scale)2t分布#传入T分布拟合的参数,对收益率数据进行t分布的KS统计检验ks_t_results=kstest(csi300['收益率'],"t",(ks[0],ks[1],ks[2]))

print(ks_t_results)输出结果如下:KstestResult(statistic=0.012459043343644893,pvalue=0.9977835431725136)pvalue>0.05结论:经过K-S检验后,得到的p-value值约为0.9978值明显大于0.05,即认为沪深300指数收益率序列分布与t分布没有显著差异的概率为99.78%。所以不能拒绝原假设,接受收益率服从t分布的假设。

例:对沪深300指数的日收益率数据(csi300)进行KS检验,检验其分布是否符合t分布。代码如下:收益率均值的区间估计三1

标准差

σ

已知2标准差

σ

未知收益率均值的区间估计置信区间区间估计95%估计方法置信度确保一定概率下总体均值的真实值所在的区间范围称为置信区间,

而估计置信区间的方法称为区间估计工资的区间?投资收益的区间?(0.2,0.3)2标准差已知设样本数据X的总体期望为μ,方差为σ2设α为置信度,当总体标准差已知时,总体均值近似1-α的可信度,分布在以下置信区间内:标准正态概率分布上侧面积为α/2时的z值。

/

nZ

x

样本均值近似服从正态分布

stats.norm.isf(q,loc,scale)Python的scipy库中norm.isf函数可以用于计算z值可选项,尺度参数正态分布上侧面积为q可选项,位置参数2标准差已知例:沪深300指数收益率序列中随机抽取50个样本,对2018年到2021年总体收益率的均值进行区间估计。假设收益率序列服从正态分布,总体方差已知。具体如下:#导入库包importnumpyasnp#

抽样函数所在库包fromscipyimportstats#

拟合z值包N=50;α=0.05#样本量为50;显著性水平为0.05sample300=

np.random.choice(csi300['收益率'],size=n)x_bar

=

sample300.mean() #样本均值z_a2

=

stats.norm.isf(a/2) #

计算

z_a2left

=

x_bar

-

z_a2*(csi300['收益率'].std()/np.sqrt(n))

right

=

x_bar

+

z_a2*(csi300['收益率'].std()/np.sqrt(n))print(

"该收益率序列95%的置信区间为",(left,right))

#注意为抽样统计,一般每次运行结果不一样

2标准差已知平均日收益为[-0.6505%,0.0739%]输出结果如下:该收益率序列95%的置信区间为(-0.006505291316666556,0.000739022345919538)2标准差已知2标准差未知设数据X总体期望为μ,方差未知。总体均值的区间以自由度为n-1的t分布为依据进行估计。总体均值以近似1-α的可信度,分布在以下置信区间内:概率分布上侧面积为α/2时的t值。s/

nt

x

样本均值近似服从自由度为n-1的t分布n

2

x

t (n

1) S ,

x

t (n

1) S

n

2

2标准差未知Python的scipy库中t.isf函数可以用于计算t值stats.t.isf(q,loc,scale)可选项,尺度参数t分布上侧面积为q可选项,位置参数2标准差未知例:沪深300指数收益率序列中随机抽取20个样本,对2018年到2021年总体收益率的均值进行区间估计。假设收益率序列服从t分布,总体方差未知。具体如下:importnumpyasnp#

抽样函数所在库包fromscipyimportstats#

拟合t值包n=20;a=0.05#样本量为20;显著性水平为0.05sample300=

np.random.choice(csi300['收益率'],size=n)x_bar

=

sample300.mean() #样本均值sigma=sample300.std()#样本标准差t_a2=

stats.t.isf(a/2,n-1) #

计算

t_a2left

=

x_bar

-

t_a2*(sigma/np.sqrt(n))

right

=

x_bar

+

t_a2*(sigma/np.sqrt(n))print(

"该收益率序列95%的置信区间为",(left,right))

#注意为抽样统计,一般每次运行结果不一样

2标准差未知平均日收益为[-0.2348%,1.0330%]输出结果如下:该收益率序列95%的置信区间为(-0.0023480565364275086,0.010329832917166628)3

任务实施 “任务要求”环节给出了上证50指数日收益率数据表,现在结合本任务所学的知识来进行任务实施。1.用描述性统计分析的方法计算均值、方差、峰度和偏度;2.绘制出时序图进行观察来进一步探索判断收益率序列是服从正态分布还是t分布;3.假设收益率序列服从正态分布,总体方差未知,大样本(构建t枢轴量)来对收益率的均值进行区间估计。任务实施1收益率的统计特征交易日期 收益率2019-01-03-0.0168392019-01-04-0.0029822019-01-070.0338642019-01-08-0.0072392019-01-090.003780导入上证50

指数数据,将“日期”列设为index

列,并查看数据。代码如下:import

pandas

as

pd

import

numpy

as

npsse50_returns

=

pd.read_excel('上证50指数.xlsx',index_col=0) #

导入数据print(sse50_returns.head())输出结果如下:1收益率的统计特征计算收益率的均值、方差、偏度和峰度,代码如下:输出结果如下:收益率的均值:0.000513799126335761收益率的方差:0.0001601916003140642收益率的偏度:-0.03805182

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论