什么是Realised Volatility

2019-03-07  本文已影响0人  DCmf9w7Fnfm

# 本文内容相关论文
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')

上一篇下一篇

猜你喜欢

热点阅读