怎么利用高频数据,预测日内波动率?

论坛 期权论坛 期权     
期权匿名问答   2021-11-15 21:42   11847   4
Google scholar 搜intraday volatility modeling,然后慢慢看吧。
分享到 :
0 人收藏

4 个回复

倒序浏览
Google scholar 搜intraday volatility modeling,然后慢慢看吧。
泻药,波动率是众多定价和风险模型中的关键参数,例如BS定价方法或风险价值的计算。在这个模型中,或者说在教科书中,这些模型中的波动率通常被认为是一个常数。然而,情况并非如此,根据学术研究,波动率是具有聚类 和长记忆特征的时间序列变量。

原文:
r语言预测波动率的实现:ARCH模型与HAR-RV模型
本博客比较了GARCH模型(描述波动率聚类),ARFIMA模型( 长记忆),HAR-RV模型(基于高频数据 ),以及来自SSE 50指数和CME利率期货的样本。

此外,本文使用滚动时间窗预测方法来计算预测波动率并构建指数以评估模型的准确性。结果表明,基于长记忆和实现波动率的ARFIMA-RV模型是最准确的模型。



1.基于GARCH的模型

     - 描述波动率聚类
为了模拟异方差性,GARCH采用以下过程:






为了反映金融市场的不对称性,学者们提出了EGARCH,TGARCH或APARCH(非对称权力自回归条件异方差),其中APARCH更为一般。






我们从在中拟合APARCH开始:






可以看出ARCH效应是显而易见的










我们可以得到模型的系数,以及误差分析














为了进一步分析模型,我们分析了QQ图中的正态性残差。






我们发现残差不正常,然后我们测试残差的自相关:






测试对于上面列出的模型,所有残差都具有一些自相关效应。因此,基于GARCH的模型可能不够准确,无法预测波动性。

我们使用MSE(误差的均方)来测量模型的预测性能。
MSE.NGARCH0.000385108313676526MSE.tGARCH0.00038568802365854MSE.APARCH0.000385278917823468



2.基于HAR-RV的模型

    - 处理高频实现的波动率
高频数据包含更丰富的日内交易信息,因此可用于衡量波动率。实现波动是其中一种方式。如果我们将交易日划分为时段,每个时段都会有一个日志返回,那么实现的收益可以计算如下:






HAR-RV,异构自回归RV模型由科希创建。它说每日房车将与前一时期的每日,每周和每月房车有关。


























MSE计算如下
MSE.HARRV1.08226110318177 * 10 ^( - 7)MSE.HARRVCJ1.90270268315141 * 10 ^( - 7)



3.基于ARFIMA的模型

    - 描述长记忆
ARFIMA是自回归分数积分移动平均线的模型,其具有与ARMA模型相同的表示形式,但差分参数d可以是非整数值:






在差分参数d是非整数的情况下,则可以如下表示回程操作






在中,我们编程探索HAR-RV和HAR-RV-CJ模型。














MSE如下所列
MSE.ARFIMA11.0663781087345 * 10 ^( - 7)MSE.ARFIMA21.06634734745652 * 10 ^( - 7)MSE.ARFIMA31.06846983445809 * 10 ^( - 7)



结论

SH50S&P500MSE.NGARCH0.0003851083147.793024760363 * 10 ^( - 5)MSE.tGARCH0.0003856880247.803986179542 * 10 ^( - 5)MSE.APARCH0.0003852789197.781641356006 * 10 ^( - 5)MSE.HARRV1.082261103181 * 10 ^( - 7)1.459464289508 * 10 ^( - 9)MSE.HARRVCJ1.902702683151 * 10 ^( - 7)N / A(没有足够的数据)MSE.ARFIMA11.066378108737 * 10 ^( - 7)1.820349558502 * 10 ^( - 8)MSE.ARFIMA21.066347347457 * 10 ^( - 7)1.848206765296 * 10 ^( - 8)MSE.ARFIMA31.068469834458 * 10 ^( - 7)1.844987432992 * 10 ^( - 8)
从结果我们知道基于ARFIMA的模型具有与HAR-RV相似的准确度,并且两者都比GARCH模型好得多。
泻药。在学术界和金融界,分析高频财务数据的经济价值现在显而易见。它是每日风险监控和预测的基础,也是高频交易的基础。为了在财务决策中高效利用高频数据,高频时代采用了最先进的技术,用于清洗和匹配交易和报价,以及基于高收益的流动性的计算和预测。



