Skip to content

Mapirlet/Realized-Quantiles

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

4 Commits
 
 
 
 
 
 
 
 

Repository files navigation

Realized Quantiles

License: MIT Python 3.11+ Development Status

A Python implementation of the Realized Quantiles methodology for high-frequency financial data analysis, based on the work of Dimitriadis & Halbleib (2022).

Overview

This package provides tools for computing tail risk measures (Value-at-Risk and Expected Shortfall) from high-frequency trading data using intrinsic-time sampling schemes. It enables more accurate risk forecasting by accounting for the time-varying nature of financial markets.

Key Features

  • Multiple Intrinsic-Time Sampling Schemes:

    • CTS (Constant Time Sampling): Traditional calendar-time sampling
    • TickTS (Tick Time Sampling): Based on transaction counts
    • TTS (Time Transformation Sampling): Based on average intraday transaction patterns
    • BTS (Business Time Sampling): Volatility-based sampling using tripower variation
  • Realized Risk Measures:

    • Realized Quantiles (RQ): high-frequency VaR estimates
    • Realized Expected Shortfall (RES): high-frequency ES estimates
  • Forecasting & Evaluation:

    • HAR (Heterogeneous AutoRegressive) models for RQ/RES forecasting
    • Proper scoring rules (Fissler-Ziegel) for forecast evaluation
    • Coverage testing and model comparison

Installation

From source

git clone https://github.com/Mapirlet/Realized-Quantiles.git
cd Realized-Quantiles
pip install -e .

Requirements

  • Python >= 3.11
  • pandas >= 2.2.0
  • numpy >= 2.0.0
  • scipy >= 1.13.0
  • arch >= 7.2.0 (for HAR models)
  • statsmodels >= 0.14.0
  • matplotlib >= 3.9.0
  • tqdm >= 4.67.0

Quick Start

1. Load High-Frequency Data

import realized_quantiles as rq

# Load stock data from CSV files
data = rq.load_stock_data("AAPL")

Expected data format: CSV files with columns Dates, Time, Price

2. Build Intensity Measures

# Choose a sampling scheme: "CTS", "TickTS", "TTS", or "BTS"
intensity = rq.build_intensity(
    data=data,
    scheme="BTS",
    frequency_seconds=1
)

3. Resample to Intrinsic Time

# Resample trades based on the intensity measure
resampled_data, cumulative_intensity = rq.batch_resample(
    data=data,
    intensities=intensity,
    n_trades=390  # Number of observations per day
)

4. Compute Realized Quantiles & Expected Shortfall

from realized_quantiles.returns import compute_intraday_returns

# Compute intraday returns
intraday_returns = compute_intraday_returns(resampled_data)

# Compute empirical VaR and ES
var_es = rq.compute_daily_var_es(
    intraday_returns,
    prob_levels=[0.01, 0.025, 0.05]  # 1%, 2.5%, 5% risk levels
)

# Scale to daily Realized Quantiles and Realized ES
rq_res = rq.compute_daily_realized_var_es(
    var_es,
    scaling_index_H=0.5,  # Hurst exponent (0.5 for Brownian motion)
    c=390  # Number of intraday observations
)

5. Forecast with HAR Models

# Rolling forecast using Heterogeneous AutoRegressive models
forecasts = rq.rolling_forecast_HAR(
    series=rq_res,
    window_size=252,  # 1 year of trading days
    forecast_horizon=1,  # 1-day ahead
    har_lags=[1, 5, 22]  # Daily, weekly, monthly lags
)

6. Evaluate Forecasts

from realized_quantiles.returns import calculate_daily_log_returns

# Compute actual daily returns
daily_returns = calculate_daily_log_returns(data)

# Calculate average asymmetric VaR scores
var_scores = rq.calculate_average_asymmetric_var_scores(
    actual_returns=daily_returns,
    forecasted_data=forecasts,
    probability_levels=[0.01, 0.025, 0.05]
)

