# 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ố:

<table><thead><tr><th width="85">Tham số</th><th width="104">Kiểu dữ liệu</th><th>Ý nghĩa</th></tr></thead><tbody><tr><td>x</td><td>Series</td><td>Chuỗi giá theo thời gian (Time series of prices).</td></tr><tr><td>w</td><td>Window / int / str</td><td>Kích thước cửa sổ trượt (rolling window):<br>– Ví dụ: <code>Window(22, 10)</code> là tính trên cửa sổ 22 phiên, bỏ qua 10 phiên đầu để "ramp-up".<br>– Có thể dùng kiểu chuỗi <code>"1m"</code> (1 tháng), <code>"10d"</code> (10 ngày)...<br>– Nếu không chỉ rõ, hàm tính trên toàn bộ chuỗi.</td></tr><tr><td>returns_type</td><td>Returns</td><td>Kiểu lợi suất cần dùng:<br>– <code>Returns.SIMPLE</code>: lợi suất đơn giản <span class="math">R_t = \frac{X_t}{X_{t - 1}} - 1</span><br>– <code>Returns.LOGARITHMIC</code>: lợi suất log tự nhiên <span class="math">R_t = \log({X_t}) - \log({X_{t - 1}})</span><br>– <code>Returns.ABSOLUTE</code>: thay đổi tuyệt đối <span class="math">R_t = X_t - X_{t - 1}</span></td></tr></tbody></table>

Ý 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:

$$
Y\_t = \sqrt{\frac{1}{N - 1}\sum\_{i=t-w+1}^t(R\_i - \overline{R})^2} \* \sqrt{252} \* 100
$$

Trong đó:

* $$R\_i$$ là lợi suất tại thời điểm $$i$$ (dựa trên `returns_type`).
* $$\overline{R}$$ là trung bình lợi suất trong cửa sổ $$w$$.
* Nhân với $$\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).

```python
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ề:

<pre><code><strong>timestamp     ticker      close  vol_series_rampup
</strong>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
</code></pre>

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

```python
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()
```

<figure><img src="https://3318188420-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fkme4XYjWbuM3iRJzUu9r%2Fuploads%2FjlAMAnHlERG2OAbpVbCM%2Fimage.png?alt=media&#x26;token=321ed2bc-095a-482d-90fa-ae7163713e19" alt=""><figcaption></figcaption></figure>
