赞
踩
我们现在站在现实时点B回顾过去,从A到B这段时间的历史行情我们是知道的,但是基于过去一段时间,标的价格的历史数据计算出来的波动率,就是历史波动率,上面例子中X和Y股票的波动率,就属于历史波动率。
历史波动率用来反映标的价格,在过去一段时间的波动水平
隐含波动率:预测的波动率
同样站在现在这个时间点B我们不仅可以回顾过去,还可以展望未来,虽然未来的标的价格我们不得而知,但是我们可以通过期权市场去发现投资者对于标的价格来来一段时间波动水平的普遍预期,这种基于期权市场价格计算出来的,反映市场对于未来标的价格波动预期的指标,这就是隐含波动率。
例如X公司股票期权以24%的隐含波动率进行交易,而Y公司股票以8%的隐含波动率进行交易,这就反映了出来市场中的一个观点,那就是市场普遍认为,未来X公司股票比Y公司股票的波动性更强。
表示未来的一段时间内,标的价格波动的真实水平,如果我们站在未来时点C,那么它就是历史波动率,但是我们是出于现在这个时点B,因此我们并不能准确的计算出已实现波动率。
已实现波动率通常用于和隐含波动率进行对比,反映出投资者对未来的预期是否准确,换言之就是投资者交易期权是否会盈利。
波动率微笑(Volatility Smile)是金融市场中一种观察到的现象,特指在期权市场上,不同行权价的期权隐含波动率呈现出不同的形态。具体来说,波动率微笑指的是在期权的不同行权价上,隐含波动率形成了一个像微笑一样的曲线,通常在某个中间行权价处达到最低点,然后向两侧逐渐上升。
平价期权的波动率最低,而实值和虚值期权的波动率会随着实值或虚值程度的增大而增大,两边比较对称。
Fat Tail Risk(尾部风险):波动率微笑反映了市场对资产价格出现极端波动的担忧。通常,远离当前市场价格的深度虚值期权(深度虚值put期权和深度虚值call期权)的隐含波动率会较高,因为市场参与者更关注价格大幅波动的可能性。
Skewness(偏度):波动率微笑也反映了期权市场上的偏度,即对价格上涨和下跌的偏好程度不同。通常情况下,对于低于市场价格的行权价,投资者更倾向于购买put期权,而对于高于市场价格的行权价,投资者更倾向于购买call期权。这种偏好导致了不同行权价下的隐含波动率的变化。
波动率期限结构(Volatility Term Structure) ,是指隐含波动率会随期权到期时间不同而变化。
一般来说,不同的标的资产所表现出来的期限结构具体形状会有所不同,但它们大都具有以下特点:
举一个简单的例子,假定初始猜测某支期权的波动率是 20%,对应该波动率数值估计得到的欧式看涨期权价格是 0.1035 元,显然,比市场价格 0.1566 元更小。
由于期权价格是波动率的增函数,因此合理地估计正确的波动率应该会比 20%更大。然后假定波动率是 30%,对应的期权价格 0.336 元,这个结果又比 0.1566 元高,则可以肯定波动率是介于 20%-30%的区间中。
接下来,取上两次波动率数值的均值,也就是波动率 25%,对应的期权价为 0.1662 元,这个值又比 0.1566 元高,但是合理的波动率所处的区间范围收窄至 20%与 25%之间,然后取均值 22.5%继续计算,
每次迭代都使波动率所处的区间减半,最终就可以计算出满足较高精确度的隐含波动率近似值。
def calculateImpv(price, s, k, r, t, cp): """计算隐含波动率""" # 检查期权价格必须为正数 if price <= 0: return 0 # 检查期权价格是否满足最小价值(即到期行权价值) meet = False if cp == 1 and (price > (s - k) * exp(-r * t)): meet = True elif cp == -1 and (price > k * exp(-r * t) - s): meet = True # 若不满足最小价值,则直接返回0 if not meet: return 0 # 采用Newton Raphson方法计算隐含波动率 v = 0.29 # 初始波动率猜测 for i in range(50): # 计算当前猜测波动率对应的期权价格和vega值 p = calculatePrice(s, k, r, t, v, cp) vega = calculateOriginalVega(s, k, r, t, v, cp) # 如果vega过小接近0,则直接返回 if not vega: break # 计算误差 dx = (price - p) / vega # 检查误差是否满足要求,若满足则跳出循环 if abs(dx) < DX_TARGET: break # 计算新一轮猜测的波动率 v += dx # 检查波动率计算结果非负 if v <= 0: return 0 # 保留4位小数 v = round(v, 4) return v def calculateOriginalVega(s, k, r, t, v, cp): """计算原始vega值""" price1 = calculatePrice(s, k, r, t, v*STEP_UP, cp) price2 = calculatePrice(s, k, r, t, v*STEP_DOWN, cp) vega = (price1 - price2) / (v * STEP_DIFF) return vega def calculatePrice(s, k, r, t, v, cp): """计算期权价格""" # 如果波动率为0,则直接返回期权空间价值 if v <= 0: return max(0, cp * (s - k)) d1 = (log(s / k) + (r + 0.5 * pow(v, 2)) * t) / (v * sqrt(t)) d2 = d1 - v * sqrt(t) price = cp * (s * cdf(cp * d1) - k * cdf(cp * d2) * exp(-r * t)) return price
隐含波动率的计算使用牛顿法(也称为牛顿-拉弗森方法)来逼近方程的根。在这个特定的情况下,我们希望找到一个波动率值,使得使用Black-Scholes模型计算得到的期权价格等于实际观察到的期权价格。以下是牛顿法计算隐含波动率的步骤:
初始化波动率的猜测值: 首先,我们需要选择一个初始猜测值作为波动率的估计值。通常情况下,可以选择一个合理的初始值,例如0.01。
迭代计算: 接下来,我们开始迭代计算。在每一次迭代中,我们计算当前波动率下的期权价格,并计算该波动率对应的Vega值(期权价格对波动率的导数)。然后,我们计算误差值,即实际观察到的期权价格与使用当前波动率估计值计算得到的价格之间的差异。
更新波动率估计值: 使用误差值和Vega值,我们可以计算出一个修正值,用来更新波动率的估计值。这个修正值是通过将当前波动率估计值减去误差值除以Vega值得到的。
重复迭代: 我们将修正后的波动率估计值作为新的猜测值,然后重复上述步骤,直到达到预先设定的精度要求或者达到最大迭代次数。
输出结果: 最终得到的波动率估计值就是我们所寻求的隐含波动率。
这个过程是一个迭代的过程,通过不断地更新波动率估计值,直到找到一个使得模型计算价格与市场观察价格相符的波动率值。
具体来说,Black-Scholes方程是一个偏微分方程,描述了欧式期权价格C(s,t)与基础标的资产价格St、时间t、波动率、行权价格K和无风险利率r之间的关系。通过解这个方程,我们可以找到一个隐含波动率值,使得期权价格与方程的解相等
这里一共定义了三个函数:calculateImpv,calculateOriginalVega和calculatePrice,分别用于计算隐含波动率、原始vega值以及期权价格,可以看到该策略使用的正式Black-Scholes公式,首先检查波动率是否为0,如果为0,则直接返回期权的空间价值,即max(0, cp * (s - k))。这是因为当波动率为0时,期权价格只与基础资产价格和行权价格有关。
如果波动率不为0,那么会根据Black-Scholes公式计算出两个距离分布函数d1和d2,然后根据这些参数计算出期权价格。其中cp代表期权类型(1代表看涨期权,-1代表看跌期权),s代表基础资产价格,k代表行权价格,r代表无风险利率,t代表时间,v代表波动率。
同时在这个情境下,我们可以将期权价格视为一个函数,该函数关于波动率的一阶导数就是vega。因此,通过计算vega并对其进行迭代更新,我们可以更精确地估算出满足某个误差容忍度的波动率值。简单来说,vega在这里起到了一个桥梁的作用,帮助我们将期权价格与波动率联系起来,从而可以通过迭代方法找到合适的波动率值。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。