例子1

原文链接:

拓端数据科技 / Welcome to tecdat原文出处:

R语言HAR和HEAVY模型分析高频金融数据波动率高频数据的处理


在本节中,我们讨论高频金融数据处理中两个非常常见的步骤:(i)清理和(ii)数据聚合。



    > dim(dataraw);
    [1] 48484 7

    > tdata$report;

    initial number        no zero prices        select exchange
    48484        48479        20795

    sales condition merge same timestamp
    20135 9105
    > dim(afterfirstclean)
    [1] 9105 7

高频数据的汇总


通常不会在等间隔的时间点记录价格,而许多实际波动率衡量方法都依赖等实际间隔的收益。有几种方法可以将这些异步和/或不规则记录的序列同步为等距时间数据。
最受欢迎的方法是按照时间汇总,它通过获取每个网格点之前的最后价格来将价格强制为等距网格。

    > # 加载样本价格数据

    > data("sample");

    > # 聚合到5分钟的采样频率:


    > head(tsagg5min);
    PRICE
    2008-01-04 09:35:00 193.920
    2008-01-04 09:40:00 194.630
    2008-01-04 09:45:00 193.520
    2008-01-04 09:50:00 192.850
    2008-01-04 09:55:00 190.795
    2008-01-04 10:00:00 190.420
    > # 聚合到30秒的频率:

    > tail(tsagg30sec);
    PRICE
    2008-01-04 15:57:30 191.790
    2008-01-04 15:58:00 191.740
    2008-01-04 15:58:30 191.760
    2008-01-04 15:59:00 191.470
    2008-01-04 15:59:30 191.825
    2008-01-04 16:00:00 191.670

在上面的示例中,价格被强制设置为5分钟和30秒的等距时间网格。此外,aggregates函数内置于所有已实现的度量中,可以通过设置参数align.by和align.period来调用该函数。在这种情况下,首先将价格强制等间隔的常规时间网格,然后根据这些常规时间段内执行观察值的收益率来计算实际度量。这样做的优点是,用户可以将原始价格序列输入到实际度量中,而不必担心价格序列的异步性或不规则性。
带有时间和波动率计算的价格示例:


    > #我们假设stock1和stock2包含虚拟股票的价格数据:

    > #汇总到一分钟:


    > Price_1min = cbind(aggregatePrice(stock1),aggregatePrice(stock2));
    > #刷新时间聚合:

    refreshTime(list(stock1,stock2));
    > #计算跳跃鲁棒的波动性指标

    > #基于同步数据
    rBPCov(Price_1min,makeReturns=TRUE);
    > #计算跳跃和噪声鲁棒的波动性度量

    > #基于非同步数据:

实际波动性度量

高频数据的可用性使研究人员能够根据日内收益的平方来估计实际波动性(Andersen等,2003)。实际上,单变量波动率估计的主要挑战是应对(i)价格的上涨和(ii)微观结构噪声。因此多变量波动率估计也引起了人们的注意。高频软件包实施了许多新近提出的实际波动率方法。

下面的示例代码说明了日内周期的估计:


    > #计算并绘制日内周期


    > head(out);
                                       returns        vol        dailyvol periodicvol
    2005-03-04 09:35:00 -0.0010966963 0.004081072 0.001896816        2.151539
    2005-03-04 09:40:00 -0.0005614217 0.003695715 0.001896816        1.948379
    2005-03-04 09:45:00 -0.0026443880 0.003417950 0.001896816        1.801941




波动性预测


学术研究人员普遍认为,如果进行适当的管理,对高频数据的访问将带来优势,可以更好地预测未来价格变化的波动性。早在2003年Fleming等人(2003年)估计,投资者将愿意每年支付50到200个点,来预测投资组合绩效的收益,这是通过使用高频收益率而不是每日收益率来进行波动率预测的。
尽管HAR和HEAVY模型的目标相同,即对条件波动率进行建模,但它们采用的方法不同。HAR模型专注于预测收盘价变化。HAR模型的主要优点是,它易于估计(因为它本质上是一种可以用最小二乘方估计的线性模型), HEAVY模型的主要优点在于,它可以模拟收盘价和收盘价的条件方差。此外,HEAVY模型具有动量和均值回归效应。与HAR模型相反,HEAVY模型的估计是通过正态分布的最大似然来完成的。接下来的本文更详细地介绍HAR模型和HEAVY模型,当然还要讨论并说明如何使用高频收益率来估计这些模型。

