chronos-volatility / README.md
karkar69's picture
Update README.md
13489ad verified
---
library_name: transformers
tags:
- finance
- volatility
- time-series
- forecasting
- chronos
- peft
- lora
base_model: amazon/chronos-t5-mini
license: apache-2.0
---
# chronos-volatility
## Model Description
A fine-tuned Chronos model for predicting stock market volatility.
This model predicts quantiles (q10, q50, q90) of log-realized variance
for a 20-day forward horizon using 60 days of historical squared returns.
This model is a fine-tuned version of [amazon/chronos-t5-mini](https://huggingface.co/amazon/chronos-t5-mini) using LoRA (Low-Rank Adaptation) for volatility prediction on stock market data.
## Model Architecture
- **Base Model**: amazon/chronos-t5-mini
- **Task**: Volatility Prediction (Quantile Regression)
- **Fine-tuning Method**: LoRA (Low-Rank Adaptation)
- **LoRA Config**: r=8, alpha=16, target_modules=["q", "k", "v", "o"]
- **Custom Heads**:
- Value Embedding: Linear(1 -> hidden_dim) for embedding raw time series values
- Quantile Head: Linear(hidden_dim -> 3) for predicting q10, q50, q90 quantiles
## Input Format
- **Input**: Single-channel time series of squared returns (shape: batch_size, seq_length=60)
- **Sequence Length**: 60 trading days
- **Preprocessing**: Input should be squared log returns: `(log(price_t / price_{t-1}))^2`
## Output Format
- **Output**: Quantiles in log-variance space (shape: batch_size, 3)
- Column 0: q10 (10th percentile)
- Column 1: q50 (50th percentile / median)
- Column 2: q90 (90th percentile)
To convert to annualized volatility:
```python
variance = np.exp(log_variance)
volatility = np.sqrt(variance) * np.sqrt(252) # Annualized
```
## Usage
### Loading the Model
```python
from src.models.chronos import ChronosVolatility
import torch
# Load model
model = ChronosVolatility(use_lora=True)
model.load_custom_heads("path/to/heads.pt")
model.base.load_adapter("path/to/adapter") # For PEFT adapter
# Or use from_pretrained (if properly saved):
# from peft import PeftModel
# base_model = AutoModelForSeq2SeqLM.from_pretrained("amazon/chronos-t5-mini")
# model.base = PeftModel.from_pretrained(base_model, "chronos-volatility")
# model.load_custom_heads("path/to/heads.pt")
```
### Making Predictions
```python
import numpy as np
# Prepare input: squared returns sequence (60 days)
input_seq = torch.FloatTensor(squared_returns).unsqueeze(0) # (1, 60)
# Get predictions
model.eval()
with torch.no_grad():
quantiles_log_var = model(input_seq) # (1, 3)
# Convert to volatility
quantiles_var = np.exp(quantiles_log_var.numpy())
quantiles_vol = np.sqrt(quantiles_var) * np.sqrt(252) # Annualized %
print(f"10th percentile: {quantiles_vol[0][0]:.2f}%")
print(f"Median: {quantiles_vol[0][1]:.2f}%")
print(f"90th percentile: {quantiles_vol[0][2]:.2f}%")
```
## Training Details
- Trained data from AAPL, GOOG, MSFT, SPY, and TSLA
- NVDA was used as a test case
## Limitations
- Trained on large-cap tech stocks, and will not generalize well to other markets or time periods.
- Predictions are probabilistic (quantiles) and should be interpreted with uncertainty
- The model requires at least 60 days of historical data for predictions