Matlatb金融时间序列工具箱——建立金融时间序列

来源:互联网 发布:微淘互粉软件 编辑:程序博客网 时间:2024/05/22 05:00

好久没做东西,知识忘了大半。还好又翻到这个博文,感谢博主。

Matlatb金融时间序列工具箱(Financial Time Series Toolbox)

建立金融时间序列

金融时间序列是一个结构变量,有五个属性:描述(description)、频率(frequency)、日期(dates)、显示(display)和至少一个数据列向量名(dataname),前三个属性的名字是固定的,分别为desc、freq和dates,时间序列的名字用户可以自行规定,如不更改的话,matlab默认为series1、series2、……、seriesN。

一、利用函数fints来创建金触时间序列对象

根据输入参数的类型,可分为五种形式:

(1)简单的矩阵输入

格式:ftsdata=fints(dates_data)

输入:dates_data是一个矩阵,第一列是时间,从第二列开始是时间序列的样本数据。

(2)向量输入

格式:ftsdata=fints(dates,data)

输入:dates是时间列向量,或者是元包列(非数据型,即文本型日期); data是时间序列的样本数据。

(3)自定义时间序列名

格式:ftsdata=fints(dates,data,dataNames)

输入:dates是时间列向量,或者是元包列(非数据型,即文本型日期); data是时间序列的样本数据,dataNames是变量名,如果是多个,应该用元包{’name1’,’name2’,……,’nameN’}的形式输入。

(4)输入频率

格式:ftsdata=fints(dates,data,datanames,freq)

输入:dates是时间列向量,或者是元包列(非数据型,即文本型日期); data是时间序列的样本数据。Freq有固定的格式:

1.UNKNOWN,Unknown ,unknown,U,u

2.DAILY,Daily,daily,D,d,1

3.WEEKLY,Weekly ,weekly,W,w,2

4.MONTHLY,Monthly,monthly,M,m,3

5.QUARTERLY,Quarterly, quarterly,Q,q,4

6.SEMIANNUAL,Semiannual,semiannual,S,s,5

7.ANNUAL,Annual,annua,A,a,6

 

5.输入变量描述

格式:ftsdata=fints(dates,data,datanames,freq,desc)

输入:dates是时间列向量,或者是元包列(非数据型,即文本型日期); data是时间序列的样本数据。Desc的形式是单个的字符型变量。

注意:1.第一种矩阵输入的方式,日期必须是数值型,其余的四种日期可以是数值型也可以是字符型。

     2.所有的数据输入必须放在矩阵里,不能一个一个输入。

     3.变量名由于是字符型,所有要用到元包。

     4.描述性变量是单变量的字符型。

例子 创建日度数据(frequency=daily),变量名分别为data1、data2,描述字段为“实验数据”(desc=‘实验数据’).

     5. datanames的列要与时间序列的个数即data的列相同。

 

    例子,创建二元时间序列,第一个变量命名为data1,第二个变量命名为data2,数据的频率是日度数据,并给时间序列描述为“实验数据”

输入以下代码:

ftsdata=fints(dates,[data y],{'data1','data2'},1,'实验数据');

查看其第一行数据:

ftsdata(1)

则显示:

     desc:  实验数据

    freq:  Daily (1)

    'dates:  (1)'    'data1:  (1)'    'data2:  (1)'

    '03-Apr-1991'       727291]       988.05]

二、文本文件的转换方式(ascii2fts)(略)

三、调用金触时间序列对象(假设已经创建二维时间序列ftsdata)

    (1)查看整个时间序列对象

在命令窗口中输入时间序列对象的名字即可

    (2)查看部分行数据

跟查看矩阵的元素一样,查看第一行,就输入ftsdata(1)

(3)查看时间序列中的时间变量

法一:对象名.变量名

如    ftsdata.dates1

year(ftsdata.dates1) %查看时间序列的日期中的年份

month(ftsdata.dates1) %查看时间序列的日期中的月份

day(ftsdata.dates1) %查看时间序列的日期中的天

法二:ftse = extfiield(tsobj,fieldnames)

输入参数:

tsobj:对象名称

fieldnames:变量名称

例 ftse = extfiield(ftsdata,‘data1’)

其效果与ftsdata.data1相同。

(4)用时间标签提取数据

格式:newtsobj= tsobj(时间标签/整数标签)

1.时间标签引用:

时间标签的格式可以是文本格式,也可以是数值型的时间序列,可以是单个的也可以是多个的。

如:

ftsdata(‘3/4/2008’)

ftsdata({‘3/4/2008’, ‘10/4/2008’})

如果是连续日期则用双冒号隔开:

ftsdata({‘3/4/2008’ ::‘10/4/2008’})