HAR模型

示例


将HARRV模型拟合到道琼斯工业指数,我们加载每日实际波动率。

    > #每天获取样本实际波动率数据
    > DJI_RV = realized$DJI; #选择 DJI
    > DJI_RV = DJI_RV[!is.na(DJI_RV)]; #删除缺失值


第二步,我们计算传统的异构自回归(HAR)模型。由于HAR模型只是线性模型的一种特殊类型,因此也可以通过以下方式实现:harModel函数的输出是lm的子级harModel lm,线性模型的标准类。图绘制了harModel函数的输出对象,水平轴上有时间,在垂直轴上有观察到的实际波动率和预测的实际波动率(此分析是在样本中进行的,但是模型的估计系数可以显然用于样本外预测)。从图的检查中可以清楚地看出,harModel可以相对快速地拟合波动水平的变化,


    [1] "harModel" "lm"
    > x;
    Model:
    RV1 = beta0 + beta1 * RV1 + beta2 * RV5 + beta3 * RV22
    Coefficients:

    beta0        beta1
    4.432e-05        1.586e-01


    r.squared        adj.r.squared
    0.4679        0.4608
    > summary(x);
    Call:
    "RV1 = beta0        +        beta1 * RV1 +        beta2 * RV5 +        beta3 * RV22"
    Residuals:
    Min        1Q        Median        3Q        Max
    -0.0017683 -0.0000626 -0.0000427 -0.0000087        0.0044331

    Coefficients:
    Estimate Std. Error t value Pr(>|t|)
    beta0 4.432e-05 3.695e-05 1.200 0.2315
    beta1 1.586e-01 8.089e-02 1.960 0.0512 .
    beta2 6.213e-01 1.362e-01 4.560 8.36e-06 ***
    beta3 8.721e-02 1.217e-01 0.716 0.4745
    ---
    Signif. codes: 0 ^a A¨ Y***^a A Z 0.001 ^a A¨ Y**^a A Z 0.01 ^a A¨ Y*^a A Z 0.05 ^a A¨ Y.^a A Z 0.1 ^a A¨ Y ^a A Z 1
    Residual standard error: 0.0004344 on 227 degrees of freedom
    Multiple R-squared: 0.4679, Adjusted R-squared: 0.4608
    F-statistic: 66.53 on 3 and 227 DF, p-value: < 2.2e-16




HARRVCJ模型拟合

估计harModel的更复杂版本。例如,在Andersen等人中讨论的HARRVCJ模型。可以使用示例数据集估算,如下所示:


    > data = makeReturns(data); #获取高频收益数据


    > x
    Model:

    sqrt(RV1) = beta0 + beta1 * sqrt(C1) + beta2 * sqrt(C5) + beta3 * sqrt(C10)
    + beta4 * sqrt(J1) + beta5 * sqrt(J5) + beta6 * sqrt(J10)

    Coefficients:
    beta0        beta1        beta2        beta3        beta4        beta5
    -0.8835        1.1957        -25.1922        38.9909        -0.4483        0.8084
    beta6
    -6.8305
    r.squared        adj.r.squared
    0.9915        0.9661


最后一个示例是仅将日内收益作为输入就可以估算的一种特殊类型HAR模型。
HEAVY模型

将HEAVY模型拟合到道琼斯工业平均指数。第一步,我们加载道琼斯工业平均指数。然后,我们从该库中选择每日收益和每日实际核估计(Barndorff-Nielsen等,2004)。现在,作为HeavyModel输入的数据矩阵的第一列为收益率,第二列为Realized Kernel估计值。我们进一步将参数设置为采样期内日收益率和平均实际核估计方差。现在,我们来估算HEAVY模型。根据模型的输出,图绘制了由模型中的第二个方程式估算的条件方差。

    > # heavy模型在DJI上的实现:
    > returns = returns[!is.na(rk)]; rk = rk[!is.na(rk)]; # 删除NA
    > startvalues = c(0.004,0.02,0.44,0.41,0.74,0.56); #初始值

    > output$estparams
    [,1]
    omega1 0.01750506
    omega2 0.06182249
    alpha1 0.45118753
    alpha2 0.41204541
    beta1 0.73834594
    beta2 0.56367558




流动性

交易量和价格

