历史模拟法的案例分析
在历史模拟法的实际操作中,历史数据多数从金融数据服务商那里获得,而且构建历史的盈亏序列时,我们必须考虑以下几个问题:。
1.历史数据的来源及格式。据统计,截至2005年,有近8000支美国三大交易所NYSE,AMEX,Nasdaq.上市,除此之外,在金融市场的衍生品更是数不胜数。要获得某一支股票历史数据犹如大海捞针,所以我们不得不借助金融服务商,如Bloomberg(彭博),reuters(路透),从提供商那里能方便的获得数据,但是此时问题出现了,不同的服务商提供的数据并非统一的格式,例如有些历史数据以TXT文本的形式提供,而有些则以XML文件的形式提供,对于数据整体打包出售的数据则以数据库的形式提供。除了提供的数据格式有变化之外,数据的内容也有不同,对于多数股票来说,数据多为股票价格,也就是说,从历史数据中我们能看到每一天的历史报价,而对于复合形式的金融产品而言,数据提供商只提供其历史收益率,即每一天相对于前一天的收益率历史记录。
2.对历史数据的优化处理。上述的历史数据要应用到VaR的数学模型中必须经过修改,一般情况,VaR模型中应用其历史收益率来计算,然而针对不同的类型的金融产品又有差别,例如,对股票来说,一般对其价格取对数,获得其对数收益率,即,Yt1即时间点t1相对于t0的收益率。而以收益率存储的历史数据,没有必要对其进行任何转换。有些金融产品的收益率采取最直接的形式来取得收益率序列,其收益率计算公式为。
3.构建盈亏序列(PNL,ProfitandLoss)。盈亏序列是指当前的头寸映射到对应的历史数据序列上,即此金融产品的历史收益率序列上,获得历史上的各个时间点的盈亏值。由此可知,盈亏序列的建立必须满足两个条件,1.已经处理好的历史数据2.当前的头寸。经过处理的历史数据已经经过讨论,当前头寸可以作为参数直接输入获得,当然为了更好的结构性和扩展性的考虑我们可以把头寸写入配置文件中。用数学公式PnL=Position(头寸)*()。
(二)系统设计针对上述问题,设计图如下:
由图可知:针对上述问题1,设计一个DataSeries接口,同时两个抽象类FileDataSeries,DatabaseDataSeries实现此接口,且分别对应数据来源:文件和数据库,这样不同格式,不同来源的历史数据均能整合到一起,而对于SimulatePnL不需要知道数据的原始来源以及格式,因为他只需要用到最终的原始有效数据而不必去关心太多的细节。
同理,针对问题2,设计Computer接口,即针对原始数据进行处理,针对不同的数据处理方法设计不同的类,这些类分别实现此接口,当然随着统计方式的变化,新的数据处理方法会被提出,此时只需添加新的类来实现新的方法,而程序的结构不需要改变,而DataSeries的设计思路也是如此。
SimulatePnL的设计是针对问题3的。有了Computer,DataSeries这些数据结构,很容易构造出收益率序列,同时结合头寸(TradedPostion),便可以比较容易的构造出PnL序列。
(三)VaR的计算由上述PnL序列,根据数学统计方法,我们可以计算出方差D(X),和标准差,根据置信水平α,我们可以得到分位数Zc
。
(四)配置文件<VaR>
<ConfidenceLevel>
<confidenceValue>0.95</confidenceValue>
<quantile>1.96</quantile>
</ConfidenceLevel>
<TradedPosition>4,000,0
00</TradedPosition>
<DataSeries>
<DataSourceType>File</DataSourceType>
<DataSourceClass>XMLDataSeries</DataSourceClass>
<SecurityID>SHA:60188</SecurityID>
<FilePath>D:\\data\\ch-60188.xml</FilePath>
</DataSeries>
<Computer>LogNormalComputer</Computer>
</VaR>
由上述的设计类图可知,当VaR计算引擎启动时,Runner从配置文件中读取分位数,头寸等相应参数,当DataSourceType为File时,即数据来源于文件,而DataSourceClass明确指明了用什么样对应的数据处理类来获得历史数据,FilePath指明了数据文件的存储位置。如果DataSourceType为DB时,对应的类会根据SecurityID从数据库中来获得数据序列。Computer指定了对原始数据处理的方式方法类,LogNormalComputer意味着对原始数据进行取对数然后构造对数收益率序列。