打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
【量化小科普】MATLAB金融工具箱入门
导读:
本章利用MATLAB来回顾一下在进行金融分析和工程应用时需要用到的基本的矩阵代数知识。包括以下几个部分:金融的矩阵函数、矩阵代数、 函数输入/输出参数、执行常见的金融任务等内容。
一、快速入门
1.  什么是金融工具箱?
MATLAB和金融工具箱为金融分析和金融工程提供了一个完整的计算环境。并且金融工具箱提供了一切可帮助你完成金融数据的数学和统计分析的功能,并能将结果用高质量图像显示出来。你可以快速地提出、可视化并且解答复杂的问题。
在传统或电子制表过程中,你必须处理所有繁琐的细节:声明,数据类型,数据大小等等。而现在,MATLAB将为你做这一切。你只需要写出你想要解决的问题的表达式即可。这样,你就不需要再切换工具,转换文件,抑或重写应用程序。
有了MATLAB和金融工具箱,你可以:
计算和分析价格,产量和衍生工具的敏感性,或者其他证券或证券投资组合的敏感性。
完成对证券产业协会(SIA)兼容的固定收益价格,产量和敏感度分析。
分析或管理证券投资组合。
设计或评估套期保值策略。
识别、评价和控制风险。
分析和计算现金流,如回报率和折旧流。
分析并预测经济活动。
可视化并分析金融时间序列数据。
创建结构化金融工具,如外汇工具。
讲授或知道学术研究。
本章利用MATLAB来回顾一下在进行金融分析和工程应用时需要用到的基本的矩阵代数知识。包括以下几个部分:
金融的矩阵函数(1-4页)
1-4页回顾“关键词定义”和矩阵代数基础,比如“引用矩阵元素”(1-4页)和“矩阵转置”(1-6页)
矩阵代数复习
简单回顾在金融分析和工程中使用矩阵函数。
“函数输入/输出参数”(1-18页)
描述可被MATLAB接受的数据格式和这些输入数据被计算后的的输出结果。
同时,这份用户指南还解释了一些MATLABT的基本概念和操作,并举出了一些金融例子以帮助您能够更好地开始金融分析之路。
2.  金融的矩阵函数
许多金融分析过程涉及数字集合;比如说一个包含不同价和量的证券投资组合。矩阵,矩阵函数和矩阵代数是分析数字集合和彼此关系的最有效的方式。电子制表关注的是单个单元格和这些单元格之间关系。然而,你可以把电子表格的一组单元格(一系列的行和列)想象成一个矩阵,MATLAB就是这样一个面向矩阵的工具,它能更快,更简单,更轻易地巧妙处理数字集合。
2.1 关键词定义
矩阵。矩阵就是一个用于数学运算的数字或代数数量的矩形阵列;元素的矩形格式用行和列来描述。通常我们说一个“m×n”的矩阵,表示矩阵的行有m个数,列有n个数。这个描述总是用“行”和“列”。举个例子,下面是一个用MATLAB记号法输入的2×3矩阵,每一行的三个数分别代表一只债券的面值,票面利率和支付频率(每年支付的次数)。
Bonds = [1000 0.06 2
5000.055 4]
向量。向量就是一个只有一行或者一列的矩阵。通常写作“1×n”或者“m×1”矩阵。这个描述也总是用“行”和“列”。下面是一个MATLAB记号法输入的1×4的现金流向量:
标量。标量就是1×1的矩阵,如一个数。
2.2 引用矩阵元素
我们用(row,col)来引用特定的矩阵元素,比如:
Bonds (1,2)
ans =
0.06
Cash(3)
ans =
5280.00
你也可以用小的矩阵或向量作为元素来扩展矩阵,比如:
AddBond = [1000 0.065 2];
Bonds = [Bonds;AddBond]
在原来的矩阵上加入了新的行,结果为
Bonds =
1000 0.06 2
500 0.055 4
1000 0.065 2
同样地,
Prices = [987.50
475.00
995.00]
Bonds =[Prices, Bonds]
在原来的矩阵加入了新的列,结果如下
Bonds =
987.50 1000 0.06 2
475.00 500 0.055 4
995.00 1000 0.065 2
最后,colon(:)在产生和引用矩阵元素时非常重要。比如,如果你要引用第二只债券的面值,票面利率和支付频率,那么你可以试试:
BondItems = Bonds(2, 2:4)
BondItems =
500.00 0.055 4
2.3 矩阵转置
有时候,在进行某些操作的时矩阵的配置可能不是我们想要的。在MATLAB中,撇号(‘)可以转换矩阵:行变成列,列变成行。比如:
Cash = [1500 4470 5280 -1299]’
结果为:
Cash =
1500
4470
5280
-1299
3.  矩阵代数复习
矩阵代数和矩阵操作室用MATLAB进行金融分析和工程的基础。本章主要讨论以下几个主题:
矩阵加减运算
矩阵相乘
矩阵相除
解联立线性方程
元素间的操作
以上几个部分的解释应该可以恢复你的基本功。
威廉·夏普的《宏观投资分析》也给出了一些非常棒的MATLAB矩阵代数操作解释。可以从以下网址获得:
http://www.stanford.edu/~wfsharpe/mia/mia.htm
注意 当你设定一个问题,它有助于“通过对话”每个输入输出矩阵有关的单位和维度。在矩阵相乘(1-8页)下面的例子中,一个输入矩阵包含了3只股票5天的收盘价,另一个输入矩阵包含了3只股票在两个投资组合中所占的份额,因此,输出矩阵包含了两个投资组合5天的收盘价值。它也有助于使用描述性术语来命名变量。
3.1 矩阵加减运算
矩阵的加减运算是元素与元素之间的运算。两个输入矩阵一定要有相同的维度。结果就是一个与原来的两个矩阵维度相同的矩阵,其中的元素是原来两个矩阵对应位置的元素之和。举个例子,考虑组合几个由相同股票组成的投资组合,但是各个股票的数量不相同(“投资组合P和Q中(列)股票A,B,C(行)的份额加上投资组合R和S中(列)股票A,B,C(行)的份额”)
Portfolios_PQ = [100 200
500 400
300 150];
Portfolios_RS = [175 125
200 200
100 500];
NewPortfolios = Portfolios_PQ + Portfolios_RS
NewPortfolios =
275.00 325.00
700.00 600.00
400.00 650.00
加上或减去一个标量和一个矩阵都是元素与元素之间的操作:
SmallerPortf = NewPortfolios-10
SmallerPortf =
265.00 315.00
690.00 590.00
390.00 640.00
3.2 矩阵相乘
矩阵乘法并不是元素与元素间的操作。它遵循线性代数的运算规则。在矩阵乘法中,记住关键的规则:内部维度必须一致。即,若第一个矩阵是m×3,那么第二个矩阵必须是3×n。结果就是一个m×n的矩阵。这同样有助于“通过谈话”每一个矩阵的单位,正如我们之前在“金融的矩阵函数”(第一章2.3)中提及的一样。
矩阵乘法也是不可交换的,也就是说顺序不是独立的。这意味着A*B不等于B*A。维度规则也阐明了这一点。如果A矩阵式1×3,B矩阵式3×1,A*B就产生了一个标量(1×1),但是B×A产生的是一个3×3的矩阵。
3.2.1   向量相乘
向量乘法也遵循相同的规则并且能够帮助我们理解这个规则。比如,一个股票投资组合有3只不同的股票,他们的今日收盘价为:
ClosePrices =[42.5 15 78.875]
这个投资组合的股票份额为:
NumShares = [100
500
300]
为了计算这个股票的价值,简单地把这两个向量相乘即可:
PortfValue =ClosePrices * NumShares
产生的结果为:
PortfValue =
35412.50
这两个向量的维度分别是1×3和3×1,所以结果的维度为1×1,是一个标量。把这些向量相乘就意味着把每一个收盘价和它对应的份额数相乘,最后求和。
为了进一步说明顺序的依赖性,我们变换一下两个向量的顺序:
Values = NumShares * ClosePrices
Values =
4250.00 1500.007887.50
21250.007500.00 39437.50
12750.004500.00 23662.50
这个结果给我们展示的是份额为100,500和300的三只股票分别的收盘价值,并不是投资组合的价值,在这个例子里是无意义的。
3.2.2  计算向量的点积
在矩阵代数中,如果向量和有相同的长度:
那么点积为:
这是两个向量的标量集。这是一个交换律的例外。在MATLAB中,用sum(X.*Y)或sum(Y.*X)来计算点积。只要确保两个向量具有相同的维度。我们用先前的两个向量来说明:
Value = sum(NumShares .* ClosePrices')
Value =
35412.50
Value = sum(ClosePrices .* NumShares')
Value =
35412.50
正如预期的那样,这个结果和之前我们计算的PortValue吻合。
3.2.3  向量与矩阵相乘
向量与矩阵相乘也遵循矩阵相乘法则和过程。举个例子,一个投资组合矩阵包含了一个星期的收盘价。第二个矩阵(向量)包含了这个投资组合中股票的数量。
WeekClosePr = [42.5 15 78.875
42.125 15.578.75
42.125 15.12579
42.625 15.2578.875
43 15.2578.625];
PortQuan = [100
500
300];
我们只需要简单地把他们俩相乘,就可以得到每天的投资组合价值:
WeekPortValue = WeekClosePr * PortQuan
WeekPortValue =
35412.50
35587.50
35475.00
35550.00
35512.50
价格矩阵的维度是5×3,数量矩阵(向量)的维度是3×1,所以结果时5×1。
3.2.4  两个矩阵相乘
矩阵乘法也遵循矩阵代数的基本法则。在矩阵代数记法中,如果A矩阵是m×n的,B矩阵是n×p的。
那么C=A*B就是一个m×p的矩阵,并且C矩阵的第i行第j列的元素就等于
为了说明这个问题,我们假设两个具有相同三只股票的投资组合,但是股票的数量不相同:
Portfolios = [100 200
500 400
300 150];
5×3的周内收盘价矩阵乘以3×2的投资组合矩阵产生一个5×2的每日收盘值矩阵。
PortfolioValues = WeekClosePr * Portfolios
PortfolioValues =
35412.5026331.25
35587.5026437.50
35475.0026325.00
35550.0026456.25
35512.5026493.75
周一的价值是由第一个投资组合每周一的收盘价乘以相应的份额并对求和得来的,对于第二个投资组合我们可以通过相同的方式得到。第一个投资组合周二的价值是用每周二的收盘价乘以相应的份额并求和得到的,对于第二投资组合我们用相同的方法。对于剩下的几天也是一样。只用一个简单的命令,MATLAB就可以很快地完成许多计算。
3.2.5  矩阵与向量相乘
矩阵乘以向量是维度和交换法则的一个特例,它是元素之间的操作。
Portfolios = [100 200
500 400
300 150];
DoublePort = Portfolios * 2
DoublePort =
200.00 400.00
1000.00 800.00
600.00 300.00
3.3矩阵相除
矩阵除法对于解方程特别是解联立线性方程(见解联立线性方程第一章3.4)非常地有用,举个例子,若A*X=B,你想解X。
在传统的代数里,你可能要简单地在方程的两边除以A,然后X=A/B.但是,由于矩阵代数是不符合交换律的(A*X≠X*A),所以需要不同的解法.在规范的矩阵代数中,这个结果还包含矩阵的逆.MATLAB将这个过程简化为两个除法符号,左斜线和右斜线(\和/).一般说来
X=A\B 是A*X=B的解
X=B/A 是X*A=B的解
通常,矩阵A必须是一个非奇异的方阵。它必须是可逆的,而且,必须要有相同的行数和列数。(一般地,如果一个矩阵乘以它的逆矩阵等于单位矩阵,那么这个矩阵就是可逆的。这个理论及其证明可以在Hill的《初级线性代数》附录A中找到)如果矩阵是奇异矩阵,MATLAB会给出警告信息。
3.4解联立线性方程
矩阵除法在解联立线性方程组时非常有用。考虑这样一个问题:给定两个抵押工具投资组合,每一个投资组合都有依赖于最优惠利率的固定量,你怎样平衡投资组合以获得固定的年现金流?大难应包括解线性方程。
线性方程是一个形如以下形式的方程:
其中,和是限制(,不同时为0),x和y是变量。(它是一个线性方程是因为它描述了一条在XY平面上的直线。例如2x+y=8描述了一条直线,所以当x=2的时候y=4)
一个线性方程系统就是一组你想同时解出线性方程组合,也就是联立.在解联立线性方程时的一个最基本的原则就是,需要多少个确定解就需要多少个线性方程.如果想要同时求出x和y的值,就需要两个线性方程。举个例子,我们解下面这个线性方程系统:
正如我们所说,解两个未知数必须要有两个方程。如果用矩阵来表示这个线性系统,则将之改写为三个矩阵:A矩阵代表左边的常数项,X矩阵代表变量,B矩阵代表右边的常数。
其中A*X=B
要解出这个线性系统就意味着要解矩阵X,用MATLAB来计算:
A = [2 1
1 -3];
B = [13
-18];
X = A \ B
解出X
X = [3
7]
则在这个例子中,x=3,y=7.一般地,可以用矩阵代数解任何一个形如以下的线性系统:
用矩阵表示为:
并解出A*X=B中的X。
为了说明这个问题,考虑这样一个场景。有两个抵押工具的投资组合M1和M2。在今天的最优惠利率下他们当前每年支付的现金分别为每单位100美元和70美元.如果最优惠利率降低一个百分点,他们每年支付的现金就会变为每单位80美元和40美元。一个投资者持有10个单位的M1和20个单位的M2。对于每一个最有利率,这个投资者的收入等于现金支付乘以单位数,即R=C*U。可知:
M1
M2
Prime flat:
$100 * 10 units
+ $70 * 20 units = $2400 receipts
Prime down:
$80 * 10 units
+ $40 * 20 units = $1600 receipts
在MATLAB中表示为
Cash = [100 70
80 40];
Units =[10
20];
Receipts = Cash * Units
Receipts =
2400.00
1600.00
现在投资者要问的问题是:给定这两个投资组合和他们的特性,当最有利率保持不变的时候,我想收入7000美元,如果最优利率下降一个百分点时我想收入5000美元那我应该持有多少个单位?解出下面的线性方程组就可以得到答案。
M1
M2
Prime flat:
$100 * x units
+ $70 * y units = $7000 receipts
Prime down:
$80 * x units
+ $40 * y units = $5000 receipts
换句话说,就是解出R(Recuipts)=C(Cash)*U(Units)里的U(Units)。用MATLAB进行左除:
Cash = [100 70
80 40];
Receipts = [7000
5000];
Units = Cash \ Receipts
Units =
43.75
37.50
因此,投资者应持有43.75个单位的M1和37.5个单位的M2才能获得他想要的年收入。
3.5元素间运算
最后,元素之间的算术运算称为数组操作。在MATLAB中,运算之前加一个句号表示数组运算。加法和减法,矩阵乘法和矩阵除以一个标量已经是数据运算所以并不需要再加一个句号。当我们需要对两个矩阵做数组运算时,两个矩阵的维度必须一致。举个例子,给定股票分红和收盘价的向量。
Dividends = [1.90 0.40 1.56 4.50];
Prices = [25.625 17.75 26.125 60.50];
Yields = Dividends ./ Prices
Yields =
0.0741 0.0225 0.0597 0.0744
4.     函数输入/输出参数
MATLAB被设计成一个大规模数组(向量或矩阵)处理器。除了线性代数应用程序,一般的基于数组的处理设备拥有重复执行数据集操作的能力。如果一段MATLAB代码写成同时对保存在数组里的数据集进行操作,那么我们就说这段代码是被向量化了。
向量化的代码不仅干净简洁,在MATLAB底层的引擎里也会被更高效地处理。
4.1输入参数
4.1.1       矩阵输入
由于MTLAB可以轻易地处理向量和矩阵,在金融工具箱中的大多数函数都支持向量或矩阵的输入,而不是单独的值(标量)。举个例子,irr函数计算现金流的内部收益率。它接受一个现金流向量并返回一个标量值的内部收益率。但它同时也接受一个矩阵形式的现金流,矩阵中的一列代表一个不同的现金流。在这种情况下,irr函数返回的就是内部收益率的向量,每一列对应不同的现金流。其他的工具箱函数也与之相似。
假设你有100美元的初始投资,此后每年的现金流分别是10美元,20美元,30美元,40美元和50美元。这个现金流就可以保存在一个向量里:
CashFlows =[-100 10 20 30 40 50]'
在MATLAB中显示为
CashFlows =
-100
10
20
30
40
50
irr函数可以计算这个现金流的内部收益率:
Rate = irr(CashFlows)
计算结果为
Rate =
0.1201
即12.01%。
在这里例子中,一个单独的现金流(向量形式的输入)可以产生一个标量的输出—投资的内部收益率。
把这个例子扩展到矩阵输入:
Rate = irr([CashFlows CashFlows CashFlows])
你就可以如期地看到输出是三个投资对应的内部收益率:
Rate =
0.1201 0.1201 0.1201
这个例子很好地展示了向量化编程的好处。该例中说明了如何把输入数据转化为矩阵,然后用一个工具箱函数来处理这些输入,并计算所有输入的结果。这个特性在投资组合管理中非常有用,例如,也许你把多个资产组织成一个单独的集合。把每一份资产的数据放在同一个矩阵的不同列或行,之后用金融工具箱来处理这个矩阵。MATLAB对所有的资产都会分别进行相同的运算。
4.1.2 字符串矩阵输入
在MTLAB中输入字符串需要用单引号括起来(‘字符串’)。
字符串被保存为字符数组的形式,每一个元素对应一个ASCII码。
因此下面这个时间字符串:
DateString ='9/16/2001'
实际上是一个1*9的向量。字符串组成一个矩阵的行向量或都必须具有相同的长度。要想输入多个时间字符串,需要一个列向量来保存并确保所有的字符串的长度相同。不足的情况需要补空格或补0。举个例子,创建一个与不规则现金流对应的时间向量:
DateFields =  ['01/12/2001'
'02/14/2001'
'03/03/2001'
'06/14/2001'
'12/01/2001'];
DateFields实际变成了一个5×10的字符数组。
不要试图把数字和字符串混在一个矩阵中,否则MATLAB会把所有的输入都当成字符对待,比如:
Item = [83 9099 '14-Sep-1999']
就变成了一个1×14的字符数据,而不是1×4的向量
Item =
SZc14-Sep-1999
4.2函数输出参数
有一些函数是不返回参数的,有一些只返回一个,有些则返回多个。返回多个参数的函数使用句法
[A, B, C] =function(variables...)
来返回三个参数A,B和C。因此,如果在调用这个函数时你使用了句法
X =function(variables...)
函数将只会返回A,而没有B和C。
一些返回向量的函数只接受标量作为参数。为什么这些函数不接受向量输入并返回矩阵呢?输出矩阵的每一列与输入向量之间如何对应呢?输出向量可以是长度可变的,因此对于一些不太符合常规的矩阵,由于短列缺失数据,这些规则将不再适用。
需要资产寿命作为输入,并返回对应生命周期内几个不容时间段的值得函数,不能通用地处理向量和矩阵输入,这些函数为分别是
amortize
分期偿还
depfixdb
固定余额递减法折旧
depgendb
一般余额递减法折旧
depsoyd
年数总和折旧
举个例子,假设你有一个类似汽车这样的资产集合,你想计算他们的折旧细则。函数depfixdb就可以计算余额递减的折旧值现金流。也许你想设置一个向量,每一个输入分别对应每一个资产的初始值。depfixdb也要单个资产的生命周期。如果你打算设置这样的一个资产集合为一个输入向量,并且这些汽车的生命周期不尽相同,那么折旧现金流的结果会因为周期的不同而不同,输出矩阵的列长度也不一样。这就违背了一个矩阵的每一列的行数必须相同的原则。
4.3利率参数
不管是作为输入还是输出,利率都是一个很普遍的参数。所有的金融工具箱都接受并返回利率的小数形式。因此一个利率为9.5%的实际表达为0.095.
二、 执行常见的金融任务
1. 简介
金融工具箱包含了可以执行许多常见的金融任务的函数,包括:
“处理和转换日期”(2-4页)
日历功能可以将日期在不同格式之间进行转换(包括Excel格式),并决定未来和过去的日期,分辨假期和工作日,计算日期之间的时间差,为付息债券找出息票日期和息票周期,并以每年360天,365天或366天为基础计算时间周期。
“格式化货币”(2-12页)
工具箱包含了可以处理十进制值的银行(货币)格式和分数价格。
“用图表表示金融数据”(2-13页)
图表表示函数产生许多金融表格像布林带,高低价格表,柱状图,点和图像图,移动平均图。
“分析和计算现金流”(2-17页)
现金流评估和财政计算函数计算利率,回报率,与借款和年金相关的支付,未来值和现值,折旧和其他与现金流相关的标准会计计算。
“为固定收益证券定价和计算投资效益”(2-21)
证券业协会(SIA应允的固定收益函数计算价格,投资效益,应计利息,和证券的敏感度,如债券,零息债券和国库券。他们处理奇数的第一个和最后一个时期价格/收益的计算,计算应计利息和折现率,并计算凸性和持续时间。另一组函数分析利率期限结构,包括定价的债券收益率曲线,从市场价格引导收益率曲线。另一组函数分析利率期限结构,包括从债券收益率曲线和市场价格引导收益率曲线两个方面来分析定价债券。
“定价并分析股权衍生工具”(2-35页)
衍生工具分析函数为衍生工具证券计算价格,收益和敏感度。欧式期权和美式期权都适用。
毕苏期定价模式:函数以欧式的形式运行。计算delta,gamma,lambda,rho,theta,vega和认购和认沽的值。
二项式:函数以美式的形式运行。计算认沽认购价格。
“分析投资组合”(3-2页)
投资组合分析函数提供了基本的工具以计算投资组合的方差和协方差,找出最小方差组合,计算Markowitz有效边界,并计算组合回报率。
时间序列波动建模
广义自回归条件异方差性(GARCH)函数对单变量的经济时间序列波动建模。(GARCH工具箱提供了更全面和更完整的计算环境。可以从GARCH工具箱的用户指南文档或者金融产品网页中获得更多的信息http://www.mathworks.com/products/finprod)
2. 处理和转换日期
由于几乎素偶有的金融数据都是基于日期的或来源于时间序列的,金融函数必须具备相应的日期处理能力,特别是:
l  “日期格式”(2-4页)
l  “日期转换”(2-5页)
l  “当前日期和时间”(2-8页)
l  “确定日期”(2-9页)
注意:如果你指定了一个两位数的年份,那么MATLAB会默认这个年份是当前年份的100年以内。详见函数datenum。MATLAB内部的时间处理和计算不会产生有歧义的值。无论如何,编程者应当尽可能使用连续的日期数据或者包含四位数的日期字符串。
2.1 数据格式
当你处理时间时,你最有可能与时间字符串(形如14-Sep-1999)打交道。金融工具箱内部操作连续的日期数字(形如730377)。一个连续的日期数字表示一个日历日期就是从一个固定的时间基准算起的那一天的数字。在MATLAB里面,连续日期数字1代表的是公元0000年的1月1号。MATLAB也用连续时间来表示从午夜算起的每一天的某个部分。举个例子下午六点等于0.75个连续日期,所以1999年9月14号下午六点(6:00 p.m. on 14-Sep-1999)在MATLAB中被表示为日期数字730377.75。
许多接受日期输入的工具箱函数需要的日期格式为日期字符串或连续日期数字。如果你处理的日期只是命令行级别一个很小的部分,那么字符串将会更加便捷。如果你使用工具箱函数需要涉及到大量的日期,像分析大型的投资组合或现金流,如果用日期数字性能将会有所提高。
工具箱提供了可以将日期字符串转换为联系日期数字的函数,反之亦然。
3. 日期转换
转换日期的函数包括:
datedisp
将日期字符串输入的日期以数字矩阵的形式展示出来
datenum
把日期字符串转换为连续日期数字
datestr
把连续日期数字转换为日期字符串
m2xdate
把MATLAB连续日期数组转为Excel连续日期数字
x2mdate
把Excel连续日期数组转为MATLAB连续日期数字
另一个函数,datevec将日期数字或者日期字符串转换为一个日期向量形如[年月 日 时 分 秒]。日期向量对于某些MATLAB函数来说是一种内部格式。在金融计算中,不会经常用到。
3.1输入转换
datenum函数在用金融工具箱来进行有效运算的时候是一种非常重要的函数。Datenum采取任何一种字符串输入格式:‘dd-mm-yyyy’,‘mm/dd/yyyy’或更为普遍的‘dd-mm-yyyy, hh:mm.ss’。输入字符串加上字幕和数字最多有6个字段:
日字段是从1到31的整数
月字段是1到12的整数或者至少包含三个字母的字符串
年字段是非负整数:如果只指定两位数字,那么该年份默认为以当前年份为中心的100年以内的年份。如果年字段缺省,默认为当前年份。
时,分秒字段可选,都是用冒号分开的整数,后面也可加上午‘am’或下午‘pm’
举个例子,如果当前年费为1999,那么以下几个表达表示同样的日期:
'17-May-1999'
'17-May-99'
'17-may'
'May 17, 1999'
'5/17/99'
'5/17'
而且以下表达也表示同样的时间:
'17-May-1999, 18:30'
'5/17/99/6:30pm'
需要注意的是,默认的时间格式符合美式惯例,所以3/6实际表示的是3月6号,而不是6月3号。
用datenum函数就可以把日期转换成连续日期格式,把他们保存在矩阵变量里,然后用这些变量作为函数的输入。或者你可以用datenum函数直接作为函数的输入参数列表。
举个例子,加入函数bndprice可以根据给定的到期收益率计算债券的价格。第一步就要设置到期收益率的变量,息票率和必要的日期。
Yield = 0.07;
CouponRate = 0.08;
Settle = datenum('17-May-2000');
Maturity =datenum('01-Oct-2000');
然后调用函数bndprice
bndprice(Yield,CouponRate, Settle, Maturity)
或者直接把转换函数放在参数列表中
bndprice(0.07, 0.08, datenum('17-May-2000'),...
datenum('01-Oct-2000'))
bndprice是一个例子函数,它可以检测日期字符串并自动将其转换。对于这类函数来说,其实日期字符串可以直接输入而不经转换。
bndprice(0.07,0.08, '17-May-2000', '01-Oct-2000')
将日期转换成字符串还是日期数字的形式完全取决于什么样的格式处理起来更方便。举个例子,如果数据是用来展示或者为了对日期操作的代码进行调试,无疑日期字符串比日期数字格式更加易于查看。又或者,连续提起数字只是数值类型的另一种形式,并且和其他任何的数值型数据一样,为了方便处理可以被放置在矩阵中。
如果你创建了一个日期字符串的向量作为输入,一定要记得使用一个列向量来保存,并且保证所有的字符串的长度都是相同的。如果长度不够,可以补空格或者补0.详见“字符串输入的矩阵”(1-19页)
3.2输出转换
datestr函数可以把连续日期数字转换为19个不同的日期字符串输出格式,显示日期和(或)时间。默认的输出格式是“日-月-年”字符串,如24-Aug-2000。准备输出报告的时候这个函数非常有用。
格式
描述
01-Mar-2000 15:45:17
day-month-year hour:minute:second
01-Mar-2000
day-month-year
03/01/00
month/day/year
Mar
month, three letters
M
month, single letter
3
month
03/01
month/day
1
day of month
Wed
day of week, three letters
W
day of week, single letter
2000
year, four numbers
99
year, two numbers
Mar01
month year
15:45:17
hour:minute:second
03:45:17 PM
hour:minute:second AM or PM
15:45
hour:minute
03:45 PM
hour:minute AM or PM
Q1-99
calendar quarter-year
Q1
calendar quarter
3.3当前日期和时间
函数today和now分别返回当前日期和时间的连续日期数字格式。
today
ans =
730693
now
ans =
730693.48
MATLAB函数date返回当前日期的字符串形式。
date
ans =
26-Jul-2000
3.4确定日期
工具箱提供了许多确定指定日期的函数,包括考虑假期和其他非交易日的函数。举个例子,你为每个月的最后一个星期五计划一个会计程序。如下调用lweekdate可以返回2000每个月的最后一个星期五的日期。指定6个周期五:
Fridates = lweekdate(6, 2000, 1:12);
Fridays = datestr(Fridates)
Fridays =
28-Jan-2000
25-Feb-2000
31-Mar-2000
28-Apr-2000
26-May-2000
30-Jun-2000
28-Jul-2000
25-Aug-2000
29-Sep-2000
27-Oct-2000
24-Nov-2000
29-Dec-2000
或者你的公司在马丁·路德·金日当天关闭,那天是1月的第三个星期一。函数nweekdate就可以决定2001年到2004年这几天的日期。
MLKDates = nweekdate(3, 2, 2001:2004, 1);
MLKDays = datestr(MLKDates)
MLKDays =
15-Jan-2001
21-Jan-2002
20-Jan-2003
19-Jan-2004
在检查金融日期时,考虑假期和其他非交易日是非常重要的。金融工具箱提供了holidays函数,该函数包含了1950年到2030年间纽约股票交易所的假期和一些特殊的非交易日。你可以编辑holiday.m文件来自定义你自己的假期和非交易日。在下面这个例子中,我们用它来确定2000年下半年的标准假期。
LHHDates = holidays('1-Jul-2000', '31-Dec-2000');
LHHDays = datestr(LHHDates)
LHHDays =
04-Jul-2000
04-Sep-2000
23-Nov-2000
25-Dec-2000
现在用工具箱的busdate函数来确定在这些假期之后的下一个工作日。
LHNextDates = busdate(LHHDates);
LHNextDays = datestr(LHNextDates)
LHNextDays =
05-Jul-2000
05-Sep-2000
24-Nov-2000
26-Dec-2000
工具箱也提供了cfdates函数为定期支付证券确定现金流的时间。这个函数考虑每年的息票,日计基础和月底规则。例如,为每年定期支付四次并在月底支付的息票证券确定现金流日期,基于实际天数或者365天的基础,只要输入结算日期,到期日期和参数即可。
PayDates =cfdates('14-Mar-2000', '30-Nov-2001', 4, 3, 1);
PayDays = datestr(PayDates)
PayDays =
31-May-2000
31-Aug-2000
30-Nov-2000
28-Feb-2001
31-May-2001
31-Aug-2001
30-Nov-2001
3.5格式化货币
金融工具箱提供了一系列的函数来帮助规定货币的格式并用图表来显示金融数据,这些函数包括:
cur2frac
将小数的货币转换为分数值
cur2str
将一个值转换为金融工具箱的银行格式
frac2str
将分数的货币值转换为小数值
下面的例子显示了如何调用这些函数:
Dec =frac2cur('12.1', 8)
返回Dec = 12.125,等价于12-1/8.第二个输入变量是分数的分母。
Str =cur2str(-8264, 2)
返回字符串($8264.00)。对于金融工具箱函数来说,输出格式是一个由美元符号作为前缀的数值格式,保留两个小数点,并且负数作为插入成为。即($123.45)和$6789.01。标准的MATLAB银行格式仅保留两个小数位,没有美元符号,若数值为负数则在前面加负号,即-123.45和6789.01。
3.6用图表表示金融数据
下面这个几个工具箱的金融制表函数可以非常快速、简单地绘制金融数据并且与可展示级别图像质量相当的图片。
bolling
布林带图
bollinger
时间序列布林图
candle
阴阳烛图
candle
时间序列烛图
pointfig
点形图
highlow
最高价,最低价,开盘、收盘价图
highlow
时间序列最高-最低价图
movavg
超前和滞后的移动平均图
这些函数与MATLAB的画坐标轴、控制项外观及添加标签和标题这些标准函数可以同时使用。金融工具箱也提供了一系列完整的可以和金融时间序列对象同时工作的制表函数。详见“用图表表示金融数据”(12-6页)和“时间序列指标”(12-21页)。
下面是两个绘制的例子:一个IBM股票样本价格数据的最高-最低价图和这些数据的布林带图。
这两个例子从外部文件(ibm.dat)导入数据,然后用这个数据的一个部分来调用函数。MATLAB变量ibm是由载入ibm.dat产生的,是一个包含6割裂的矩阵,每一列都是一个交易日的数据,第2,3和第4列,非别包含了最高价,最低价和收盘价。
注意:ibm.dat里面的数据仅是为了演示而虚构的出来的。
3.6.1       最高-最低价图例子
首先载入数据并设置矩阵的维度。Load和size是MATLAB的标准函数。
load ibm.dat;
[ro, co] =size(ibm);
为我们的图表打开一个图形窗口。用金童工具箱的highlow函数来为数据文件中的最后50个交易日绘制最高价,最低价和收盘价。
figure;
highlow(ibm(ro-50:ro,2),ibm(ro-50:ro,3),ibm(ro-50:ro,4),[],'b');
用MATLAB的标准函数来添加标签和标题,并设置坐标轴。用金融工具箱函数dateaxis来为x轴的实时编上日期。
xlabel('');
ylabel('Price ($)');
title('International Business Machines, 941231 -950219');
axis([0 50 -inf inf]);
dateaxis('x',6,'31-Dec-1994')
MATLAB产生一个类似这样的图形。画出来的数据和坐标轴看起来有点诡异。在线看,这些最高-最低价的柱子是蓝色的。
3.6.2       布林带图例子
下面这个例子我们用金融工具箱函数bolling对IBM股票价格矩阵所有的收盘价产生一个布林带图。一个布林带图绘制一个数据实际上连带了其他三个数据。上面的带子是移动平均上面两个标准差。下面的带子是移动平均下面的两个标准差。中间的带子就是移动平均。本例中使用15天的移动平均。
假设前面的IBM数据仍然还处于载入状态,只需简单执行这个金融工具函数。
bolling(ibm(:,4),15, 0);
指定坐标轴,标签和标题。同样,再一次使用dateaxis函数来加上日期。
axis([0 ro min(ibm(:,4)) max(ibm(:,4))]);
ylabel('Price($)');
title(['International Business Machines']);
dateaxis('x',6,'31-Dec-1994')
关于如何使用MATLAB的绘制函数,详见MATLAB标准文档“创建图形(Creating Plots)”。在该文档中可以看到axis,title,xlabel和ylabel这几个函数
(来源: MathInvestment 作者:康小胖)
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
matlab 中常用的函数 (1)
MATLAB矩阵及其运算
matlab unique函数
Scilab简介
MatLab-SVM
MATLAB神经网络工具箱
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服