预测资产的性能和量化与这些预测的不确定性是一个艰巨的任务:一个经常被观察到的市场数据的短缺变得更加困难。
近来,一直在使用不良观察期权价格数据用于创建预报从中央银行的兴趣,特别是在[1],[2]金融的不确定性的时期。在资产上看涨和看跌期权是由市场如何相信资产将在未来执行的影响。本文介绍了在MATLAB工作流程®用于创建一个预测资产的表现,首先是从市场上观察到的相对稀缺的期权价格数据。在这个工作流程中的主要步骤是:
- 计算从市场数据的隐含波动率
- 使用SABR插值创建额外的数据点
- 估计隐含概率密度
- 模拟未来的资产价格
- 呈现所述预测不确定性的风扇图中
扇形图以可访问的图形形式传递信息,使金融专业人员能够将其预测的预测和不确定性传达给非专业观众(图1)。
本文中使用的MATLAB代码可用于下载。
从市场数据计算隐含波动率
分析师面临的一个关键挑战是如何从少量可用的市场数据中获得洞察力。一种技术用于创建额外的数据点插值(K,σ)讨论,K是执行价格和σ是资产的波动性。要使用这项技术,我们首先必须从市场数据中计算隐含波动率。
我们假定,至少我们可以观察到给定资产的走向看涨价格对(或走向看跌价格对),我们还知道基础资产价格、无风险利率和期权的到期时间。我们使用以下表示法(图2)将这些数据存储在MATLAB表中。
- 的K - 行使价($)
- C -买入价格(元)
- P -卖价(元)
- 期权的到期日(年)
- rf -无风险利率([0,1]范围内的小数)
- 的S - 标的资产价格($)
当我们插值(K,σ)讨论,资产波动,σ,测量作为一个十进制数的区间[0,1]。我们首先通过使用Financial Toolbox™函数计算Black-Scholes隐含波动率来单独分析看涨期权的价格数据blsimpv
:
D.sigmaCall = blsimpv(D.S,D.K,D.rf,D.T,D.C,[],[],[],{“电话”});
的结果示出了曲线图,对于这个数据组,最高的波动与对应于终止时间T = 0.25(图3)中的数据的结束点相关联。该图还示出了波动随着执行价格移动从一些中心值,这似乎是接近标的资产价格S = 100的路程。
创建额外的数据点
几种方法可以用于产生在(K,σ)空间附加分。更简单的方法包括拟合的二次函数的数据中的每个期满时间,或使用interp1
函数构造三次样条插值。我们选择使用SABR插值来创建额外的数据点,因为这种技术通常可以在数据集的端点提供更准确的结果。
SABR模型是金融专业人士用来拟合的四参数随机波动率模型[3]波动率微笑,以生成的曲线形状命名。在MATLAB中对波动微笑进行拟合是一个两步过程。首先,我们使用的校准SABR模型lsqnonlin
从优化工具箱™求解器。该校准最小化了观测数据与候选SABR smile之间的差异,从而得到了SABR模型的最佳参数向量。其次,我们使用最优参数和金融工具工具箱功能blackvolbysabr
跨越所需的行权价格的范围内进行插值。
所述SABR技术工作得很好甚至用于装配对应于到期时间T = 0.25(图4)的别扭的数据。
估计隐含概率密度
在插值(K,σ)讨论,我们获得足够的数据来估计隐含价格密度函数在每一个失效时间。为此,我们使用了Breeden和Litzenberger[4]开发的计算金融原理,该原理指出,在T时刻资产价值的概率密度函数f(K)与资产调用价格C = C(K)的二阶偏导数成正比。
对于每个到期时间,我们首先将数据转换为原始域((K, C)-space)blsprice
功能:
T0 =唯一的(D.T);S = D.S(1);RF = D.rf(1);为K = 1:numel(T0)NEWC(:,k)的= blsprice(S,fineK,RF,T0(K),sigmaCallSABR(:,k))的;结束
这里,fineK
向量定义的执行价格范围是否用于插值和sigmaCallSABR
使用SABR插值,其中所述列包含内插的波动微笑每个期满time.`是矩阵创建
然后计算关于执行价格的数值偏导数。这可以在MATLAB中有效地实现DIFF
函数。
dK = diff (sampleK);Cdash = diff(newC) ./ repmat(dK, 1, size(newC, 2));Cddash = diff(Cdash) ./ repmat(d2K, 1, size(Cdash, 2));
我们还使用逻辑索引来删除作为此过程中不需要的工件出现的伪负值。由此产生的曲线为每一个失效时间显示,随着失效时间的增加,功能变得不那么完整(图5)。我们需要推断这些函数之前,我们可以使用它们来估计隐含概率密度,因为他们不定义功能齐全价格范围的罢工的兴趣。
为了将这些函数的定义扩展到整个执行价格域,我们使用适合
从曲线拟合工具箱™功能。它是那么容易的,从这个插值来推断覆盖感兴趣的范围。
为K = 1:numel(T0)pdfFitsCall {K} =拟合(pdfK,approxCallPDFs(:,k)时,“线性”);结束
这里,pdfK
由矢量定义所需执行价格的范围和approxCallPDFs
是一个矩阵,在其列中存储每个到期时间的隐含密度近似值。推断和正常化每个函数下的面积,以确保我们有有效的概率密度函数,得到隐含密度(图6)。注意分配模式逐渐向上移动随着到期时间的增加,和似乎有增加的趋势波动。
模拟未来的资产价格
现在我们已经有了未来所有时间资产价格的完整概率分布,我们可以从每个分布中随机抽取样本来创建一个预测矩阵。我们需要根据前面步骤中定义的概率分布,从给定的资产价格范围内随机抽样(带有替换)。这个模拟很容易实现randsample
函数来自统计和机器学习工具箱™。
nSamples = 1 e3;priceSimCall = NaN(numel(T0), nSamples);为K = 1:numel(T0)priceSimCall(K,:) = randsample(fitKCall {K},NSAMPLES,真实,fitValsCall {K});结束
在MATLAB代码以上预分配的矩阵命名priceSimCall
其中每一行代表一个未来时间和每列代表从相应的概率分布中抽取的随机资产价格。循环迭代每未来的时间过去,每次迭代产生的一个排priceSimCall
通过对矩阵的适当分布进行随机抽样。的第一个输入参数randsample
是fitKCall {k}
,其中包含要从中抽取随机样本的资产执行价格的向量。第二个输入参数,NSAMPLES
是样品的所要求的数量,和所述第三(真正的
)指定我们要更换样品。第四个输入参数fitValsCall {k}
是由所使用的概率分布randsample
函数在绘制随机样本时。请注意,在这个应用程序中使用sequential执行的独立计算为
-循环可以使用PARFOR
构造。对于较大的数据集,并行化允许应用程序规模,只要容易地作为多个处理核心可用于计算。
创建扇形图
扇形图通常用来描绘一个时间序列的预测未来演变,以及与预测值相关的不确定性。“金融工具箱”提供一个fanplot
创建扇形图的功能。此功能需要两个输入:历史数据和预测数据。我们将历史数据定义为T = 0时的一个点,对应的资产价格是S = 100,尽管如果我们有资产价格的历史数据,那么我们可以将它们合并到这里。
历史= [0,S];
预测数据包括失效时间和上一步模拟的结果。
预测呼叫= [T0, priceSimCall];
然后,我们使用对的调用创建扇形图fanplot
函数。
forecastCall fanplot(历史)
扇形图的中心线表示轨迹中值,每个波段的边缘表示预测模拟矩阵的不同分位数(图7),最靠近中心线的波段表示更可能的结果。在我们的例子中,预计资产价格有上升的趋势,正如我们所预料的那样,预测的不确定性会随着时间而增加。
假设及进一步改善
为了提高最终预测的准确性,我们可以加入更多的数据点。我们也可以修改工作流以适应概率分布,而不是使用外推法来完成隐含密度函数的定义,尽管这可能会引入不必要的分布假设。使用看跌价格数据重复这个过程是一个好主意。将从call和put价格数据创建的预测结果平均到图1所示的扇形图中。这样的平均往往会消除小的波动,并抵消只使用一种类型的价格数据所造成的偏差。
请注意,整个工作流可以使用MATLAB脚本自动完成,该脚本计算隐含波动率,通过插值创建额外的数据点,估计隐含的概率密度,并在生成显示结果的扇形图之前模拟未来的资产价格。