关于开源金融计算学习的总结(截至2017年1月3日)

本文在Creative Commons许可证下发布

开源金融计算,源自开源数值计算。实际上需要学习以下内容就可以应对金融计算了。

1、Linux/Unix基本命令,
2、Shell基本编程(这可能会花你一天时间),
最好除了shell编程之外至少学一种脚本语言(建议Perl或Python)。
3、再根据你的需要选学下面某种数学分析软件:
R,Scilab,Octave,C/C++(虽然不是“软件”,但是做金融数学的人多半都用它写算法,不少投行、证券的研究部也在用它。有时候你遇到用上面的软件处理不了的问题,就得用它。但记住,我们不喜欢重复发明轮子!)

下面来介绍下金融计算领域最大牌的计算库:QuantLib

QuantLib是用C++开发,本质上是一个类库,因此需要通过创建类的实例来使用它提供的工具。它所提供的工具包括了我们平常做经济金融计算时用到的很多模型(当然不是所有的,QuantLib面向的基本是金融工程的内容),而且非常灵活。下面是这些模块的一个清单(英文原文和中文翻译):
* Numeric types
* Currencies and FX rates
* Date and time calculations
o Calendars
o Day counters
* Pricing engines
o Asian option engines
o Barrier option engines
o Basket option engines
o Cap/floor engines
o Cliquet option engines
o Forward option engines
o Quanto option engines
o Swaption engines
o Vanilla option engines
* Finite-differences framework
* Short-rate modelling framework
* Financial instruments
* Lattice methods
* Math tools
* Monte Carlo framework
* Design patterns
* Stochastic processes
* Term structures
* Utilities
* QuantLib macros
o Numeric limits
o Debugging macros
* Output manipulators
========翻译===============
1、数字类型
2、货币和汇率
3、日期和时间计算
日历
日期计数
4、定价引擎
亚式期权Asian option
障碍期权Barrier option
组合期权Basket option
期权顶/底Cap/floor
棘轮期权Cliquet option
远期期权Forward option
双币种期权Quanto option
互换Swaption
单纯期权Vanilla option
5、有限差分框架
6、短期利率建模Short-rate modelling framework
7、金融工具
8、涡格法Lattice methods
9、数学工具
10、蒙特卡洛模拟框架
11、设计模式
12、随机过程
13、期限结构
14、工具箱
15、Quantlib宏
数字极限
调试宏
16、输出控制

接下来介绍Quant的手中利器-R

  做统计与经济计算的人肯定知道Eviews,SPSS,SAS,S……这些计算工具。它们都是商业的,要使用他们得支出一大笔钱,当然盗版不在此列。但在我眼里,他们都有着这样那样的缺点:
Eviews,太简单,虽然在一般的教学与学术研究中够用了,但是非常不灵活。

SPSS,功能比Eviews强大,操作非常简单,同时在国际学术界也有较高声誉,但同样不够灵活、价格较高。

SAS,航母级的产品,功能强大、模块复杂,处理大数据集时比Eviews、SPSS好多了。但在我眼里,它最大的缺点不是昂贵,而是语法的落后!它里面 居然有数据步、过程步这些东西。它带着非常明显的汇编语言时代的标志,语法已经落后了。计算机语法是设计思想的体现,它的语法落后,表明它的设计思想已经落后了。

S,在我看来,比上面三个产品要好,语法更优雅。但同样因为是商业软件,你需要付费。

现在,你有另一种选择了,那就是R语言(或者说环境),它的语法和S基本一样,而且实际上这两种语言同源,只是其中一个分支走了商业化道路,另一个分支走了开源的道路而已。
下面我们来看它的语法,在此我们通过一个线性回归的例子来看,如果你有过编程经验,这将非常容易看懂:
x<-c(1,2,3,4,5)
y<-c(5,4,3,2,1)
e1<-y~1+x
lm(e1)

第一、二行分别创建了一个数据序列x, y
第三行创建了一个回归公式,就是y=a+bx(如果你要回归y=bx,没有截距项,就得使用y~0+x)
第四行用最小二乘法对这个公式进行回归。
其输出是:

lm(formula = e1)

Coefficients:
(Intercept) x
6 -1

相信你一定知道这是什么意思吧?

