好久没做东西,知识忘了大半。还好又翻到这个博文,感谢博主。
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一元回归中一个简单的方法求回归系数
回归系数=自变量矩阵\因变量矩阵
“\”这个运算符号很少使用