量化投资——隐含波动率曲线建模(1)

论坛 期权论坛 期权     
Billy的量化投资与相关研究   2020-12-19 13:00   4327   0
对于隐含波动率方面一共建立了两个模型,一个动态模型,目的是根据期权价格的变化逐步修正模型参数,并对之后一个交易日的数据进行预测;另一个是静态模型,目的是通过不同时期同一标的资产之下波动率曲线变化趋势的相关性,对于之后类似期权资产的波动率曲线进行预测。目前来看第二个模型效果较为理想,回归拟合相关性的R2基本可以达到0.9左右(目前来看我做过的金融数据处理里面算是非常好的结果了)。第一个结果前期因为数据量本身较小的问题,可能存在模型拟合程度方面的不足,仍需进一步的处理研究。本文主要介绍第一个模型。
注:由于这个模型实际上是实习单位的相关工作,数据也来自于单位的系统,因此在本篇文章(包括下篇文章)中都不会出现完整的模型过程和定量的结论分析,只会提供一个思考方向供诸位继续研究。









综述:由于对于金融数据回归本身较为复杂,通过传统的直线回归往往导致拟合效果较差(衍生品的非线性变化特点),而神经网络等高阶方法回归又容易产生模型背后经济意义不强或难以解释的情况。结合波动率曲线本身的函数特点和背后可以找到的经济涵义,尝试通过二次函数回归的方式进行拟合,并借助卡尔曼滤波的方式消除数据波动变化时的不确定性。









模型算法所需模块:
numpy:数值运算包
pandas:数据分析包
sklearn.linear_model:进行线性回归处理
sklearn.metrics:对回归结果计算R2









模型思路与逻辑:
对于波动率的预测与回归一般情况下可以从两个角度进行思考,直接从各个挡位的隐含波动率本身变化出发进行直接回归预测,或者通过每日各个挡位隐含波动率的截面数据构成的波动率曲线进行间接的刻画,事实上,二者均有各自的优点但也均存在理论或者结果上的不足。模型的主要思路是借助卡尔曼滤波的方式消除两个思考方向存在的不足,并通过循环的方式动态的更新模型参数,以更好的预测之后的数据。
卡尔曼滤波的滤波原理我认为有点点像XGBoost的思路,都是类似希望通过新的模型对之前拟合结果的残差进行再次拟合;不同之处可能在于XGBoost对于生成树的数量可能更多,同时卡尔曼滤波的两个方法本身有一定的限制。当然也可能二者本来就没啥关系是我想多了。









模型理论背景:
卡尔曼滤波:一种利用线性系统状态方程;通过利用对系统的预测和观测数据,对系统状态进行最优估计的算法。卡尔曼滤波面对的问题是实际生活测量中存在的误差问题,同时模型预测时也存在模型本身误差的问题。它利用观测的动态信息和观测结果相结合,从而减小误差对于结果的影响。更进一步,我对于卡尔曼滤波的理解为它实际上是借助两个有误差模型——预测和观测——的结合达到减小误差的作用。
线性回归&多元线性回归:利用最小二乘法解决回归线性拟合的方法,模型中曾使用二次函数回归和多元线性回归,二次函数回归本质上和多元线性回归相同,只是将其中一个需要回归的变量视为其中一变量的平方即可。
神经网络:为了寻找参数关系时曾尝试使用神经网络拟合一个参数,但因为结果R2效果太差而放弃。









模型经济背景与含义:
对于波动率曲线的刻画选取二次函数进行拟合,在二次函数y=a*x^2+b*x+c中,a在数学中反映的是二次函数“开口的大小”,换而言之也代表了导函数的变化速率;b在数学中可以反映二次函数极值点和y轴的对应关系(具体该对应关系的绝对指标还需要和a一起考虑);c在数学中反映了二次函数极值点的函数值。其背后的经济含义分别为:a代表隐含波动率对于当日标的资产价格与合约价格价差的敏感程度,b代表期权市场对于标的价格的预估与实际标的价格的偏差(实际上是b/(2a),但定性的角度而言二者是等价的),c代表平值期权时隐含波动率。背后的经济假设也较为容易理解:平值期权价值往往是低于虚值期权的,且不存在更低价值的期权(如果将另外一般曲线视为相反方向(call&put)的虚值期权)。
对于隐含波动率的直接拟合目前为止较为不完善的地方,我粗线条的假设各个挡位的隐含波动率呈现线性关系,这只是基于期权时间价值的假设(事实上时间价值也不会呈现线性关系)而没有考虑其他诸多因素,之后再模型优化的过程中也可以考虑其他对于隐含波动率直接计算的方法,比如粘性delta规则等。











