MATLAB金融工具箱(二)--执行常见的金融任务

二、           执行常见的金融任务

1.     简介

金融工具箱包含了可以执行许多常见的金融任务的函数,包括:

l  “处理和转换日期”(2-4页)

日历功能可以将日期在不同格式之间进行转换(包括Excel格式),并决定未来和过去的日期,分辨假期和工作日,计算日期之间的时间差,为付息债券找出息票日期和息票周期,并以每年360天,365天或366天为基础计算时间周期。

l  “格式化货币”(2-12页)

工具箱包含了可以处理十进制值的银行(货币)格式和分数价格。

l  “用图表表示金融数据”(2-13页)

图表表示函数产生许多金融表格像布林带,高低价格表,柱状图,点和图像图,移动平均图。

l  “分析和计算现金流”(2-17页)

l  现金流评估和财政计算函数计算利率,回报率,与借款和年金相关的支付,未来值和现值,折旧和其他与现金流相关的标准会计计算。

l  “为固定收益证券定价和计算投资效益”(2-21)

证券业协会(SIA应允的固定收益函数计算价格,投资效益,应计利息,和证券的敏感度,如债券,零息债券和国库券。他们处理奇数的第一个和最后一个时期价格/收益的计算,计算应计利息和折现率,并计算凸性和持续时间。另一组函数分析利率期限结构,包括定价的债券收益率曲线,从市场价格引导收益率曲线。另一组函数分析利率期限结构,包括从债券收益率曲线和市场价格引导收益率曲线两个方面来分析定价债券。

l  “定价并分析股权衍生工具”(2-35页)

衍生工具分析函数为衍生工具证券计算价格,收益和敏感度。欧式期权和美式期权都适用。

毕苏期定价模式:函数以欧式的形式运行。计算delta,gamma,lambda,rho,theta,vega和认购和认沽的值。

二项式:函数以美式的形式运行。计算认沽认购价格。

l  “分析投资组合”(3-2页)

投资组合分析函数提供了基本的工具以计算投资组合的方差和协方差,找出最小方差组合,计算Markowitz有效边界,并计算组合回报率。

l  时间序列波动建模

广义自回归条件异方差性(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个字段:

l  日字段是从1到31的整数

l  月字段是1到12的整数或者至少包含三个字母的字符串

l  年字段是非负整数:如果只指定两位数字,那么该年份默认为以当前年份为中心的100年以内的年份。如果年字段缺省,默认为当前年份。

l  时,分秒字段可选,都是用冒号分开的整数,后面也可加上午‘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这几个函数。


-----------------未完待续

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值