7.2 MATLAB实现

7.2 MATLAB实现

7.2.1 数据读取

以2011年11月1日到2012年3月22日期间的沪深300指数成分股价格序列为分析目标,采用三种方法计算投资组合的VaR值。下面将从数据提取、数据处理、模型计算等方面分步骤讲解MATLAB的编程计算。相关程序代码在Solution1.m与Solution2.m中。

1. 数据提取

从Excel中读取沪深300指数成分股相关数据,文件CSI300.xlsx中储存有三个Sheet数据,分别为成分股价格序列CSI300、成分股自由流通股本Portfolio Positions和沪深300指数价格序列CSI300-Index。成分股价格序列格式如表7-1所示。

MATLAB从Excel中读取数据的程序如下:

运行上述程序可以发现,在Matlab的工作文件中出现CSl300 Prices.mat文件,即可通过数据提取方法将Excel的xls棉式的数据转换为Matlab 的mat 格式文件。在计算11 1可能需要重复使用相关数据, 我们只需一次性将其存储为.mat格式,在重复计算巾载入.mat文件中的数据即可。

如果安装有Datahouse软件,可以直接从Datahouse中获悉所需的数据。在实际工作中,常常简要根据最新的市场数据进行计算分析。相比数据源→Excel→Matlab或数据源→SQL→Matlab的方式,Datahouse→Matlab方式更快捷。

MATLAB 从DataHouse中读取数据的程序如下:

2. 数据可视化与标准化

注:如果计算样本时间周期较长,例如一年以上,建议在提取股票价格序列时,提取复权价格数据。所谓复权就是对股价和成交量进行权息修复,按照股票的实际涨跌绘制股价走势图,并把成交量调整为相同的股本口径。例如某股票除权前日流通盘为5000万股,价格为10元,成交量为500万股,换手率为10%;10送10之后除权报价为5元,流通盘为1亿股,除权当日走出填权行情,收盘于5.5元,上涨10%,成交量为1000万股,换手率也是10%(和前一交易日相比具有同样的成交量水平)。复权处理后股价为11元, 相对于前一日的10元上涨了10%,成交量为500万股,这样在股价走势图上真实反映了股价涨跌,同时成交量在除权前后也具有可比性。

另外,也可调用strcmpi函数,其函数语法如下。

● TF=strcmpi(string,string):比较两个字符串是否相同,返回一个变量。

● TF=strcmpi(string,cellstr):比较一个字符串与一组字符串是否相同,返回一个向量。

● TF=strcmpi(cellstr,cellstr):比较一组字符串与一组字符串是否相同,返回一个矩阵。

测试函数程序如下:


3. 数据简单处理与分析

计算选中的股票的均值、标准差、相关性与Beta等指标,其程序代码如下:

计算结果如下:

可调用tick2ret和maxdrawdown函数,这两个函数的说明如下。

(1) tick2ret函数计算价格序列对应的收益率序列,其语法格式为:

[RetSeries, Retlntervals)=tick2ret(TickSeries, TickTimes, Method)

输入参数如下。

● TickSeries:价格序列。

● TickTimes:时间序列。

● Method:计算方法。

输出参数如下。

● RetSeries:收益率序列。

● Retlntervals:收益率对应的时间间隔。

(2) maxdrawdown函数计算价格序列的最大回撤。T日组合最大回撤(Maximum Drawdown)的公式为:

[MaxDD, MaxDDlndex]=maxdrawdown(Data, Format)

输入参数如下。

● Dat:组合每日总收益序列。

● Format:模型类别有returnm-收益率序列(默认),arithmetic=算术布朗运动,

geometn=几何布朗运动。

输出参数如下。

● MaxDD:最大回撤值。

● MaxDDlnde:最大回撤位置。

计算选中的股票的Beta。根据CAPM模型中Beta的定义:股票收益率=Beta×市场收益率+Alpha,可以通过回归的方式计算Beta,代码如下:

生成的结果如图7-2所示。

使用Heat Map展示,可以通过2D图形更加形象地展示市场的整体概况或者投资组合的表现。HeatMap的展示方法相对通常列表模式更加直观,信息量更大。

程序中调用makeHeatmap函数,其代码如下:

7.2.2 数据处理

将沪深300 指数成分股作为投资组合,投资组合中的股票数量为自由流通股本(positionsPortfolio),为计算投资组合的风险价值,需要计算投资组合的净值序列、收益率序列等。

结果如图7-4所

程序中调用visualizeVar函数,其代码如下:

7.2.3 历史模拟法程序

程序如下:

结果如图7-5 所示。

程序中调用了prctile、hist2color与displayVar函数。Y=prctile(X,p),给定一个向量X与一组分位数p,prctile函数返四分位数对应向量中的值。

hist2color函数代码如下:

displayVar函数如下:

7.2.4 参数模型法程序

MATLAB的风险价值计算使用portvrisk函数采用参数模型法计算VaR值。该函数的语法格式为:

ValueAtRisk=portvrisk(PortReturn, PortRisk, RiskThreshold, PortValue)

输入参数如下。

● PortRetum:组合收益率。

● PortRi sk:组合风险(标准差)。

● RiskThreshoJd:( 可选)置信度阈值,默认为5%。

● PortValue:(可选)组合资产价值,默认为1。

输出参数VaJueAtRisk:风险价值。

计算结果为:

该模型生成的结果如图7-6所示。

7.2.5 蒙特卡罗模拟程序

1. 基于随机收益率序列的蒙特卡罗风险价值计算

程序如下:

计算结果为:

该程序生成的结果如图7-7所示。

程序中调用了getPortfolioWeights、portsim与plotMonteCarlo函数。

(1) getPortfolioWeights函数代码如下:

输入参数如下。

● ExpReturn:预期收益率。

● ExpCovariance:预期协方差矩阵。

● NumObs:样本个数。

● RetIntervals收益率间隔,一般为1 (每日)。

● NumSim:模拟次数。

● Method:模拟方法,默认为Expected 。

2. 基于几何布朗运动的蒙特卡罗模拟

程序如下:


计算结果如图7-8所示。

7.2.6 计算结果比较

不同的VaR计算方法的结果对比如表7-2所列。