这种引用方式,如果时间区间内有一个时间不在时间序列的中,则会提示出错。

2.整数标签引用:

    整数标签引用与引用向量的元素一样。

演示生成金融时间序列数据

%% 生成一列时间序列

format short g  %设置数据精度

load szchengzhi.mat

dates=datenum(textdata);  %将字符型日期转化为数值型

ftsdata=fints([dates data]);

ftsdata.series1

ftsdata.dates %查看时间序列的日期

year(ftsdata.dates) %查看时间序列的日期中的年份

month(ftsdata.dates) %查看时间序列的日期中的月份

day(ftsdata.dates) %查看时间序列的日期中的天

%% 生成多列时间序列,以两列为例

x = randn(5341,1);y = filter([1 -1 1],1,x); %生成一个ma(2)过程ftsdata=fints([dates data y]);%生成两个时间序列,默认命名series1、series2

 ftsdata       %查看整个时间序列

ftsdata.series1 %查看时间序列1

ftsdata.series2  %查看时间序列2

ftsdata(1)  %查看第1行时间序列

ftsdata=fints(dates,[data y],{'data1','data2'},1,'实验数据')

 

四、金融时间序列的使用和修改

(1)查看金融时间序列的属性

fnames=fieldnames(tsobj,srsnameonly)

显示金融时间序列的五个属性,由于'desc'、 'freq'、 'dates',描述性属性、频率属性和日期属性是不能自命名的,fnames的前三个变量分别是上述三个,接下来就是变量的名字了,以列数组的形式储存在fnames中。

Srsnameonly默认为0,表示列出所有属性,为1表示只列出变量名。

例  fnames = fieldnames(ftsdata)

fnames =

    'desc'

    'freq'

    'dates'

    'data1'

    'data2'

 

例  fnames = fieldnames(ftsdata,1)

fnames =

    'data1'

    'data2'

 

(2)时间序列重命名

Newfts = chfield(oldfts,oldname,newname)

输入参数意义:

Oldfts:时间序列结构变量名

Oldname:时间序列中变量名称

Newname:时间序列中变量的新名称

例 对时间序列对象ftsdata中的变量data2命名为series2,新的时间序列对象命名Newfts

Newfts = chfield(ftsdata, ‘data2’, ‘series2’)

注意:字符型的输入都要加单引号’’,包括其他函数。

 

(3)对时间序列进行排序

Sfts = Sortfts(tsobj,seriesnames,flag)

输入参数为:

tsobj :时间序列对象

seriesnames:排序的变量名(字符型),即按哪一个变量进行排序,若不输入,则默认按第一个变量排序。

flag:排序方式(升序or降序),flag=1(默认),升序;flag=0,降序。

例子

Sfts1 = sortfts(ftsdata)

Sfts2 = sortfts(ftsdata,’data2’)

Sfts3 = sortfts(ftsdata,’data2’,-1)

Sfts4 = sortfts(ftsdata,-1)

 

(4)时间序列起始时间点

Datesbound=ftsbound(tsobj)

 

(5)删除时间序列的一列数据

Newobj = rmfield(oldtsobj,’fields’)

输入参数:fields是时间序列的名字,可以是单个也可以是多个,多个时是字符型数组。

例 ftsdata=fints(dates,[dates,data y],{'data1','data2','data3',},1,'实验数据')

删除data1

Nodata1=rmfield(ftsdata,’data1’);

删除data1和data2

Nodata2==rmfield(ftsdata,{'data1','data2'});

运行结果

K>> Nodata1=rmfield(ftsdata,'data1');

K>> fnames = fieldnames(ftsdata)

 

fnames =

 

    'desc'

    'freq'

    'dates'

    'data1'

    'data2'

    'data3'

 

K>> Nodata2=rmfield(ftsdata,{'data1','data2'});

K>> fnames = fieldnames(Nodata2)

 

fnames =

 

    'desc'

    'freq'

    'dates'

    'data3'

 

K>> fnames = fieldnames(Nodata1)

 

fnames =

 

    'desc'

    'freq'

    'dates'

    'data2'

    'data3'

 

五.时间序列转化为矩阵数据、文本文件

(1)转化为矩阵

格式:data=fts2mat(ftsobj,IncludeDates,seriesnames)

输入参数:

fts2mat将时间对象ftsobj中的全部或部分时间序列转化为矩阵。

IncludeDates:是否将日期导出。

 IncludeDates=0,或不输入,默认只对时间序列转化,不转化时间。IncludeDates=1,则把时间和时间序列数据转化在一个矩阵中。

Seriesnames:需要导出的时间序列名称,如果不输入默认为全部时间序列。

注意:1.第一个参数必须有,第二和第三个参数如果不输入,则取默认。

    2.由于时间序列对象的引用后也是时间序列对象,因此,ftsobj

