Python两个Parkinson波动率计算函数结果不一致如何调整
问题原因
两个函数的核心逻辑差异出在计算顺序和多余的滚动平均步骤:
- 正确的Parkinson波动率计算逻辑是:先计算每日的对数高低价比平方调整项,对该调整项做窗口为
window的滚动平均,将平均值年化(乘以交易天数252)后开平方,得到最终的滚动波动率。 - 原
Parkinson1存在两个错误:- 没有使用滚动平均后的方差项计算年化波动率,而是直接对单日方差项做年化开方
- 多做了一次不必要的波动率滚动平均,导致结果被平滑、数值偏低,和正确结果有偏差
修改后的Parkinson1代码
import math import numpy as np def Parkinson1(price, window, trading_periods=252, clean=True): # 计算每日帕金森方差项 sigmasqrd = (1.0 / (4.0 * math.log(2.0))) * ((price['High'] / price['Low']).apply(np.log))**2.0 # 滚动窗口求方差平均值,年化后开方得到波动率 sigma = (trading_periods * sigmasqrd.rolling(window).mean()) ** 0.5 # 和Parkinson2对齐,可选去除空值 if clean: return sigma.dropna() else: return sigma
修改后调用时参数和Parkinson2保持一致,输出结果就会完全匹配,相比用apply实现的Parkinson2,向量化实现的新版本运行效率更高。
内容的提问来源于stack exchange,提问作者Gloria Dalla Costa
相关产品推荐
相关产品推荐