交易量和价格通常作为单独的数据对象提供。对于许多与交易数据有关的研究和实际问题,需要合并交易量和价格。由于交易量和价格可能会收到不同的报告滞后影响,因此这不是一个简单的操作(Leeand Ready 1991)。函数matchTradesQuotes可用于匹配交易量和价格。根据Vergote(2005)的研究,我们将价格设置为2秒作为默认值。
流动性衡量

可以使用函数tqLiquidity根据匹配的交易量和价格数据计算流动性指标。表中计算了主要实现的流动性衡量指标,并且可以用作函数tqLiquidity的参数。
以下示例说明了如何:(i)匹配交易和报价,(ii)获取交易方向,以及(iii)计算流动性衡量指标。

    > #加载数据样本

    > #匹配交易量和价格数据

    > tqdata = matchTradesQuotes(tdata,qdata);
    > #在tqdata中显示信息

    > colnames(tqdata)[1:6];
    [1] "SYMBOL" "EX" "PRICE" "SIZE" "COND" "CORR"

    > #根据Lee-Ready规则推断的交易方向


    > #计算有效价差
    > es = tqLiquidity(tqdata,type="es");





最受欢迎的见解
1.HAR-RV-J与递归神经网络(RNN)混合模型预测和交易大型股票指数的高频波动率
2.WinBUGS对多元随机波动率模型:贝叶斯估计与模型比较
3.波动率的实现:ARCH模型与HAR-RV模型
4.R语言ARMA-EGARCH模型、集成预测算法对SPX实际波动率进行预测
5.使用R语言随机波动模型SV处理时间序列中的随机波动率
6.R语言多元COPULA GARCH 模型时间序列预测
7.R语言基于ARMA-GARCH过程的VAR拟合和预测
8.R语言随机搜索变量选择SSVS估计贝叶斯向量自回归(BVAR)模型
9.R语言对S&P500股票指数进行ARIMA + GARCH交易策略
例子2

原文

http://tecdat.cn/?p=4092背景

在传统的金融理论中,理性和同质的投资者是核心假设之一,表明每个投资者都有相同的信息,从而做出同样的决定。然而,投资者显然是不均衡的,信息的不对称在股市中很普遍。当知情投资者优先考虑某种类型的资产时,该类资产可能包含更多隐含信息。
期权市场是知情投资者可能更积极参与的市场之一,正如布莱克在1975年提出的那样,让投资者倾向于以较高的杠杆率而非股票本身交易股票衍生品以获得更多利益,因此期权市场可以包含更多信息。提取这些额外信息的一种方法是仔细研究波动性假笑。
波动性 是我们都熟悉的,Pan(2002)的一个主流理论指出,假笑的主要原因是投资者厌恶跳跃风险引起的风险溢价,尤其是OTM看跌期权的情况。该文假设知情的交易者认识到跳跃风险,对OTM看跌期权的需求越多,跳跃风险溢价就越高。因此,我们定义
波动率偏差= OTM认沽期权隐含波动率 -  ATM看涨期权隐含波动率,
我们在这里验证指数期权波动率偏差是未来指数收益的一个很好的指标。
美国市场

对于美国市场的实证研究,本文使用SPX期权,这是一种现金结算的欧式期权。从学术数据库OptionMetrics中检索2006-2012的选项数据。




我们可能会注意到一些隐含波动率数据被遗漏。这可以通过看涨期权价格的下限来解释。当标的资产具有0波动率时,期权价格达到其下限。当实际价格低于下限时,会出现负的隐含波动率,因此我们将其视为错过。