可以直接是引用后的时间对象,比如fts2mat (ftsdata.data1);

(2)转化为文本文件

格式:

Stat=fts2ascii(filename,tsobj,exttext)

Stat= fts2ascii(filename,dates,data,colheads,desc,exttext)

输入参数:

Filename:ASCII文件名称

Tsobj:需要转换的fints型格式的金融时间序列数据

Exttext:不需要的描述项的行数

Dates:包含日起的列向量,日期格式必须是序数型

Data:列转置矩阵,每一列是一个数据序列

Dcolheads:列标题的单元数组,第一个单元列一定是日期列

Desc:描述性字符串,是文件的第一行

输出:stat:转换成功标志,成功为1,否则为0.

例 fints1 = fts2ascii(‘aa.txt’,ftsdata)

 

六、时间序列的缺失值补齐

格式:fillts(oldfts,fill_method,‘增加新日期’)

fill_method:处理缺失值的方法,常用的有以下五种。

1.线性插值方法  ‘linear’、‘l’、‘le’

2.3次多项式插值‘cubic’、‘c’、‘ce’

3.样条插值‘spline’、‘s’、‘se’

4.最近插值法‘nearest‘、‘n’、‘ne‘

5.逐段光滑的三次Hemite多项式法‘pchip‘、‘p’、‘pe’

6. 常数插值。用固定的常数代替缺失值。

7. ‘增加新日期’表示增加时间序列的长度,增加一个日期。以后探索。

七、时间序列频率的转换

格式:newfts=convertto(oldfts,newfreq)

八、价格与收益率相互转换

(1)价格转化为收益率

格式[RetSeries,RetIntervals]=price2ret(TickSeries,TickTimes,Method)

输入参数

TickSeries:价格列向量或矩阵,如果是矩阵的话,则每一列是一个时间序列。

TickTimes:单调递增的时间向量,长度与价格序列长度一致,如果不输入,或者为‘[]’,则默认样本点从1,2……,length(时间序列)

Method:计算收益率的方法,menthd不输入或者输入‘Continuous’ /[]时,默认为连续复利的形式。输入‘periodic’表示单利。

输出:

RetSeries:资产收益率矩阵,行数比价格矩阵少一行

RetIntervals:相邻的时间差。RetIntervals(i)=TickTimes(i+1)-TickTime(i)

注:

Method=‘continuous’时,第i期的收益率计算公式如下:

RetSeries(i)=log[TickTimes(i+1)/TickTimes(i+1)]/ RetIntervals(i).

Method=‘periodic’时, 第i期的收益率计算公式如下:

RetSeries(i)= [TickTimes(i+1)/TickTimes(i+1)-1]/ RetIntervals(i).

如果没有后面两个参数,则直接公式log[TickTimes(i+1)/TickTimes(i+1)]计算。

(2)收益率转化为价格

格式:

[TickSeries,TickTimes]=ret2price(RetSeries,StartPrice,,retinterval,starttime,method)

输入参数:

Retseries:收益率数据列向量/矩阵

StartPrice:资产的初试价格向量,元素个数为收益率矩阵的列数。默认值为1.

Retinterval:时间区间,默认值为1

Starttime:初试时间,标量,默认值为0

Method:与(1)相同。

输出:

TickSeries:资产价格矩阵

Starttime:时间向量。

 

 

 

一些比较好的代码:

Newtsobj=todayly(tsobj)

将时间序列对象转化为日度数据。

tsobj.Const=c

对时间对象tsobj增加一个常数序列,每个数据都为1.

Intersect(A,B),寻找A,B中相同的元素,返回相同的元素。

Matlab中判断是不是有限的的函数:

判断有限:isfinite(A),或者~isnan(A)

判断无限:isnan(A),或者~ isfinite(A)

上述两个函数都是返回与A相同的0-1矩阵。

判断A中的元素是否全为1,all(A),全为1,显示1,否则显示0,返回与A列数相同的0-1向量,默认判断列向量是否全为1;要判断每一行中是否全为1,用all(A,2),判断A的行是否全为0.

假设A的某些行含有nan值,请找出不含有nan的行。

第一步,对A中每个元素进行判断,找出有限的。

isfinite(A,2)

第二步,判断每一行是否全为1,如果全为1,则意味着这一行都有限

All(isfinite(A,2),2)

第三步,找出全为1的位置。

find(All(isfinite(A,2),2))

find(All(isfinite(A,2),2))等价于(All(isfinite(A,2),2)==1)

第四步,引用全有限的行

A(find(All(isfinite(A,2),2),:))

 

Matlab一元回归中一个简单的方法求回归系数

回归系数=自变量矩阵\因变量矩阵

“\”这个运算符号很少使用

0 0