《matlab数据的读入和预处理.pdf》由会员分享,可在线阅读,更多相关《matlab数据的读入和预处理.pdf(7页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、金融计算与编程(2007 年 1 月)上海财经大学金融学院曹志广 1第三讲 数据的读入和预处理 在金融研究以及金融理论的实际应用上,大量的金融数据是不可或缺的。金融理论提供了丰富的模型,但理论模型的实证检验需要大量的金融数据。金融模型的实际应用也需要大量金融数据来估计或标定其中的参数。比如:资本资产定价模型(CAPM)中值的估计;期权定价中标的资产收益率的波动率估计等都需要实际数据。MATLAB提供了在主窗口直接输入和利用xlsread、textread、fopen 等函数直接读取数据两种方式。在主窗口直接输入数据对于少量数据是合适的,但金融领域的研究者和金融行业的金融理论应用人士经常面临大量
2、的金融数据,利用MATLAB提供的内部函数直接读取数据是非常必要的。由于大部分的金融数据来自各种机构提供的数据库,这些数据库数据的输出大多会支持EXCEL和文本文件的输出格式。因此本节介绍如何利用MATLAB提供的xlsread和textread函数来读取*.xls和*.txt数据文件。1EXCEL数据文件的读取 利用 MATLAB 提供的函数xlsread可以方便地读取数据文件中的数值型数据,对于 EXCEL文件中的字符型变量xlsread将不读取或以NaN(在MATLAB 中 NaN表示“不是一个数”)表示。其最简单的调用格式为在MATLAB命令窗口输入:x=xlsread(filenam
3、e),其中 filename为在 MATLAB 自动搜索文件夹下的EXCEL文件名,文件filename中的数值型数据矩阵赋值给变量x。filename可以不带后缀.xls。上证综合指数EXCEL文件 下面以上证综合指数为例,给读者介绍如何使用xlsread读取数据。图显示了上证综合指数的EXCEL文件中的部分数据(仅显示了其中前20 行的数据),其中 EXCEL 文件中的第一列为日期,第二列为与第一列日期相应的上证综合指数。由于日期型数据在EXCEL中是可以与数值相互转化的,因而 xlsread是可以读取日期型数据的。如果该EXCEL文件位于MATLAB自动搜索文件夹下,比如:D:matla
4、bworkindex.xls。则在MATLAB命令窗口输入:x=xlsread(index)金融计算与编程(2007 年 1 月)上海财经大学金融学院曹志广 2后得到变量x,x为 n 行 2 列的矩阵,第一列为日期,第二列为指数。其中n 与该文件中的数据长度一致,如数据包含1000 天的上证综合指数,则n 为 1000。这里注意两点:(1)读出的数据赋值给变量x,x的第一列为日期,但在MATLAB的输出格式中变成了数值型。比如图1.1 中的第一个日期在EXCEL表中显示为1990-12-19,如果读者在EXCEL 表中将其转换为数值型,则在 EXCEL表中显示为33226。因此,在 MATLA
5、B 读入该文件的时候该日期就变成了数值33226;(2)MATLAB提供了一个数值与表示日期的字符型变量相互转换的函数datenum(将日期转换为数值)和datestr(将数值转换为日期),但这种转换与EXCEL中数值和日期型变量的转换是有差异的。在 MATLAB 中以 0000 年 1 月 1 日作为起点,将这一天转换为数值1,相应的0000 年 1 月 2 日就转换为2,而在EXCEL中以 1900 年 1月 1 日为起点,将这一天转换为1。因此,前面的例子中的数据读入MATLAB,并赋值给变量x 后,如果要将日期还原到正确 的日期,则在MATLAB 命令窗口下输入:x(:,1)=x(:,
6、1)+datenum(30-Dec-1 899);即 可。当然 也可以直接调用MATLAB内部函数x2mdate,在MATLAB命令窗口下输入:x(:,1)=x2mdate(x(:,1)进行转换。综合以上例子,可以在MATLAB 命令窗口下输入以下命令得到图1.2。%后面的内 容表示对命令的解释 和说明。clear x=xlsread(index);%读取 EXCEL文件 x(:,1)=x(:,1)+datenum(30-Dec-1 899);%将日期还 原h=fi gure;%生 成空的图 形set(h,color,w);%将图的 背景颜色设 定为 白色plot(x(:,1),x(:,2);
7、%以 x 的第一列为 横轴 第二列为 纵轴 作图 datetick(x,23);%将横轴 转成日期格式mm/dd/yyyy xlabel(Date);%生 成横坐 标标 记title(Shanghai Composite);%生 成图 形名称01/01/199001/01/199501/01/200001/01/200505001000150020002500DateShanghai Composite 上证综合指数走势金融计算与编程(2007 年 1 月)上海财经大学金融学院曹志广 3初次 使用 xlsread读取数据文件的读者可能会出 现打 不开文件的 情形。下面就读者可 能经常 碰到的一
8、些 问题做 出说明。有些读者在可 能 MATLAB 命令窗口下输入x=xlsread(index);后 MATLAB 提醒找 不到该文件。读者可以在MATLAB 中 File菜单中 选择 Set Pat h 进行路径设置,将 EXCEL文件 index.xls所在的文件夹 置于搜索 路径之 下,然后点 击 Save进行保存即 可。有些读者可能碰 到无法 读取数据的 情形,MATLAB提醒文件不包含有 效的 EXCEL 数据。这时,读者可以将EXCEL文件中 说明性 的字符,比如:对每一列变量 做出说明 的某些字符等 整行删除即 可。比如:在上 海大智慧投 资咨询公司 提供的大 智慧平台 下载数
9、据得到EXCEL 文件数据如图所示,则读取文件时就会出 现这 样的错误。这时可以将文件中的第一行和第二行直接整行删除 就可以了。通常在这 样处 理后在 EXCEL数据中 某些列中 仍夹杂着 一些 空格,这时 MATLAB读 入 时 将 其 以NaN 代 替。也 有 些 读 者 在MATLAB 命 令 窗 口 下 输 入x=xlsread(filename);后出 现这样的情形,即得到的变量x 的列数比EXCEL文件中数据的列数少,这可 能是 EXCEL数据文件中的第一列或前面的几列数据为字符型,MATLAB在读入数据时忽略 了这些列。大智慧 下载数据 使用 xlsread读取数据文件有两个明显
10、的缺点。一是xlsread不能读取字符型变量,因此要读取 某些包含字符型变量的文件就不能使用 xlsread。另外 EXCEL文件中的数据长度是有限定的,EXCEL2000 单个 工作表的最大行数为65536,每一行最大列数为256 列。但有时候要 处理的金融数据量会超出这个 范围,这时候不得不将数据分拆成几个 EXCEL文件后分 别用 xlsread读取。而MATLAB 提供的textread函数可以 很好 地解决 以上两个 问题。2文本数据文件的读取 对于*.txt、*.csv 等类型的数据文件,如果 知道 数据文件中 每一列数据的 类型,即字符型、数值型等。则可以使用MATLAB 提供的
11、 textread函数方便地 进行读取。对于textread函数的 详细 了解可以在MATLAB命令窗口下输入help textread或 doc textread来了 解。下面以位于MATLAB自动搜索文件夹下的上证综合指数数据文件,比如:金融计算与编程(2007 年 1 月)上海财经大学金融学院曹志广 4D:matlabwork000001.txt,为例来进行解释 如何调用textread。图显示了该文件的部分数据,该数据文件包含7 列的数据,分别为时 间、开盘 价、最 高价、最低价、收 盘价、成 交量和成 交额,数据包含了了1990 年 12 月 19 日到 2006 年9 月 27 日
12、上证综合指数行情。在 MATLAB 命令窗口下输入以下命令:a,b,c,d,e,f,g=textread(000001.txt,%s%f%f%f%f%f%f,headerlines,1);其中上 述命令中的输出变量a,b,c,d,e,f,g 分别表示时 间、开盘 价、最 高价、最低价、收 盘价、成 交量和成 交额 列向量,a为表示时 间的字符型变量。textread函数的输入部分中,000001.txt表示文件名;%s 表示以字符型方式读入变量;%f表示以 浮点数值型方式读入变量;headerlines,1 表示文件的第一行为标题,不需要读入。注意:textread函数的输入部分中%s%f%f
13、%f%f%f%f 是与输出 a,b,c,d,e,f,g一一对应的;另外 这里文件名的后缀.txt不能省略,否则MATLAB会给出不 能找 到该文件的提醒。这个例子有点特殊,第一列的时间数据也可以以 浮点数值型方式读入。在MATLAB 命令窗口下输入以下命令:a,b,c,d,e,f,g=textread(000001.txt,%f%f%f%f%f%f%f,headerlines,1);但这时读出的日期变成了数值。比如:2006 年 9 月 27 日就变成了数值20060927。上证综合指数文本数据文件 下面 再给出一个读取 美国债券市场数据的例子。数据文件名为bonds.txt,部分数据内 容如
14、图 所示。其中crspid表示 债券 的 CRS P识别码、cusip 表示 债券的 CUSIP 代码、name 表示 债券 名称、matdt表示 债券 到期日、type 表示 类型、couprt 表示 票面利率。t ype 和 couprt 两列的数据分别为整数和 浮点数值型变量,其他列的数据 全部为字符型变量。金融计算与编程(2007 年 1 月)上海财经大学金融学院曹志广 5美国债券市场文本数据文件 对于上面bonds.txt的读取可以在MATLAB 命令窗口下输入以下命令:a,b,c,d,e,f =textread(bonds.txt,%s%s%s%s%u%f,headerlines,
15、1);其中 textread输入部分中的%u 表示以 整数方式读入。3数据的 预处 理 在得到数据并成功读入数据后,从严谨 的角度来 看,还不 能直接 运用这些数据来 做实证分 析或参数估计。无论初始 的数据来 源何处,数据中 总是有可 能存 在这样或那样 的错误。比如:股票 数据中 存在一些异常值,价格序列中出 现了负值或异常大的数值;股票 数据中的 交易 日期 序列某些地方出 现了日期 颠倒;数据中的某些部分为NaN;部分数据缺失等。因此,还必须对数据 进行剔除错误 的预处理。对于大量数据而言,手工进 行错误判断 和除错 是不 现实的。然而 借助 MATLAB强大的计 算功能 可以有 效地
16、对数据 进行剔除错误 的预处 理,但这必 须事先 给出数据中是 否存 在错误 的判断 标准。这些 判断 标准的提出与对 所处 理的数据本 身的了解是密切 相关的,比如:数据 代表的实际对 象等,判断 标准也与数据 处理者的经验有 关。同时要注意 避免 在除错 的过程 中引入新的错误。下面以上证综合指数文本数据文件为例,给出常见的一些 除错处 理方 法。(1)数据读入 假定我们只 需要时 间、开盘 价、最 高价、最 低价、收 盘价数据,在MATLAB命令窗口下输入以下命令:a,b,c,d,e=textread(000001.txt,%s%f%f%f%f%*f%*f,headerlines,1);
17、其中 textread输入部分中的%*f表示 忽略 该列的数据读入。因此,a、b、c、d、e 为分 别表示时 间、开盘 价、最 高价、最 低价、收 盘价的列 向量。注意,这里我们字符型方式读入了日期变量a,但这里读入的格式与MATLAB认可的日期格式不同。因此,需要 编写 一段程序 将其转换为 正确 的 MATLAB 可以 处理的日期数据。为此,在MATLAB 命令窗口下输入以下命令:x=str vcat(a);%将 cell型数 组转换为 普通 矩阵 a=datenum(str2num(x(:,1:4),str2num(x(:,5:6),str2num(x(:,7:8);金融计算与编程(20
18、07 年 1 月)上海财经大学金融学院曹志广 6这样日期变量a 就转换成了MATLAB 可以 处理的以数值表示的日期变量a。(2)检验日期变量 为检验日期变量是否存 在错误,我们 必须事先 给出一些 判断错误 的标 准。这里我们 列出以下标 准:日期数据是 否按照升序 或降序排 列(如果数据用于时间序列分 析,数据的日期顺序 就显得 很重 要);日期有 无异常值(比如:超出了 某一范围);日期中是 否存 在星期六和星期天(因为 我们知道星 期六和星期天上 海证券交易所 是不 交易 的)或其 他应该 休市 的节 假日(比如:国庆 节、元旦、春节等);日期是 否遗漏 了某些应该 交易 的交易 日;
19、是 否存 在重复 的交易 日期等。下面仅给出日期数据是否按照升序或降序排 列和日期中是否存 在星 期六和星期天的检验,其他查错 的检验,读者可以自行检查。读者也可以自己给出一些判断错误 的标 准来对数据 进行审查。检验日期数据是否按照升序 或降序排 列,可以在MATLAB命令窗口下输入以下命令:lo gi c=issorted(a);%判断 日期数据是 否按照升序排列 if logi c=1 disp(the date is sorted in ascendin g order);else logi c=issorted(flipud(a);%将日期上下颠倒 后判断 日期数据是否按照升序排 列
20、 if logi c=1 disp(the date is sorted in descendin g order);else disp(the date is disordered);end end 上述命令将给出日期数据是否按照升序 或降序排 列的输出。如果输出 结果为the date is disordered,则可以在MATLAB 命令窗口下输入以下命令对时间、开盘价、最 高价、最 低价、收 盘价数据 按照 日期 升序 方式 进行重新排 列:a,index =sort(a);%将时 间按照升序 方式 进行重新排 列 b=b(index);%将开盘 价按时间升序 方式 进行重新排 列 c
21、=c(index);%将最 高价按时间升序 方式 进行重新排 列 d=d(index);%将最 低价按时间升序 方式 进行重新排 列 e=e(index);%将收 盘价按时间升序 方式 进行重新排 列 检查日期中是 否存 在星期六和星期天,可以在 MATLAB 命令窗口下输入以下命令:N=weekda y(a);%判断 日期是 星期几if isempty(find(N=7|N=1)disp(there are no saturdays or sundays);else S=find(N=7|N=1)sprintf(row%d is Saturda y or Sundayn,S)%列出日期是 星
22、期六或星期天在列 向量 a 中的位 置end 如果上 述命令 运行后显示数据中存在星期六或星期天,要将 星期六或星期天的 交易数据 剔除,在 MATLAB 命令窗口下输入以下命令:a(S)=;b(S)=;c(S)=;d(S)=;e(S)=;(3)检验其 他变量 类似 地,对 开盘 价、最 高价、最 低价、收 盘价数据的检 查也需要 设定判定错金融计算与编程(2007 年 1 月)上海财经大学金融学院曹志广 7误的标 准。比如可以 设定以下标 准:价格是 否存 在负数和其 他异常数据;开盘 价和收 盘价是 否介于 当天最 高价和最 低价之间 等。下面仅给出 开盘 价和收 盘价是 否介于 当天最
23、高价和最 低价之间 的检验。检验开盘 价是 否介于 当天最 高价和最 低价之间 可以在 MATLAB命令窗口下输入以下命令:open_hi gh=find(c-b=0)=1);%判断开盘 价是 否低 于最 高价;if isempty(open _hi gh)disp(open price is lower than t he hi ghest price)else sprintf(open pri ce of row%d is greater t han t he hi ghest pri cen,open_hi gh)end open_low=find(c-d=0)=1);%判断开盘 价是
24、否高 于最 低价 if isempty(open _low)disp(open price is hi gher t han t he lowest price)else sprintf(open pri ce of row%d is lower t han t he lowest pri cen,open_low)end 如果需要 剔除 异常的 开盘 价所对应日期的其他所 有数据,可以在MATLAB命令窗口下输入以下命令:a(open_hi gh;open_low )=;b(open_hi gh;open_low )=;c(open_hi gh;open_low )=;d(open_hi gh;open_low )=;e(open_hi gh;open_low )=;类似 地,将以上 程序稍 作修改 就可以用来检验收盘价是 否介于 当天最 高价和最 低价之间。