什么是Realised Volatility

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


Realised Volatility 是为了测算总的波动量.

其中r是短期收益率,

Δ表示的是区隔, 即, 我应当每个tick计算一个r, 还是每10min计算一次r.


之所以计算Realised Volatility, 是因为我们真实关心的是Intergrated Volatility, 计算方法理论上是

可由于的不可观测性, 转而用RV来进行替代.


这样一来, 我们计算的RV和IV的关系就应该是

其中是一个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)