当然,这比起使用Eviews和SPSS的操作来,是需要点学习,但是也非常符合我们建模时的思维。这还有另外一个优点,就是你可以把这些处理写在一个 以.R结尾的脚本中,并把数据单独存放,每次有新数据需要处理时,你只需要重新运行一遍这脚本就行了,数据分析结果、图表等马上呈现,而不需要像 EVIEWS和SPSS一样导入数据、再一次次的点那些按钮。

当然,数据的存放方式,你可以用文本文本、csv文件、xml文件,甚至,如果你的研究比较严肃、数据量比较大、参与人员比较多时,你可以建立一个数据库,R可以从所有这些数据源中方便地读入数据进行处理。

不过,R也是有缺点的。因为它是以编程的方式来工作的,所以它没有EVIEWS和SPSS那么容易上手,一些简单的工作用那些图形化的工具可能更快些。另 外,它与我们常用的EXCEL和OpenOffice文档的交互性没那么好,虽然这个缺点我们可以通过将那些文档导出成文本文档来克服,但它毕竟是个不足。

以下是我看到的一篇论文的R代码,这个模型是一个结构模型,使用两阶段最小二乘法估计,里面用的 参数包括汇率、利率、GDP、上证综指……等等,数据和R程序是分开的。模型本身参考性不大,但可以让大家看到R是如何处理这类问题的。

有些注释是为是源码易读,而有些是注释掉不想让他运行的调试语句或者是不再需要的处理逻辑。

#import data as mydata
#Becareful, the data file format may be various
mydata<-read.table(file="release_new_1.csv",head=TRUE,sep=",");
#add the gap of iC and iA
mydata$iGap<-mydata$iA-mydata$iC;

#season adjustment, and smooth
#"real", "bot"
mydata$real_sm<-filter(mydata$real,rep(1/12,12));
mydata$bot_sm<-filter(mydata$bot,rep(1/12,12));
mydata<-mydata[6:81,1:19];


#Do regression with 2SLS manually
#e1_adj<-real_sm~1+M2_fit+loan_fit+loan_1+iC;
#e2_adj<-ind~1+M2_fit+loan_fit+loan_1+iC;
#e3_adj<-f~1+real_fit+ind_fit+sp+iA+ex+bot;
#e4_adj<-M2~1+f_fit+loan_fit+loan_1;
#e5_adj<-loan~1+iC+req+cb_dep;
#adjusted equations
e1_adj<-real_sm~1+M2_fit+f_fit;
e2_adj<-ind~1+M2_fit+loan_fit+loan_1;
e3_adj<-f~1+real_fit+ind_fit+ex+bot_sm;
e4_adj<-M2~1+f_fit+loan_fit;
e5_adj<-loan~1+iC+req+cb_dep+real_fit;

#Get the fitted endogenous values;
mydata$real_fit<-lm(
real_sm~iC+ex+bot_sm+req+cb_dep+loan_1,
data=mydata)$fitted.values;
mydata$ind_fit<-lm(
ind~iC+ex+bot_sm+req+cb_dep+loan_1,
data=mydata)$fitted.values;
mydata$f_fit<-lm(
f~iC+ex+bot_sm+req+cb_dep+loan_1,
data=mydata)$fitted.values;
mydata$M2_fit<-lm(
M2~iC+ex+bot_sm+req+cb_dep+loan_1,
data=mydata)$fitted.values;
mydata$loan_fit<-lm(
loan~iC+ex+bot_sm+req+cb_dep+loan_1,
data=mydata)$fitted.values;

#fit the equations with the fitted endogenous values
res_e1_adj<-lm(e1_adj,data=mydata);
res_e2_adj<-lm(e2_adj,data=mydata);
res_e3_adj<-lm(e3_adj,data=mydata);
res_e4_adj<-lm(e4_adj,data=mydata);
res_e5_adj<-lm(e5_adj,data=mydata);

#print(summary(res_e1_adj));
#print(summary(res_e2_adj));
#print(summary(res_e3_adj));
#print(summary(res_e4_adj));
#print(summary(res_e5_adj));


#simulate
coef_e1<-res_e1_adj$coefficients;
coef_e2<-res_e2_adj$coefficients;
coef_e3<-res_e3_adj$coefficients;
coef_e4<-res_e4_adj$coefficients;
coef_e5<-res_e5_adj$coefficients;

#[real ind f M2 loan], endogenous matrix
mat_A<-matrix(rep(0,0,25),5,5)
mat_A[1,]<-c(1,0,-coef_e1['f_fit'],-coef_e1['M2_fit'],0);
mat_A[2,]<-c(0,1,0,-coef_e2['M2_fit'],-coef_e2['loan_fit']);
mat_A[3,]<-c(-coef_e3['real_fit'],-coef_e3['ind_fit'],1,0,0);
mat_A[4,]<-c(0,0,-coef_e4['f_fit'],1,-coef_e4['loan_fit']);
mat_A[5,]<-c(-coef_e5['real_fit'],0,0,0,1);
#[iC ex bot req cb_dep loan_1],exogenous matrix
mat_B<-matrix(0,5,6);
mat_B[1,]<-c(0,0,0,0,0,0);
mat_B[2,]<-c(0,0,0,0,0,coef_e2['loan_1']);
mat_B[3,]<-c(0,coef_e3['ex'],coef_e3['bot_sm'],0,0,0);
mat_B[4,]<-c(0,0,0,0,0,0);
mat_B[5,]<-c(coef_e5['iC'],0,0,coef_e5['req'],coef_e5['cb_dep'],0);
#const matrix
mat_C<-matrix(0,5,1);
mat_C[1,]<-c(coef_e1[1]);
mat_C[2,]<-c(coef_e2[1]);
mat_C[3,]<-c(coef_e3[1]);
mat_C[4,]<-c(coef_e4[1]);
mat_C[5,]<-c(coef_e5[1]);
#data matrix
mat_data<-matrix(0,76,6);
mat_data[,1]<-mydata$iC;
mat_data[,2]<-mydata$ex;
mat_data[,3]<-mydata$bot;
mat_data[,4]<-mydata$req;
mat_data[,5]<-mydata$cb_dep;
mat_data[,6]<-mydata$loan_1;

mat_fit<-matrix(0,76,5);

for(i in 1:(length(mat_data[,1])))
{
#mat_temp<-matrix(mat_data[i,],8,1);
mat_temp<-matrix(mat_data[i,],6,1);
mat_fit[i,]<-solve(mat_A) %*% (mat_C + mat_B %*% mat_temp);
}

mat_endo<-matrix(0,76,5);
mat_endo[,1]<-mydata$real_sm;
mat_endo[,2]<-mydata$ind;
mat_endo[,3]<-mydata$f;
mat_endo[,4]<-mydata$M2;
mat_endo[,5]<-mydata$loan;

#effect
mat_fit_m<-matrix(0,76,5);
mat_effect<-matrix(0,length(mat_A[1,]),length(mat_data[1,])-1);
#This loop can simulate the system.
#Each simulation will decrease a specified variable to 99%
#while keep others invariable.
for(n in 1:(length(mat_data[1,])-1))#get how many colums
{
temp<-mat_data[,n];
mat_data[,n]<-mat_data[,n]*1.01;

for(i in 1:(length(mat_data[,1])))
{
#mat_temp<-matrix(mat_data[i,],8,1);
mat_temp<-matrix(mat_data[i,],6,1);
mat_fit_m[i,]<-solve(mat_A) %*% (mat_C + mat_B %*% mat_temp);
}
effect_real<-sum(mat_fit_m[,1]-mat_fit[,1])/sum(mat_fit[,1]);
effect_ind<-sum(mat_fit_m[,2]-mat_fit[,2])/sum(mat_fit[,2]);
effect_f<-sum(mat_fit_m[,3]-mat_fit[,3])/sum(mat_fit[,3]);
effect_M2<-sum(mat_fit_m[,4]-mat_fit[,4])/sum(mat_fit[,4]);
effect_loan<-sum(mat_fit_m[,5]-mat_fit[,5])/sum(mat_fit[,5]);
mat_effect[n,]<-
c(effect_real,effect_ind,effect_f,effect_M2,effect_loan);

mat_data[,n]<-temp;
}

print(mat_effect);

#均方根比
#print(sqrt(mean(((mat_fit[,1]-mat_endo[,1])/mat_endo[,1])^2)));
#print(sqrt(mean(((mat_fit[,2]-mat_endo[,2])/mat_endo[,2])^2)));
#print(sqrt(mean(((mat_fit[,3]-mat_endo[,3])/mat_endo[,3])^2)));
#print(sqrt(mean(((mat_fit[,4]-mat_endo[,4])/mat_endo[,4])^2)));
#print(sqrt(mean(((mat_fit[,5]-mat_endo[,5])/mat_endo[,5])^2)));

  

posted @ 2017-01-03 15:46  evilqliang  阅读(498)  评论(0编辑  收藏  举报