模型函数介绍:
Adjust_Option_Prize(csv_data,slide_num):对原始的数据集进行处理,包括对调整行权价格后的合约附加"whether_adjustment"=1的label(因为调整行权价格后的合约波动率有很大的异常波动,往往不符合普通的曲线关系,而且一般情况下成交额较低);计算合约价格和标的价格的关系,由于本身数据只提供分档没有价差的指标,而价差在5分和一毛均被归为了一档,在实际的计算中二者仍有一定区别。

Polynomial_Regression(csv_data,slide_num):计算每日的截面数据构成的二次曲线。使用sklearn中的LinearRegression进行回归处理。在回归的过程中,通过之前Adjust_Option_Prize中对于调整行权价格数据的label对这一类数据进行筛选,并将二次函数曲线的三个参数和刻画模型拟合效果的参数R2一同输出。


Trend_of_Parameters_with_Adjustment(coefficient_num_call,coefficient_num_put,csv_data,stock_data,slide_num,k=0.8):回归计算二次函数回归参数的变化趋势。在回归二次函数三个参数的趋势中,考虑到其也与改日标的价格的走势有关系,因此导入标的资产的数据stock_data进行计算,具体选取的指标在之后的代码中可以查到在此不一一赘述。同样输出模型的参数和刻画拟合效果的参数R2。



Direct_Connection_in_iv_call(csv_data_0):寻找各个隐含波动率本身的线性关系。线性关系可能刻画效果较弱,因此将该函数单独编辑以方便之后的优化。回归拟合的方法和Polynomial_Regression相同,再次不再赘述。


Model_Prediction_with_Kalman_Filtering(csv_data,stock_data,csv_data_0,model_start_rate = 0.5,model_end_rate = 0.9,r2_accept_rate = 0.8):主函数,通过卡尔曼滤波方法进行数据的预测。具体的滤波过程见前文理论介绍部分,最后计算每个预测结果的误差。














模型结果:
与下一篇的模型结果一同呈现,以便于比较分析。
(其实是因为还没跑完&有些参数还需要调整)









引申研究与优化设想:
[1]既然有一个感觉卡尔曼滤波和XGBoost如此的像为什么不直接让机器多学习几个模型然后直接XGBoost。当然这个得建立在我的这个感觉是正确的前提下。
[2]隐含波动率实际计算方法即观测值的求解,可以之后看一下粘性delta规则然后再修改Direct_Connection_in_iv_call函数
[3]加大数据样本量以检验模型的普适性,因为我只是通过以上证50ETF作为标的的期权进行计算的,如果不同的标的资产可能会有不同的结果。









写在后面:
今天午盘开始的时候泰豪科技曾冲到接近涨停板的位置(7.70),但当时除了内心一阵窃喜和肾上腺激素疯狂分泌之外没有及时调仓,然后快收盘的时候大盘的跳水导致泰豪科技最后大概以5个多点的涨幅收盘,然而那个时候吓得要死感觉到手的钱就要飞了然后7.40的价格抛了大概一半的样子。
反正我就是没啥大爷大妈们的心态。
后来查了一下原因好像是18号泰豪科技有一轮较大的融资融券,导致今天股价逆市的大涨。反正无论如何两周左右的时间大概给我带来了10%的收益还是有点爽的。







模型中通过卡尔曼滤波的思路来自于陈蓉教授和吕恺博士在2010年发表在《金融研究》上的文章《隐含波动率曲面:建模与实证》,这个模型与该模型仍存在很大的差距。初次上手肯定存在诸多理解和实践上的不足,请诸位读者多多指教。
分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:93
帖子:2
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP