5.2.1. Volatility

Mục đích: Dùng để tính độ biến động (volatility) thực tế đã xảy ra của một chuỗi giá tài sản, theo kiểu rolling (trượt) và được chuẩn hóa theo năm (annualized).

Cấu trúc hàm: volatility(x, w=, returns_type=Returns.SIMPLE)

Tham số:

Tham số
Kiểu dữ liệu
Ý nghĩa

x

Series

Chuỗi giá theo thời gian (Time series of prices).

w

Window / int / str

Kích thước cửa sổ trượt (rolling window): – Ví dụ: Window(22, 10) là tính trên cửa sổ 22 phiên, bỏ qua 10 phiên đầu để "ramp-up". – Có thể dùng kiểu chuỗi "1m" (1 tháng), "10d" (10 ngày)... – Nếu không chỉ rõ, hàm tính trên toàn bộ chuỗi.

returns_type

Returns

Kiểu lợi suất cần dùng: – Returns.SIMPLE: lợi suất đơn giản Rt=XtXt11R_t = \frac{X_t}{X_{t - 1}} - 1Returns.LOGARITHMIC: lợi suất log tự nhiên Rt=log(Xt)log(Xt1)R_t = \log({X_t}) - \log({X_{t - 1}})Returns.ABSOLUTE: thay đổi tuyệt đối Rt=XtXt1R_t = X_t - X_{t - 1}

Ý nghĩa kết quả: Hàm trả về một chuỗi Series – biểu diễn độ biến động hàng năm (annualized volatility) của giá tài sản qua các cửa sổ thời gian đã chỉ định.

Công thức tính:

Yt=1N1i=tw+1t(RiR)2252100Y_t = \sqrt{\frac{1}{N - 1}\sum_{i=t-w+1}^t(R_i - \overline{R})^2} * \sqrt{252} * 100

Trong đó:

  • RiR_i là lợi suất tại thời điểm ii (dựa trên returns_type).

  • R\overline{R} là trung bình lợi suất trong cửa sổ ww.

  • Nhân với 252\sqrt{252} để annualize (giả định 252 ngày giao dịch trong năm).

  • Nhân với 100 để ra dạng phần trăm (%).

Ví dụ mẫu tính rolling volatility với cửa sổ 22 phiên cho mã cổ phiếu HPG trên tập dữ liệu 1 năm (25/06/2024 - 25/06/2025).

from FiinQuantX import FiinSession
from FiinQuantX.timeseries.econometrics import volatility
from FiinQuantX.timeseries.helper import Window
from datetime import datetime
from dateutil.relativedelta import relativedelta

username = "REPLACE_WITH_YOUR_USERNAME"
password = "REPLACE_WITH_YOUR_PASSWORD"

client = FiinSession(
    username=username,
    password=password
).login()

# Lấy dữ liệu giá đóng cửa 1 năm EOD của HPG
data = client.Fetch_Trading_Data(
    realtime=False,
    tickers=["HPG"],
    fields=["close"],
    adjusted=True,
    by="1d",
    from_date=(datetime.now() - relativedelta(years=1)).strftime("%Y-%m-%d")
).get_data()

data["timestamp"] = pd.to_datetime(data["timestamp"])
data.set_index("timestamp", inplace=True)
data["vol_series_rampup"] = volatility(data["close"], w=Window(10, 5))
print(data)

Kết quả trả về:

timestamp     ticker      close  vol_series_rampup
2024-06-26    HPG     24082.370                NaN
2024-06-27    HPG     24040.705                NaN
2024-06-28    HPG     23582.390                NaN
2024-07-01    HPG     23624.055                NaN
2024-07-02    HPG     23915.710                NaN
...           ...           ...                ...
2025-06-20    HPG     22499.100          19.390249
2025-06-23    HPG     22374.105          19.581153
2025-06-24    HPG     22499.100          19.349245
2025-06-25    HPG     22665.760          19.047278
2025-06-26    HPG     22800.000          14.427419

Biểu đồ minh họa (tuỳ chọn)

import matplotlib.pyplot as plt

# Biểu đồ với 2 trục y
fig, ax1 = plt.subplots(figsize=(12, 5))

# Trục y bên trái: giá
ax1.plot(data.index, data['close'], label='Giá đóng cửa', color='blue')
ax1.set_ylabel('Giá cổ phiếu', color='blue')
ax1.tick_params(axis='y', labelcolor='blue')

# Trục y bên phải: volatility
ax2 = ax1.twinx()
ax2.plot(data["vol_series_rampup"].index, data["vol_series_rampup"], label='Volatility (10 phiên)', color='red')
ax2.set_ylabel('Volatility (% annualized)', color='red')
ax2.tick_params(axis='y', labelcolor='red')

# Hoàn thiện biểu đồ
plt.title('Giá HPG và Volatility tính theo rolling 10 phiên')
fig.tight_layout()
plt.grid(True)
plt.show()

Last updated