# Calculate joint VaR-ES scores (Fissler-Ziegel)
joint_scores = rq.calculate_average_svares_scores(
    actual_returns=daily_returns,
    forecasted_data=forecasts,
    probability_levels=[0.01, 0.025, 0.05]
)

print(var_scores)
print(joint_scores)

Package Structure

realized_quantiles/
├── __init__.py           # Main package interface
├── config.py             # Configuration (trading hours, paths)
├── data_loader.py        # Load high-frequency data
├── intensity.py          # Build intensity measures (CTS/TickTS/TTS/BTS)
├── sampling.py           # Resample to intrinsic time
├── returns.py            # Compute log returns (intraday & daily)
├── tail_risk.py          # Compute RQ, RES, volatility measures
├── forecasting.py        # HAR forecasting models
├── scoring.py            # Forecast evaluation (scoring rules, coverage)
└── dma.py                # DMA estimator for Hurst exponent (diagnostics)

Methodology

This implementation follows the methodology from:

Dimitriadis, T., & Halbleib, R. (2022). Realized Quantiles.

Intrinsic Time Sampling

Traditional risk measures computed on calendar-time data may miss important intraday dynamics. This package implements intrinsic-time sampling schemes that adapt to market activity:

  1. CTS: Uniform sampling (baseline)
  2. TickTS: Sample proportionally to transaction counts
  3. TTS: Sample based on average historical transaction patterns
  4. BTS: Sample based on realized volatility (tripower variation)

Realized Quantiles

Realized Quantiles are obtained by:

  1. Resampling tick data to intrinsic time
  2. Computing empirical quantiles from intraday returns
  3. Scaling to daily horizon using the Hurst exponent

This provides more robust tail risk estimates than traditional approaches.

Use Cases

  • Risk Management: Compute more accurate VaR and ES for trading portfolios
  • Regulatory Compliance: Meet Basel III/IV capital requirements with better risk estimates
  • Academic Research: Study tail risk dynamics in high-frequency financial data
  • Trading Strategy Development: Incorporate intrinsic-time risk measures into quantitative strategies

Configuration

Edit realized_quantiles/config.py to customize:

TRADING_START = 34200  # Market open (9:30 AM in seconds since midnight)
TRADING_END = 57600    # Market close (4:00 PM in seconds since midnight)
PATH_DATA = "./data"   # Path to your high-frequency data

Data Format

Your CSV files should contain at minimum:

Column Type Description
Dates datetime Trading date (YYYY-MM-DD)
Time int Seconds since midnight
Price float Trade price

Example:

Dates,Time,Price
2024-01-02,34200,150.25
2024-01-02,34201,150.26
2024-01-02,34203,150.24
...

Contributing

Contributions are welcome! Please feel free to submit a Pull Request.

  1. Fork the repository
  2. Create your feature branch (git checkout -b feature/AmazingFeature)
  3. Commit your changes (git commit -m 'Add some AmazingFeature')
  4. Push to the branch (git push origin feature/AmazingFeature)
  5. Open a Pull Request

License

This project is licensed under the MIT License - see the LICENSE file for details.

Citation

If you use this package in academic research, please cite:

@masterthesis{pirlet2025realized,
  author = {Pirlet, Matthias},
  title = {An empirical analysis of tail risk forecasting using realized quantiles},
  year = {2025},
  url = {https://github.com/Mapirlet/Realized-Quantiles},
  version = {0.1.0}
}

And the original methodology paper:

@article{dimitriadis2022realized,
  title={Realized Quantiles},
  author={Dimitriadis, Timo and Halbleib, Roxana},
  journal={Journal of the American Statistical Association},
  year={2022},
  publisher={Taylor \& Francis}
}

Support

Acknowledgments

This implementation is based on the methodology developed by Timo Dimitriadis and Roxana Halbleib. Special thanks to the authors for their work on realized quantiles and answers to my questions.

About

No description, website, or topics provided.

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors

Languages