预测一项资产的表现并量化与这种预测相关的不确定性是一项困难的任务:由于缺乏观察到的市场数据,这一任务往往变得更加困难。
最近,中央银行对使用观察到的期权价格数据进行预测产生了兴趣,特别是在金融不确定的时期[1],[2]。一项资产的看涨期权和看跌期权受到市场对资产未来表现的看法的影响。本文介绍了一个基于MATLAB的工作流程®从市场上观察到的相对稀缺的期权价格数据开始,用于创建对资产表现的预测。这个工作流程中的主要步骤是:
- 从市场数据计算隐含波动率
- 使用SABR插值创建额外的数据点
- 估计隐含概率密度
- 模拟未来资产价格
- 用扇形图表示预测的不确定性
扇形图以易于理解的图形形式传达信息,使金融专业人员能够向非专业观众传达他们预测的预测和不确定性(图1)。
本文中使用的MATLAB代码可用于下载.
从市场数据计算隐含波动率
分析师面临的一个关键挑战是从少量可用的市场数据中获得洞察。创建额外数据点的一种技术是(K, σ)空间内插值,其中K是执行价格,σ是资产波动率。要使用这种技术,我们首先必须从市场数据中计算隐含波动率。
我们假设,在最小的情况下,我们可以观察到特定资产的执行买入价格对(或执行卖出价格对),并且我们也知道标的资产价格、无风险利率和期权的到期日。我们使用以下符号将数据存储在MATLAB表中(图2)。
- K -执行价格($)
- C -买入价格($)
- P——看跌期权价格($)
- T -期权的到期时间(年)
- 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),情节也表明波动增长随着罢工的价格远离一些中心值,这似乎是接近标的资产价格= 100。
创建额外的数据点
有几种方法可以用来在(K, σ)空间中生成额外的点。更简单的方法包括对每个失效时间的数据拟合二次函数,或使用interp1
函数来构造三次样条插值。我们选择使用SABR插值来创建额外的数据点,因为这种技术通常可以在数据集的端点上给出更准确的结果。
SABR模型是金融专业人士用来拟合的四参数随机波动率模型[3]波动率微笑,以产生的曲线的形状而命名。在MATLAB中,波动率微笑的拟合分为两步。首先,利用该方法对SABR模型进行标定lsqnonlin
求解器从最优化工具箱™。这种校准使观测数据和候选SABR微笑之间的差异的范数最小化,从而产生SABR模型的最优参数向量。其次,我们将最优参数与Financial Instruments Toolbox™函数一起使用blackvolbysabr
插入所需的执行价格范围。
即使在拟合失效时间T = 0.25的棘手数据时,SABR技术也能很好地工作(图4)。
估计隐含概率密度
在(K, σ)空间内插值后,我们得到了足够的数据点来估计每个到期时间的隐含执行价格密度函数。为了做到这一点,我们使用了由Breeden和Litzenberger[4]开发的计算金融学原理,该原理表明,在时间T时资产价值的概率密度函数f(K)与资产调用价格C = C(K)的二阶偏导数成正比。
方法首先将数据转换为原始域((K, C)-空间)blsprice
功能:
T0 =独特(D.T);S =个终身制(1);射频= D.rf (1);为k = 1:numel(T0) newC(:, k) = blprice (S, fineK, rf, T0(k), sigmaCallSABR(:, k));结束
在这里,fineK
是否有一个定义执行价格范围的向量用于插值和sigmaCallSABR
是使用SABR插值创建的矩阵,其中列包含每个到期时间内的插值波动率微笑。
然后我们计算对执行价格的数值偏导数。这可以在MATLAB中有效地使用diff
函数。
dK = diff (sampleK);/ /重命名/ /重命名/ /重命名= diff(d2K, 1, size(d2K, 2)); / /重命名
我们还使用逻辑索引来删除作为此过程不需要的工件出现的虚假负值。由此产生的曲线为每一个失效时间显示,随着失效时间的增加,功能变得不那么完整(图5)。我们需要推断这些函数之前,我们可以使用它们来估计隐含概率密度,因为他们不定义功能齐全价格范围的罢工的兴趣。
为了扩展这些函数在完全执行价格域上的定义,我们使用适合
函数从曲线拟合工具箱™。这样就很容易从这个插值来推断出所关心的范围。
为pdfFitsCall{k} = fit(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, true, fitValsCall{k});结束
上面的MATLAB代码预先分配了一个名为priceSimCall
其中每一行代表未来的时间,每一列代表从相应的概率分布中得出的随机资产价格。该循环在每个将来的时间点上迭代,并且每次迭代创建一行priceSimCall
矩阵通过随机抽样从适当的分布。的第一个输入参数randsample
是fitKCall {k}
,这是一个包含资产执行价格的向量,可以从中抽取随机样本。第二个输入参数,nSamples
,为所需样本数量,第三个(真正的
)指定我们想要样品和替换。第四个输入参数fitValsCall {k}
概率分布是由randsample
函数在抽取随机样本时。注意,在这个应用程序中执行的独立计算是顺序的为
-循环可以使用parfor
构造。对于较大的数据集,只要有多个处理核心可用来进行计算,并行化就允许应用程序易于伸缩。
创建扇形图
扇形图通常用于绘制时间序列的未来发展预测,以及与预测值相关的不确定性。金融工具箱提供了一个fanplot
功能:创建扇形图。这个功能需要两个输入:历史数据和预测数据。我们将历史数据简单地定义为时间T = 0时对应资产价格S = 100的一个点,尽管如果我们有资产价格的历史数据,那么我们可以在这里合并它们。
历史= [0,S];
预测数据包括失效时间以及前一步执行的模拟结果。
forecastCall = [T0, priceSimCall]; / /价格
然后,我们通过调用fanplot
函数。
forecastCall fanplot(历史)
扇形图中的中心线表示中位数轨迹,每个波段的边缘表示预测模拟矩阵的不同分位数(图7),离中心线最近的波段表示可能性更大的结果。在我们的例子中,预测的资产价格有上升的趋势,正如我们所预料的,预测的不确定性随着时间的推移而增加。
假设和进一步改进
为了提高最终预测的准确性,我们可以加入更多的数据点。我们也可以修改工作流来拟合概率分布,而不是使用外推来完成隐含密度函数的定义,尽管这可能会引入不必要的分布假设。使用看跌价格数据重复这个过程是个好主意。平均来自电话的预测,并将价格数据结果放入图1所示的扇形图中。这种平均倾向于消除小的波动,并抵消只使用一种类型的价格数据所造成的偏差。
请注意,整个工作流可以使用MATLAB脚本自动计算隐含波动率,通过插值创建额外的数据点,估计隐含概率密度,并在生成扇形图显示结果之前模拟未来资产价格。