金融时间序列文本文件的转换Á函数ascii2fts从一个文本数据文件(..txt)中创建了一个金融时间序列对象,如果文本数据文件符合下列的格式:Á包含标题文本行Á包含标题信息.标题信息必须在数据信息列之前,除非文件中不需要输入的行被规定。Á最左边的一列必须是日期,而且日期必须是一个有效的日期字符串格式。'ddmmmyy'或'ddmmmyyyy''mm/dd/yy'或'mm/dd/yyyy''dd-mmm-yy'或'dd-mmm-yyyy''mmm.dd,yy'或'mmm.dd,yyyy'Á·每一列必须用空格键或tab键分开调用方式:Átsobj=ascii2fts(filename,descrow,colheadrow,skiprows);Átsobj=ascii2fts(filename,timedata,descrow,colheadrow,skiprows)Á输入参数:filename%文件名,必须用单引号括起来descrow%(Optional)确定文本文件中文字说明的行数colheadrow%(Optional)说明每列变量名所在的行数skiprows%(Optional)ASCII文件中不需要输入的行数timedata%判定是否包含时间信息,若是输入字符串“t”,若不是则输入“nt”Á以金融工具箱自带的数据文件disney.dat为例Á(1)查看文件内容typedisney.datdisfts=ascii2fts('disney.dat')???Errorusing==ascii2fts….原因是文件disney.dat的前3行不是数据而描述数据的内容,因此直接调用函数ascii2fts就无法识别该文件disfts=ascii2fts('disney.dat',1,3,2)例子:数据文件times.txt,内容如下:Á1/3/0912:0036.7536.906336.656336.8751167900Á1/4/0912:003737.281336.62537.15631994700times1=ascii2fts('times.txt',’t’)金融时间序列的使用Á时间序列数据的提取与索引(一)从金融时间序列数据中提取数据(1)创建一个金融时间序列对象myfts(2)创建一个仅仅包含series2值的时间序列srs2=myfts.series2总结:时间序列srs2包含了myfts的所有日期和字段名为series2的数据序列,而且数据序列的名称仍然是原始时间序列对象myfts的名称.Áextfield功能:实现对时间序列数据的抽取Á调用方式:ftse=extfield(tsobj,fieldnames)%从tsobj中提取日期和字段名为fieldnames的数据序列成一个新的金融时间序列对象ftse.ftse包含tsobj中所有的日期,但是较少的数据序列输入参数:tsobj%原始数据fieldnames%原始数据中的字段名Á注意:执行ftse=extfield(myfts,'Series2')与ftse=myfts.Series2得到的结果是相同的Á金融时间序列的索引用户可以使用一个字符串日期,字符串日期范围,字符串日期的单元数组或普通的整数对金融时间序列进行索引.但是,用户不能使用序数型日期对金融时间序列进行索引※每一个字符串日期必须包含日,月和年.※每当数据通过一个频率转换时,所有的数据落在显示的时间日期的末端,例如,每周的数据是星期五,每月的数据是每月的最后一天等等Á1、对字符串日期进行索引例如,从上例的时间序列myfts中提取2008年3月8日的所有值,执行:myfts('03/08/08')从myfts中提取2008年3月8日的series2的值myfts.series2('03/08/08')从myfts中提取2008年3月8日,3月10日和3月15日的所有值,执行:myfts({'03/08/08','03/10/08','03/15/08'})从myfts中提取2008年3月8日,3月10日和3月15日的series2的值,执行:myfts.series2({'03/08/08','03/10/08','03/15/08'})Á2、对日期字符串范围进行索引从时间序列对象myfts中提取2008年3月8日到3月15日的所有值,执行:myfts({'03/08/08::03/15/08'})注意:一个日期字符串的范围是由双冒号(::)分开的两个日期字符串构成如果一个日期不存在于时间序列对象中,一个错误的信息将会出现myfts.series2({'03/10/08::03/19/08'})Á3、用整数索引时间序列对象的内容整数是MATLAB的普通索引形式。索引从1开始(不是0);index=1对应于第1个元素,index=2对应于第2个元素,依次类推。例如,提取myfts中series2的第一项,执行:myfts.series2(1)提取myfts中series2的第1,3,5项,执行:myfts.series2([135])提取myfts的最后一项,执行:myfts(end)Á4、包含时间信息的金融时间序列的索引data=round(10*rand(6,2));fts=fints({'01-Jan-200811:00';'01-Jan-200812:00';'02-Jan-200811:00';...,'02-Jan-200812:00';'03-Jan-200811:00';'03-Jan-200812:00'},data)fts('01-Jan-200812:00')%对2008年1月1日,12:00进行索引fts('01-Jan-200812:00::03-Jan-200811:00')%使用(::)对包含时间的日期进行索引练习:任意找一支股票,把数据导入EXCEL中,然后转换成MATLAB的时间序列格式,要求:(1)仅仅包含该股票从2008年3月1日到4月1日的收盘价和最高价(2)desc的内容为股票的代码和名称(3)以周为频率(4)显示该股票在2008年3月8日,3月12日及3月15日的最高价,最低价和成交量。(5)把该股票的最高价序列降序排列hyzhang_69@163.comÁ时间序列数据转换成矩阵数据tsmat=fts2mat(tsobj)tsmat=fts2mat(tsobj,datesflag)tsmat=fts2mat(tsobj,seriesnames)tsmat=fts2mat(tsobj,datesflag,seriesnames)输入参数:tsobj%需要转换的金融时间序列对象的名称datesflag%(Optional)表示转换成矩阵时是否要输出日期到矩阵中,datesflag=0(默认值)表示不输出日期到矩阵中,datesflag=1表示输出日期到矩阵中。seriesnames%(Optional)需要导出的某列数据序列的名称。输出参数:tsmat%表示转换后的矩阵。例如:提取myfts中的series2的数据:srs2_vec=fts2mat(myfts.series2)如果用户想让输出矩阵中包含日期:srs2_mtx=fts2mat(myfts.series2,1)金融时间序列数据转换为其它类型数据Á1、将时间序列数据保存为文本文件stat=fts2ascii(filename,tsobj,exttext)stat=fts2ascii(filename,dates,data,colheads,desc,exttext)Á输入参数:Áfilename%ASCII文件的名称Átsobj%需要转换的fints型格式的金融时间序列数据Áexttext%(Optional)不需要的描述项的行数Ádates%包含日期的列向量,日期格式必须是序数型Ádata%列转置矩阵.每一列是一个数据序列.Ácolheads%(Optional)列标题的单元数组;第1个单元列一定是日期列Ádesc%(Optional)描述性字符串,是文件的第1行.Á输出参数:Ástat%转换成功标志,1表示转换成功;0表示转换不成功。例如创建一个时间序列fints,然后将变量fints的内容保存到aa.txt文件中,执行代码如下:fints1=fts2ascii(‘aa.txt’,fints);fints=1表示转换成功,MATLAB的work目录下生成了aa.txt文件,调用type命令浏览文件的内容,执行:typeaa.txt2、把时间序列数据频率转换成规定的频率newfts=convertto(oldfts,newfreq)Á输入参数:Áoldfts%需要转换的数据Ánewfreq%转换的目标,根据要求具体情况如下:1,DAILY,Daily,daily,D,d为天2,WEEKLY,Weekly,weekly,W,w为周3,MONTHLY,Monthly,monthly,M,m为月4,QUARTERLY,Quarterly,quarterly,Q,q为季度5,SEMIANNUAL,Semiannual,semiannual,S,s为半年6,ANNUAL,Annual,annual,A,a为年Á3、时间序列中的缺失数据的处理Áewfts=fillts(oldfts,fill_method)Á输入参数:Áoldfts%金融时间序列对象的原始数据Áfill_method%(Optional)处理缺失值的方法,常用的有如下5种:Á'linear'或‘l’或'le'%线形插值方法(默认值)Á'cubic'或‘c’或'ce'%3次插值Á'spline'或's'或'se'%样条插值Á'nearest'或'n'或'ne'%最近插值法Á'pchip'或'p'或'pe'%逐段光滑的3次Hemite多项式法Á输出参数:Ánewfts%处理后的数据例子:首先,创建一个金融时间序列,在MATLAB中执行如下命令:Árandn('seed',0);%随机数的初值为0Áa=randn(6,1);%生成6行1列的随机数向量Áb=[today:today+5]';Áfts=fints(b,a)Áfts(3)=NaN;%将第3个数据变为缺失值NaNÁfts(3)%查看改变后的fts变量中第3个数据的值Áans=Ádesc:(none)Áfreq:Unknown(0)Á'dates:(1)''series1:(1)'Á'18-Feb-2008'[NaN]Ánewdata=fillts(fts,'linear');%利用线性插值处理fts中的缺失值Á总结:用户可以调用函数ascii2fts把外面数据文件中的数据导入MATLAB中;我们知道MATLAB的数值计算是以矩阵为基础的,我们又调用函数fts2mat将金融时间序列对象变成矩阵以至于方便计算;最后,金融时间序列对象在某些方面使用起来还是很方便的,于是又找了一个桥梁,利用函数fints将矩阵变回金融时间序列对象。