美文网首页
什么是Realised Volatility

什么是Realised Volatility

作者: DCmf9w7Fnfm | 来源:发表于2019-03-07 05:59 被阅读0次

    # 本文内容相关论文
    Bollerslev, T., Patton, A. and Quaedvlieg, R. (2019). Exploiting the errors: A simple approach for improved volatility forecasting.


    Realised Volatility 是为了测算总的波动量.
    RV_{t}=\sum_{i=1}^{M}r_{t,i}^{2}.

    其中r是短期收益率,
    r_{t,i}=log(P_{t-1+iΔ})-log(P_{t-1+(i-1)Δ}).
    Δ表示的是区隔, 即, 我应当每个tick计算一个r, 还是每10min计算一次r.


    之所以计算Realised Volatility, 是因为我们真实关心的是Intergrated Volatility, 计算方法理论上是
    IV_{t}=\int_{t-1}^{t}δ_{s}^{2}ds
    可由于δ^2的不可观测性, 转而用RV来进行替代.


    这样一来, 我们计算的RV和IV的关系就应该是
    RV_{t}=IV_{t}+η_{t}, η_{t}~MN(0, 2Δ$IQ_{t})
    其中η_t是一个IV在体现为RV时的随机扰动, 由于理论上RV此时为两个遵循正态分布的变量集合, 所以就呈现出了MN(Mixed Normal)分布

    其Python实现

    import numpy as np
    import pandas as pd
    import datetime
    import calendar
    import math
    
    # set the M here
    M_interval = 3600
    
    tickData = pd.read_csv("DataSource/Sample.csv", names=['TimeStamp', 'Price', 'Quantity'])
    tickData['Date'] = pd.to_datetime(tickData['TimeStamp'], unit='s').dt.date
    
    incomplete_first_day_removal = tickData.loc[tickData["Date"] == tickData.iloc[0]["Date"]]
    tickData = tickData.drop(incomplete_first_day_removal.index)
    incomplete_last_day_removal = tickData.loc[tickData["Date"] == tickData.iloc[-1]["Date"]]
    tickData = tickData.drop(incomplete_last_day_removal.index)
    
    first_day_unix = calendar.timegm((datetime.datetime.strptime(str(tickData.iloc[0]["Date"]), "%Y-%m-%d").timetuple()))
    last_day_unix = calendar.timegm((datetime.datetime.strptime(str(tickData.iloc[-1]["Date"]), "%Y-%m-%d").timetuple()))
    
    daily_loop_unix_stamp = first_day_unix
    loop_unix_stamp = daily_loop_unix_stamp
    RV_dataframe = pd.DataFrame(columns=["TimeStamp", "RV"])
    
    i = 0
    while loop_unix_stamp <= last_day_unix:
        RV_daily = 0
        while loop_unix_stamp <= daily_loop_unix_stamp + 86400:
            condition_1 = tickData["TimeStamp"] < loop_unix_stamp + M_interval
            condition_2 = tickData["TimeStamp"] > loop_unix_stamp
            try:
                p_later = tickData[condition_1 & condition_2].iloc[-1]["Price"]
                p_former = tickData[condition_1 & condition_2].iloc[0]["Price"]
                r = math.log(p_later/p_former)
            except IndexError:
                r = 0
            RV_daily = RV_daily + np.square(r)
            loop_unix_stamp = loop_unix_stamp + M_interval
        RV_dataframe.loc[i] = [daily_loop_unix_stamp, RV_daily]
        i = i + 1
        daily_loop_unix_stamp = daily_loop_unix_stamp + 86400
        loop_unix_stamp = daily_loop_unix_stamp
    
    RV_dataframe.to_csv('outcome.csv')
    
    

    相关文章

      网友评论

          本文标题:什么是Realised Volatility

          本文链接:https://www.haomeiwen.com/subject/igcqpqtx.html