七宝一丁 发表于 2023-4-15 12:58:24

波动率套利交易python代码

本篇文章写一下新玩具——波动率套利,volitility arbitrage!小白友好隐含波动率:https://pic3.zhimg.com/80/v2-cc18926bded8569725e204293eb9de4a_1440w.webp期权交易界有句话说,期权交易是波动率的交易。隐含波动率(下文简称iv)是期权交易的核心。iv是对未来股价波动的预期,一份iv为95%的期权表明,在期权到期日之前,未来股价可能会上涨或者下跌95%。随便选个期权点进去,都能看到iv,不同券商iv读数不同,是因为计算iv的模型不一样。有个例子讲的iv讲的很形象,Tom不确定会不会下雨,他打开窗户,看到街上行人都带了伞,于是判断今晚很可能会下雨。这个对未来下雨的预期,就是隐含波动率。IV越高,期权价格越贵。和任何市场一样,供需关系直接影响IV,IV越高,说明买的人越多,期权价格当然也就越贵。Delta:https://pic4.zhimg.com/80/v2-e348d0477ff48b6b080770a353de1d27_1440w.webp期权兄弟随身带几把尺子,随时测量和亲兄弟股票的关系。其中一把尺子叫delta,用来衡量期权价格随股票价格的变动幅度。当delta等于0.65时,股价上涨1块钱,期权价格会上涨0.65元。delta-hedging(delta对冲):https://pic2.zhimg.com/80/v2-fec3d77f3e3b6bb7ceddb19ab97fe389_1440w.webp知识已经储备好,现在进入这个策略的核心部分。这个策略的套利空间来自iv和已实现波动率(realized volitility,RV)的差异。比方说,一张期权的iv是95%,但是到期日时,他的iv变成了90%,那么这5%的差异就是利润的来源。网上对已实现波动率(下文简称RV)的解释花里胡哨,在本文中RV就是对未来隐含波动率的预测。比如说上面,我们预测iv等于90%(价格低),现在iv等于95%(价格高),我们先卖一张,收到钱,等它波动率降低到90%,再回来,高卖低买赚差价哈哈。只赚波动率的钱,就必须剥离股价方向波动(涨跌)对组合的影响,整个组合要保持delta中性。straddle策略就是一种delta中性策略,同时买入同一个行权价的put和call,股价涨也能赚,跌也能赚:https://pic2.zhimg.com/v2-392de7dcfdf8e6aac0c1616e58f40045_b.jpg

再举个例子,以美股为例,一般1张期权对应100股股票。你买了一张delta=0.56的call,同时又做空了56股股票。如果1股跌1块钱,你的这张期权就要跌0.56*100等于56块钱,但是因为你又做空了股票,一涨一跌刚好抵消。这就叫delta对冲。预测RV:前面说利润来自IV和RV的差异,IV一开始就知道,所以关键在于计RV。目前计算RV的最好方法是GARCH模型,GARCH模型是基于金融时间系列波动率聚集的特征建模的。用人话说,就是股价大波动接着大波动,小波动接着小波动。在高波动的时候,人们情绪高涨,市场的势能不断积累,于是会转化成更大的波动;在低波动的时候,人们对市场的兴趣越来越低,市场逐渐会成为一摊死水。GARCH就是在这样的市场特征基础上建立的。下面开始用Python自带的arch库来试试RV预测。第一步,导库,准备数据。import pandas_datareader.data as webfrom datetime import datetime, timedeltaimport pandas as pdimport matplotlib.pyplot as pltfrom arch import arch_modelfrom statsmodels.graphics.tsaplots import plot_acf, plot_pacfimport numpy as npfrom arch.__future__ import reindexingstart = datetime(2015, 1, 1)end = datetime(2021, 4, 16)dis = web.DataReader('SPY', 'yahoo', start=start, end=end)returns = 100 * dis.Close.pct_change().dropna()plt.figure(figsize=(10,4))plt.plot(returns)plt.ylabel('Pct Return', fontsize=16)plt.title('SPY Returns', fontsize=20)
第二步,训练数据。plot_pacf(returns**2)plt.show()model = arch_model(returns, p=2, q=2)model_fit = model.fit()model_fit.summary()rolling_predictions = []test_size = 365*5for i in range(test_size):    train = returns[:-(test_size-i)]    model = arch_model(train, p=2, q=2)    model_fit = model.fit(disp='off')    pred = model_fit.forecast(horizon=1)    rolling_predictions.append(np.sqrt(pred.variance.values[-1,:][0]))rolling_predictions = pd.Series(rolling_predictions, index=returns.index[-365*5:])plt.figure(figsize=(10,4))true, = plt.plot(returns[-365*5:])preds, = plt.plot(rolling_predictions)plt.title('Volatility Prediction - Rolling Forecast', fontsize=20)plt.legend(['True Returns', 'Predicted Volatility'], fontsize=16)
https://pic1.zhimg.com/80/v2-48117ef6244a2efc479dc9477b1a551c_1440w.webp第三步,预测RV。train = returnsmodel = arch_model(train, p=2, q=2)model_fit = model.fit(disp='off')pred = model_fit.forecast(horizon=7)future_dates = 1] + timedelta(days=i) for i in range(1,8)]pred = pd.Series(np.sqrt(pred.variance.values[-1,:]), index=future_dates)plt.figure(figsize=(10,4))plt.plot(pred)plt.title('Volatility Prediction - Next 7 Days', fontsize=20)
https://pic1.zhimg.com/80/v2-1a1a0ac8f9a0bf209e1afb7806de3288_1440w.webp预测出2020年6月11日的RV是122%,那么你可以在之前卖出IV高于122%的ITM call,并时刻保证delta中性,赚波动率回归的钱。为什么要卖ITM的期权?因为在波动率曲面(volitility surface)中,越是价内的期权,波动率回归的越快,最终收敛至RV。进阶:期权大兄弟还有一把尺子,叫做gamma,它是和delta一起用的。delta为0.5,gamma为0.05,那么股价每涨1块钱,delta会增加:gamma*1=0.05,从0.5增加到0.55。gamma用来衡量股价和delta之间的关系。股价涨1块钱,delta涨几块钱。因为有gamma的存在,delta会一直变化,这就需要你一直调整delta,让它一直等于0。这就是动态对冲!

hzhssg 发表于 2023-4-15 19:27:05

你好你好

hzhssg 发表于 2023-4-15 19:27:23

有没有量化机器人,想租一个使用
页: [1]
查看完整版本: 波动率套利交易python代码