廖小漩,王孔敬
(1.伯明翰大学 数学学院,伯明翰 埃德巴斯顿 B152TT(英国);2.湖北民族大学 经济与管理学院,湖北 恩施 445000)
Matlab集数值分析、矩阵计算、工程与科学绘图、财务建模以及系统设计与仿真等诸多功能于一体,被广泛应用于数据分析、信号处理、量化金融与风险管理以及财务分析等领域.因其编程效率高、能高效方便的矩阵和数组运算,常用于快速验证算法研究与探索中,但其循环运算效率低、封装性不好等缺点,往往不能充分满足用户的高级要求.
Visual C++是面向对象的可视化集成编程系统,具有程序框架自动生成、灵活方便的类管理、代码编写和界面设计集成交互操作等诸多优点,基于此编程环境能迅速方便地开发出界面友好、执行速度快、易于维护升级的应用程序开发系统.但其仅提供了一些基本的数学函数库,如应用程序开发时涉及复杂数值计算,则需人工进行编程,软件开发周期相对较长,开发成本较高.
期权定价理论是金融学中最基本的研究课题之一,已成为金融经济理论的基石.与欧式期权定价不同,美式期权因内含提前执行权力,可在有效期内的任意时刻进行执行,其定价更为复杂,计算更困难[1-2].为深入研究美式期权定价,文中提出了一种利用Matlab与Visual C++混合编程方法研究美式期权定价的方案,即利用Matlab Coder工具,将基于最小二乘蒙特卡洛美式看跌期权定价的Matlab程序函数直接转换为独立于Matlab环境运行的C代码,并将转换后的C代码应用于Visual C++工程项目中.这为衍生金融工具定价的设计、开发提供了新思路.
对于期权定价,Black和Scholes早在1973年就研究了欧式期权定价[3-4],为包括股票、期货、债券等金融衍生产品的合理定价奠定了基础,并推导出欧式看跌期权定价模型.
(1)
其中,S、K、V、σ、T、r分别为标的股票价格、期权执行价格、期权价值、股价波动率、期权到期日以及无风险利率.
与欧式期权不同,美式期权内含提前执行权力,可在有效期内的任意时刻进行执行[5-6],为此,需将Black和Scholes的定价模型变为自由边界条件.如果标的股价的波动率σ服从GARCH(1,1)模型,则美式股票看跌期权定价模型可写为:
(2)
其中S*为最佳实施边界,σn为GARCH(1,1)模型下股价波动率.
为解决行权类型期权的最优行权时间问题,Longstaff和Schwartz提出了一种在蒙特卡洛模拟过程中确定持有期权所得价格的方法[7],即最小二乘蒙特卡洛模拟法(least square Monte-Carlo,简称LSM).LMS的美式期权定价其核心在于通过引入最小二乘法来估计继续持有期权的价值与某些相关变量之间的最佳匹配关系,从而找出美式期权的最优停时.
(3)
(4)
其中,系数aj为常数,Lj是一组基函数.实际应用时,对于基函数的有多种,如Laguerre多项式、Hermitte多项式、Jacobi多项式、Cheyshev多项式等.Longstaff和Schwartz就选Laguerre多项式作为回归基函数,用于消除变量间相关性[7].设X为标的股票价格且是一个马尔科夫过程.其基函数可表示为:
L0(X)=exp(X/2),
L1(X)=exp(-X/2)(1-X),
L2(X)=exp(-X/2)(1-2X+X2/2),
(5)
…
(6)
图1 Matlab函数转C代码流程Fig.1 The flow chart of Matlab function to C codes
Matlab Coder工具是Math Works公司推出的一个重要的产品,它可直接从其Matlab算法程序自动生成可读、可移植的C和C++代码[9-10].利用Matlab Coder算法设计师不需要将所设计的算法进行C或C++代码编程,仅需按照Matlab转C/C++流程,参照相应规范,建立Matlab算法函数,设置相应目标语言所需参数,就可生成脱离于Matlab环境而独立运行的C/C++程序代码,从而减轻算法设计师编程工作量,可形成更快、更高效的系统开发工作流程.
Matlab与C/C++混合编程之前,首先要配置MEX环境[11-12],下载MinGW-w64 C/C++编译器,但应注意所下载的编译器64位和32位是有所区别的,不同版本的Matlab对应的编译器版本也不相同.文件下载后安装时建议安装到C盘(如C:TDM-GCC-64),随后使用Matlab将MW_MINGW64设置为临时环境变量,并在Matlab命令窗口中运行>>setenv(‘MW_MINGW64_LOC’,‘C:TDM-GCC-64’)命令,再设置环境变量,其中变量名:MW_MINGW64_LOC,变量值为C:TDM-GCC-64,设置好后重启Matlab,再在Matlab命令窗口中运行>>mex -setup命令.如编译器配置成功,则提示MEX配置为使用‘MinGW64 Compiler(C)’以进行C语言编译.再选择不同语言,如mex -setup C++,并输入>>make命令编译,即可配置成功.文中,以Matlab 2016b版本Matlab Coder转 C代码为例进行分析,其转换流程如图1所示.
如图1所示,转换流程为:首先在Matlab环境中编写基于LMS的美式看跌期权定价m文件,并利用Code Generation Readiness Tool整体分析函数,对不符合转换规范要求的算法反复修改、调整,使之满足规范,再编译成Visual C++需要的头文件及相应C文件,并导入到创建的Visual C++工程中编译,在此基础上,进行代码验证及输出结果验证,如与Matlab程序输出结果一致,说明转换成功,然后转出代码供后续开发调用.
在Matlab环境中,编写基于LMS美式看跌期权定价的Matlab函数,并保存为americanoptlsm.m文件.经测试函数功能正常后,再在Matlab命令窗口中运行>>coder命令,调出Matlab Coder工具进行C代码转换.基于LMS美式看跌期权定价的Matlab源码如下:
functionOption_price=americanoptlsm(s0,k,r,t,sigma,n,m)
dt=t/n;
Z=randn(n,m); %生成随机数
R=exp((r-sigma^2/2)*dt+sigma*sqrt(dt)*Z); %生成风险中性下的价格
A=s0*ones(1,m); %生成矩阵
s=cumprod([A;R]); %合成矩阵
extime=(m+1)*ones(n,1);
CF_Matrix=zeros(size(s)); %现金流矩阵
CF_Matrix(end,:)=max(k-s(end,:),0); %实值期权行权收益
for i=m-1:-1:2
idx=find(s(i,:) x=s(i,idx)'; x1=x/s0; y=CF_Matrix(i+1,idx)'*exp(-r*dt); %对现金流进行贴现 R=[ones(size(x1)) (1-x1) 1/2*(2-4*x1-x1.^2)]; a=Ry; %线性回归 c=R*a; %线性回归预测的现金流 jdx=max(k-x,0)>c; %找出现在期权是最优的价格 nidx=setdiff((1:m),idx(jdx)); CF_Matrix(i,idx(jdx))=max(k-x(jdx),0); extime(idx(jdx))=i; CF_Matrix(i,nidx)=exp(-r*dt)*CF_Matrix(i+1,nidx); end Option_price=mean(CF_Matrix(2,:))*exp(-r*dt); %基于LMS的美式看跌期权定价 其中,s0、k、r、t、sigma、n、m分别为股票价格、执行价、无风险利率、期权存续期、股票收益率标准差、时间步数以及模拟路径个数. 图2 Matlab程序成功转C代码后生成的报告截图Fig.2 The screenshot of report after successful conversion from Matlab program to C codes 在Matlab命令窗口中运行>>coder命令,调出Matlab Coder,添加americanoptlsm.m后,经设置输入变量类型、创建MEX函数,检查运行时可能存在的问题、再经反复修改使之满足规范要求后,生成一系列的文件.其中主要的是americanoptlsm_data.c、americanoptlsm_emxutil.c、americanoptlsm_initialize.c、americanoptlsm_terminate.c、americanoptlsm.c、eml_rand_mt19937ar_stateful.c及其相应的头文件.Matlab函数转C代码成功后生成的报告示意图如图2所示. 为便于在Visual C++编程环境中进行调用,将由Matlab生成的一系列的文件及其头文件整合成一个与m文件名相对应*.h和*.c文件,如americanoptlsm.c及americanoptlsm.h,而后拷贝到Visual C++工程项目中,并分别导入Visual C++工程的源文件及头文件中,即将americanoptlsm.c导入源文件、americanoptlsm.h导入头文件中.受篇幅限制,本文略去了所有整合过程及代码. 基于LMS美式看跌期权定价的Matlab函数功能主要能够实现基于有限的时间点,根据标的资产价格运动的模拟路径在每个时刻的截面数据,利用最小二乘回归求解出继续持有期权的期望收益,并与该时刻立即行权的可得现金流相比较,如果后者大于前者,则立即行权,否则,继续持有期权[13]. 为了直观分析,将标的资产初始价格s0设置为变量,即标的资产初始价格从1递增到200,步长为1,期权执行价格k=100,无风险利率r=0.04,期权存续期t=1,资产价格波动率sigma=0.4,离散时间区时间步数n=4,模拟样本路径m=5.并借助Matlab的绘图功能对计算后的看跌期权定价进行曲线绘制.为了便于观测Matlab环境与Visual C++编程环境中看跌期权定价价格图形的区别,在Visual C++程序设计时,下载了一个可视化图表控件——ChartControl控件,并整体移植到Visual Studio 2019中所建的MFC应用程序中,显示基于LMS的美式看跌期权定价价格所对应的曲线.在Matlab环境以及在Visual C++编程环境中显示的基于LMS的美式期权看跌期权定价价格曲线图如图3所示. (a) Matlab环境中显示结果 (b) Visual C++编程环境中显示结果图3 基于最小二乘蒙特卡洛的美式看跌期权定价价格曲线Fig.3 The curve of pricing American put options based on LMS 通过对比分析图3(a)、(b)曲线,可以得出在Matlab环境以及在Visual C++编程环境中绘制的基于最小二乘蒙特卡洛的美式看跌期权定价曲线变化趋势一致,说明由Matlab Coder实现基于最小二乘蒙特卡洛的美式看跌期权定价的Matlab程序转C代码方案是可行的. 文中实现了基于LMS美式看跌期权定价的Matlab与Visual C++混合编程.利用Matlab实现了基于LMS美式看跌期权定价的计算和看跌期权定价曲线绘制,并介绍了利用Matlab Coder将基于最小二乘蒙特卡洛美式看跌期权定价的m文件转化成C代码的流程及MEX环境配置,介绍了转换后的C代码如何加入Visual C++工程项目中,编写了可视化交互操作界面对其进行调用,实现了Visual C++环境中看跌期权定价计算及曲线绘制.采用该方案有效提高了软件编程效率,减轻了编程工作量,可加快算法从研究到实际应用的进程,这为分析衍生金融工具定价提供了新的解决思路与方法.3.2 用Matlab Coder生成C源代码及头文件
3.3 Visual C++中的调用代码编写
3.4 代码及功能验证
4 结语