在确定要考虑哪个ATM认购期权合约时,我们选择期权合约,其中执行价格/底层价格的比率最接近1.要选择OTM认沽期权合约,我们首先筛选出合约0.9 <执行价格/底层证券价格<0.95,然后取其执行价格/基础比率最接近0.92的那个。此外,我的多个合同可能满足条件,我们只选择成熟期为30-60天的合同。期限过短的期权往往会出现更加波动的价格波动,期限过长的期权数量很少,无法反映知情交易。本文使用每周平均隐含波动率来检查,从周三到下周二。这个过程在Python中完成,如下面的代码所做的那样。

    import pandas as pd

    import numpy as np

    #read H5S data

    #pd.read_excel('SPXOption.xlsx').to_hdf('SPXOption.h5s','data')



    ImpliedV=ImpliedV1.append(ImpliedV2)

    del ImpliedV1,ImpliedV2

    ImpliedV['Expiration']=todatetime(ImpliedV['Expiration'])

    #ImpliedV=pd.read_excel("D:\USData\SPXOption.xlsx")

    All_Date=pd.Series(ImpliedV.groupby('Date').groups)

    SP500=pd.read_excel('D:\USData\SP500.xlsx').iloc[:,0]

    Call_Data=pd.Series(0.0,index=todatetime(All_Date),name='Call_Data')



    #Select given date

    All_Options=ImpliedV[ImpliedV['Date']==All_Date[ii]]

    All_Options.loc[:,'Maturity']=(All_Options['Expiration']-Today).dt.days

       #Select maturity

       #Select type & strike price

       Options_Selected_C=Date_Selected_Options[Date_Selected_Options['Type']=="C"]

       Options_Selected_C.sort_values(['StrikePrice'],inplace=True)

       Options_Selected_P=Date_Selected_Options[Date_Selected_Options['Type']=="P"]

       Options_Selected_P.loc[:,'StrikePrice']=abs(Options_Selected_P['StrikePrice']/SP500.iloc[ii]-0.92)

       Put_Data[ii]=Options_Selected_P.iloc[0,4]



    SP500.index=Put_Data.index

    SP500=SP500.resample('W-TUE').first()

    SP500=(SP500-SP500.shift(1))/SP500.shift(1)

    Final_Data['Skew']=Final_Data['Put_Data']-Final_Data['Call_Data']

    Final_Data.to_csv('Final_US.csv')

考虑到人们普遍承认该指数具有动量效应,我们在STATA中运行以下回归:
Index_Return [t + 3] =β_0+β_1* Volatility_skew [t] +β_2* Last6M_Index_Return [t] + e
显然,索引返回数据集具有异方差性和自相关特性。运行Newey-West回归数据来调整异方差性和自相关性。




从变量Volatility_skew的参数为负的结果,这成功地证明了我们的假设
中国市场

对于中国市场,我们使用SH50ETF期权,这是唯一的交易所交易期权合约。由于中国市场的动量效应与美国市场不同,我们采用尝试和误差方法 - 我们尝试将过去5,10和15个月的指数返回数据作为自变量之一。结果如下:










但是,在中国市场,期权价格并未包含知情交易者的信息。我个人认为,由于严厉的监管以限制2015年8月股市崩盘后的未平仓合约,这一点很大。SH50ETF刚刚于2015年2月上市,在每周频率的情况下没有足够的数据供研究。
交易策略

我们使用从SPX期权波动率假笑中提取的信息制定了交易策略。当市场周二收盘时,我们计算每周平均波动率偏差,以及过去6个月的指数收益率。什么时候
β_0+β_1* Volatility_skew [t] +β_2* Last6M_Index_Return [t]> 0
我们在第三周看跌S&P500期货。从回归我们知道β_0=0.0016688β_1=-0.0048342β_2= 0.1152003。该策略是用Python编写的:

# -*- coding: utf-8 -*-Final_Data=pd.read_csv(r'D:\USData\Final_US.csv',index_col=0)TestData=deepcopy(Final_Data)Direction=pd.Series(0.0,index=range(0,len(TestData.index)))TestData.dropna(axis=0,inplace=True)for ii in range(0,270):   Direction[ii]=-.0048342*TestData.iloc[ii,0]+.1152003*TestData.iloc[ii,2]+.0016688       Total[ii+1]=Total[ii]*(1-TestData.iloc[ii,1])

# -*- coding: utf-8 -*-Final_Data=pd.read_csv(r'D:\USData\Final_US.csv',index_col=0)TestData=deepcopy(Final_Data)Direction=pd.Series(0.0,index=range(0,len(TestData.index)))TestData.dropna(axis=0,inplace=True)for ii in range(0,270):   Direction[ii]=-.0048342*TestData.iloc[ii,0]+.1152003*TestData.iloc[ii,2]+.0016688       Total[ii+1]=Total[ii]*(1-TestData.iloc[ii,1])

如果我们使用此策略进行交易,这是一个净值图表




很明显,这一战略是一个成功的战略,并且在2008年的股市崩盘中也取得了成功。



有问题欢迎联系我们!
https://didattica.unibocconi.it/mypage/dwload.php?nomefile=Lec_2_Forecasting_stock_returns_part_120200217131222.pdf
Does Anything Beat 5-Minute RV?
https://public.econ.duke.edu/~ap172/Patton_realized_measures_pres_oct12a.pdf  
https://www.economics.ox.ac.uk/materials/papers/12626/paper645.pdf
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

下载期权论坛手机APP